作者:小佡人 | 来源:互联网 | 2023-06-06 15:49
VBAforExcel(五)本文涉及的内容VBA中的输入输出合并某文件夹下所有工作簿思路授之以鱼不如授之以渔,看过之前两篇你大概会控制工作簿了,这篇直接教你一般遇到问题我们该怎么做
VBA for Excel (五)
本文涉及的内容
思路
授之以鱼不如授之以渔,看过之前两篇你大概会控制工作簿了,这篇直接教你一般遇到问题我们该怎么做。本片的核心是实现某文件夹下所有工作簿的合并。
我们需要按文件、表、区域的思路进行问题的拆解
![《VBA for Excel (五)》](https://img8.php1.cn/3cdc5/124f2/8fd/fff64c97e4ce7efc.png)
思路如上:程序的流程图如下
![《VBA for Excel (五)》](https://img8.php1.cn/3cdc5/124f2/8fd/4803c813f22c3e52.png)
遍历工作表语法,在二篇。语法如下:
For each object in objects
[statements]
[Exit For]
Next
遍历工作部需要用到for循环,由于不清楚具体多少个文件,需要吧endnum只设置到足够大,当最后一个时需要退出,需要用到:
For counter = startnum To endnum [Step step]
[statements]
[Exit For]
Next
'if语句
if condition then
statements
end if
遍历工作簿
接下来是匹配文件名需要用到Dir函数,语法如下
Dir("路径\"&"*.xls*")
*
是通配符,可以代表出换行外任意个字符,以上语法找出路径下所有后缀是xls打头的文件
还有一个?
代表出换行外一个字符。其他的建议了解一下VBA正则。回归正题
Dir可以不带参数,他会继承你上一次的参数,你用一次就够了,以后运行不带参数的会查到下一个文件名。关闭文件后Dir()指向下一个就可以循环遍历所有文件了。
具体思路如下
Fname = Dir(StrPath & "*.xls*")
For i = 1 To 999
Workbooks.open
Workbook.Close False
Fname = Dir()
If Fname = "" Then Exit For
Next
输入与输出
输入MsgBox (prompt, [ buttons, ] [ title, ] [ helpfile, context ])
部分 | 说明 |
---|
prompt | 对话框中显示的消息。 最大长度约为 1024 个字符,具体取决于所使用的字符的宽度。 |
buttons | 用于指定要显示按钮的数量和类型、要使用的图标样式、默认按钮的标识和消息框的形式的值之和。 如果省略,则 buttons 的默认值为 0。 |
title | 对话框标题栏中显示的字符串表达式。 如果省略 title,则标题栏中将显示应用程序名称。 |
button参数
vbOKOnly | 0 | 仅显示“确定”按钮。 |
---|
vbOKCancel | 1 | 显示“确定”和“取消”按钮。 |
vbAbortRetryIgnore | 2 | 显示“中止”、“重试”和“忽略”按钮。 |
vbYesNoCancel | 3 | 显示“是”、“否”和“取消”按钮。 |
vbYesNo | 4 | 显示“是”和“否”按钮。 |
vbRetryCancel | 5 | 显示“重试”和“取消”按钮。 |
vbCritical | 16 | 显示“关键消息”图标。 |
vbQuestion | 32 | 显示“警告查询”图标。 |
vbExclamation | 48 | 显示“警告消息”图标。 |
vbInformation | 64 | 显示“信息消息”图标。 |
vbDefaultButton1 | 0 | 第一个按钮是默认按钮。 |
vbDefaultButton2 | 256 | 第二个按钮是默认按钮。 |
vbDefaultButton3 | 512 | 第三个按钮是默认按钮。 |
vbApplicationModal | 0 | 应用程序模式;用户在继续在当前应用程序中工作前必须响应消息框。 |
vbSystemModal | 4096 | 系统模式;在用户响应消息框前,所有应用程序都挂起。 |
第一组值 (0-5) 表示对话框中显示的按钮的数量和类型;第二组值(16、32、48、64)表示图标样式;第三组值(0、256、512)用于确定默认按钮;第四组值(0、4096)用于确定消息框的形式。 添加数字以创建最终 buttons 参数值时,只是用每个组中的其中一个数值。
返回值
Constant | Value | Button |
---|
vbOK | 1 | OK |
vbCancel | 2 | Cancel |
vbAbort | 3 | Abort |
vbRetry | 4 | Retry |
vbIgnore | 5 | Ignore |
vbYes | 6 | Yes |
vbNo | 7 | No |
正好对应上面button参数第一组值的5种情况中内含的所有键值
MsgBox "File Save Error", _
vbAbortRetryIgnore+vbExclamation+vbDefaultButton2, "File Save Error"
MsgBox message, vbInformation
InputBox (Prompt, [Title], [Default], [Left], [Top], [HelpFile], [HelpContextID], [Type])
名称 | 说明 |
---|
Prompt | 要在对话框中显示的消息。最大长度为 255 个字符。 |
Title | 输入框的标题。默认:“输入”。 |
Default | 输入的默认值。 |
再写两个
inputbox "请输入内容","这个是标题","这个是默认值"
没有其他知识点了,希望你不看代码能根据思路和流程图敲出来加油。
一下是我的例子
Sub Join_Books()
Dim StrPath$, Fname$
Dim Twb As Workbook, Cwb As Workbook
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set Cwb = ActiveWorkbook
StrPath = InputBox("请输入路径") & "\"
If StrPath = "" Then Exit Sub
Fname = Dir(StrPath & "*.xls*")
For i = 1 To 999
Set Twb = Workbooks.Open(StrPath & Fname)
For Each sht In Twb.Sheets
If sht.Visible = xlSheetVisible Then
sht.Copy , Cwb.Sheets(Cwb.Sheets.Count)
End If
Next
Twb.Close False
Fname = Dir()
If Fname = "" Then Exit For
Next
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
不是按照上面思路来的直接贴的本人目前再用的版本,把一些函数补了补就贴过来了,自己再看看这个,看看能不能提供些新思路。
Sub Join_Books()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim sht As Worksheet
Dim Twb As Workbook, Cwb As Workbook
Set Cwb = ActiveWorkbook
File_name = Application.GetOpenFilename("Excel文件(*.xlsx;*.xls),*.xlsx;*.xls", , "选择文件", , True)
If TypeName(File_name) = "Boolean" Then Exit Sub
For i = 1 To UBound(File_name)
Set Twb = Workbooks.Open(File_name(i))
For Each sht In Twb.Sheets
If sht.Visible = xlSheetVisible Then
sht.Copy , Cwb.Sheets(Cwb.Sheets.Count)
End If
Next
Twb.Close False
Next
If Application.CountA(Sheets(1).UsedRange.Cells) = 0 Then Sheets(1).Delete
MsgBox "共合并" & i - 1 & "个文件,当前文件表共" & Sheets.Count & "张表"
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
这个例子没有用到区域,有些遗憾。不过用上也简单,具体参考上一篇,加上表和工作簿具体对象就行了。这篇完了VBA基础就没了。希望这五篇你有所收获,拜拜了您馁。