跟着王老师学Excel VBA #14 | VBA中的用户信息交互
概要
- MsgBox与InputBox
- 文件选择对话框GetOpenFilename
- 操作Excel中的所有对话框 Application.Dialogs
演示案例
- 设置弹出对话框的多种样式
- 设置弹出输入框的多种样式
- 弹出文件选取对话框 - 完成单表多文件合并
Notes
- VBA函数可以不用写“VBA.”,可直接写函数名 i.e. MsgBox是VBA函数,VBA.Interaction.MsgBox
- MsgBox(Prompt,[Buttons As VbMsgBoxStyle = vbOKOnly],[Title],[HelpFile],[Context]) As VbMsgBoxResult 多个参数间用“,”隔开,若无该参数,留空即可(需保留“,”) Prompt: 弹出对话框中显示的文字 VbMsgBoxStyle: 对话框的样式参数,多个参数间可使用“+”连接(4+48),也可直接写加法的计算值(52),注意选择参数要与Prompt参数的文字匹配,符合逻辑即可 Title: 类比窗体中的Caption HelpFile: 帮助文件的完整路径(CHM文件),需配合VbMsgBoxStyle中的“16384”使用,以显示帮助按钮 Context: 帮助文件的索引,写“0”是第一个
- InputBox(Promp,[Title],[Default],[XPos],[YPos],[HelpFile],[Context]) As String — InputBox函数 Default: 默认值(文本框里默认的文字显示) Xpos: X轴 | Ypos: Y轴 — 共同决定文本框的显示位置
- Application. InputBox(Prompt As String,[Title],[Default],[Left],[ToP],[HelpFile],[HelpContextID],[Type]) — InputBox方法 Type: 可指定用户输入的类型,可避免bug
- 8421码:任意两个相加无法等于第三个(方便计算) 8421码又称为BCD码,是十进制代码中最常用的一种。在这种编码方式中,每一位二值代码的“1”都代表一个固定数值。将每位“1”所代表的二进制数加起来就可以得到它所代表的十进制数字。因为代码中从左至右看每一位“1”分别代表数字“8”“4”“2”“1”,故得名8421码。其中每一位“1”代表的十进制数称为这一位的权。因为每位的权都是固定不变的,所以8421码是恒权码。
- Application. Dialogs().Show '括号内填写对话框对应的参数,真的执行操作
- GetOpenFilename 获取选择的文件的完整路径,并不真的打开选择的文件 GetOpenFilename([FileFilter],[FilterIndex],[Title],[ButtonText],[MultiSelect]) FileFilter: 定义文件类型 FilterIndex: 多文件类型显示时的优先级 Title: 对话框的名字 ButtonText: 按钮上显示的文字(此参数在windows系统下无效) MultiSelect: 是否可多选,True可多选,False不可多选
代码
'用户选取文件的壳子
Dim arr()
Dim wb As Workbook
arr = Application. GetOpenFilename("老表,*.xls,新表,*.xlsx",2,,,True)
If arr(1) <>"False" Then
For i = LBound(arr) To UBound(arr)
set wb = Workbooks. Open(arr(i)) '用arr记录文件名,第一个文件对应数组里的“1”
XXXXX '具体执行操作
wb. Close
Next
End If
DEMO-4 第10讲的多文件合并练习
from第10讲
'多文件合并(每张工作簿若干张工作表)
Dim str As String
Dim wb As Workbook
Dim sht As Worksheet
str = Dir("d:\data\*.xls*")
For i = 1 To 100
Set wb = Workbook.Open("d:\data\"&str)
For Each sht In wb.Sheets
sht.Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) '跨文件就需要带文件名,跨表就需要带表名
ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = split(wb.Name,".")(0) & sht.Name
Next
wb.Close
str = Dir
If str ="" Then
Exit For
End If
Next
'根据用户选取的多文件合并
Dim arr()
Dim wb As Workbook
Dim sht As Worksheet
arr = Application. GetOpenFilename("Excel文件,*.xls*",2,,,True)
If arr(1) <>"False" Then
For i = LBound(arr) To UBound(arr)
set wb = Workbooks. Open(arr(i)) '用arr记录文件名,第一个文件对应数组里的“1”
For Each sht In wb.Sheets
wb. Sht. Copy after:= ThisWorkbook. Sheets(ThisWorkbook. Sheets. Count)
ThisWorkbook. Sheets(ThisWorkbook. Sheets. Count). Name = split(wb.Name,".")(0) & sht. Name
Next
wb. Close
Next
End If
注意: 以上这段代码无法通过加载宏使用(因为出现ThisWorkbook)
如何修改成加载宏
Dim arr()
Dim wb,wb1 As Workbook
Dim sht As Worksheet
set wb1 = Workbooks. Add
arr = Application. GetOpenFilename("Excel文件,*.xls*",2,,,True)
If arr(1) <>"False" Then
For i = LBound(arr) To UBound(arr)
set wb = Workbooks. Open(arr(i)) '用arr记录文件名,第一个文件对应数组里的“1”
For Each sht In wb.Sheets
wb. Sht. Copy after:= wb1. Sheets(wb1. Sheets. Count)
wb1. Sheets(wb1. Sheets. Count). Name = split(wb.Name,".")(0) & sht. Name
Next
wb. Close
Next
End If