一、控件介绍
用户图形界面主要是控件设置和操作
窗体控件、ActiveX控件:
Office2013:在开发工具——插入 下
Office2003:在视图——工具栏——窗体 下
窗体控件说明:
标签:用于输入和显示静态文本
分组框:用于组合其他多个控件
按钮:用于执行宏命令
复选框:选中控件,可以多项选择
选项按钮:用于选择的控件,通常几个选项按钮用组合框组合在一起使用,在一组中只能同时选择一个选项按钮
列表框:显示多个选项列表,用户可以从中选择一个选项
组合框:提供可选择的多个选项,用户可以选择其中的一个项目
滚动条:包括水平滚动条和垂直滚动条
微调控件:通过单击控件的箭头来选择数值
窗体控件:
ActiveX控件:
二、窗体、ActiveX控件的使用
使用“组合框控件”,设置控件格式——控制:
设置数据源区域(用来显示下拉菜单的值)、单元格链接(即现在的下拉数据在数据区域第几个值,选中“女”则显示2,“男”则显示1)、下拉显示项目数(即下拉框显示列表数量)
插入ActiveX的“选项按钮”,通过“设计模式”,“查看代码”添加代码实现其逻辑。
Private Sub xb1_Click() If xb1.Value = True Then Range("F2").Value = "男" xb2.Value = False End If End Sub Private Sub xb2_Click() If xb2.Value = True Then '如果xb2被选中则执行如下逻辑 Range("F2").Value = "女" '在F2单元格里输入“女” xb1.Value = False '更改xb1为未选中状态 End If End Sub
三、InputBox函数、Application.InputBox方法
1、InputBox函数
InputBox(Prompt:="提示文字",Title:="对话框标题,可省略",Default:="文本框默认值,可省略",xpos:="左端距离",ypos:="顶端距离") str = InputBox(Prompt:="请输入姓名:", Title:="操作提示", Default:="张Dream", xpos:=2000, ypos:=2500) 也可以省略所有参数: str = InputBox("请输入姓名:", "操作提示", "张Dream", 2000, 2500) 除Prompt外,其他参数都可以省略 InputBox(Prompt:="提示文字",Title:="对话框标题,可省略",Default:="文本框默认值,可省略",xpos:="左端距离",ypos:="顶端距离") str = InputBox(Prompt:="请输入姓名:", Title:="操作提示", Default:="张Dream", xpos:=2000, ypos:=2500) 也可以省略所有参数: str = InputBox(Prompt:="请输入姓名:",, Default:="张三")
Sub InBox() Dim str As String '第一个参数prompt是对话框上的提示文字 '第二个参数Title是对话框的标题,如果省略,默认标题为“Microsoft Excel” '第三个参数Default是默认输入值,如果省略,则文本框中内容为空 '第四个参数xpos是对话框左端与屏幕左端的距离,如果省略,对话框的水平方向居中显示 '第五个参数ypos是对话框顶端与屏幕顶端的距离,如果省略,对话框将显示距离屏幕顶端约三分之一的位置 str = InputBox(Prompt:="请输入姓名:", Title:="操作提示", Default:="张Dream", xpos:=2000, ypos:=2500) Range("A1") = str '将输入的值写入A1单元格 End Sub
2、Application.InputBox方法
Sub AppInbox() Dim str As String str = Application.InputBox(prompt:="请输入姓名:", Title:="操作提示", Default:="五三", Left:=100, Top:=500) Range("A1") = str End Sub
3、InputBox函数、InputBox方法的区别
参数的差异:
InputBox(Prompt:="请输入姓名:", Title:="操作提示", Default:="张Dream", xpos:=2000, ypos:=2500)
Application.InputBox(prompt:="请输入姓名:", Title:="操作提示", Default:="五三", Left:=100, Top:=500)
InputBox函数只能返回一个String型的字符串,而InputBox方法返回的数据类型不确定,并且InputBox方法比InputBox函数多一个Type参数
Application.InputBox中Type参数说明
0:公式
1:数字:
2:文本
4:逻辑值(True或False)
8:单元格引用(Range对象)
16:错误值,如#N/A
64:数值数组
使用application.InputBox方法,返回Range对象
Option Explicit Sub RngInput() Dim rng As Range '定义一个Range对象 On Error GoTo cancel '如果单击“取消”按钮,出现错误,跳转到cancel处 Set rng = Application.InputBox(prompt:="请选择要输入的单元格区域", Type:=8) rng.Value = 100 '在选中的单元格输入100 cancel: End Sub
Application.InputBox方法返回复合类型
Application.InputBox(prompt:="请选择要输入的单元格区域", Type:=1 + 2) '1:数字,2:文本,1+2:数字或文本中任意一种 Application.InputBox(prompt:="请选择要输入的单元格区域", Type:=3) '与上面语句效果一样
四、MsgBox函数
1、参数语法
Sub msg() '第一个参数prompt时对话框中药显示的文本信息,时必选参数 '第二个参数Buttons指定对话框中显示的按钮数目、按钮形式、使用的图标样式、缺省按钮以及消息框的强制回应等。参数值时值(或常数)的综合,如果省略,缺省值为0 '第三个参数Title指定在对话框的标题栏中显示的字符串,如果省略,默认“Microsoft Excel” MsgBox prompt:="中午十二点,该吃饭了!", Buttons:=vbOKOnly + vbInformation, Title:="温馨提醒" End Sub
2、MsgBox的6种按钮设定
Sub msg() MsgBox prompt:="显示“确定”按钮", Buttons:=vbOKOnly, Title:="练习MsgBox按钮" MsgBox prompt:="显示“确定”和“取消”按钮", Buttons:=vbOKCancel, Title:="练习MsgBox按钮" MsgBox prompt:="显示“中止”、“重试”和“忽略”按钮", Buttons:=vbAbortRetryIgnore, Title:="练习MsgBox按钮" MsgBox prompt:="显示“是”、“否”和“取消”按钮", Buttons:=vbYesNoCancel, Title:="练习MsgBox按钮" MsgBox prompt:="显示“是”和“否”按钮", Buttons:=vbYesNo, Title:="练习MsgBox按钮" MsgBox prompt:="显示“重试”和“取消”按钮", Buttons:=vbRetryCancel, Title:="练习MsgBox按钮" End Sub
3、MsgBox的4中图标样式
Sub msg() MsgBox prompt:="显示“关键消息”按钮", Buttons:=vbCritical, Title:="练习MsgBox按钮" MsgBox prompt:="显示“警告询问”按钮", Buttons:=vbQuestion, Title:="练习MsgBox按钮" MsgBox prompt:="显示“警告消息”按钮", Buttons:=vbExclamation, Title:="练习MsgBox按钮" MsgBox prompt:="显示“通知消息”按钮", Buttons:=vbInformation, Title:="练习MsgBox按钮" End Sub
处理MsgBox交互结果
Sub msg() Dim yn As Integer yn = MsgBox(prompt:="是否在A1单元格中输入100?", Buttons:=vbYesNo + vbQuestion, Title:="练习MsgBox按钮") If yn = vbYes Then Range("A1").Value = 100 ElseIf yn = vbNo Then Range("A1").Value = -2 End If End Sub
4、设置缺省按钮和对话框类型
默认情况下按回车键即可执行的按钮成为缺省按钮(如果按钮上有虚线框,则这个按钮为缺省按钮)
Sub msg() Dim yn As Integer '第二个按钮设置为缺省按钮,参数值也可以携程4+32+256 或292 yn = MsgBox(prompt:="是否在A1单元格中输入100?", Buttons:=vbYesNo + vbQuestion + vbDefaultButton2, Title:="练习MsgBox按钮") If yn = vbYes Then Range("A1").Value = 100 ElseIf yn = vbNo Then Range("A1").Value = -2 End If End Sub
Buttons参数还有第四组设定值,用来决定对话框的类型,如下表:
5、MsgBox函数的返回值
Sub msg() Dim yn As Integer yn = MsgBox(prompt:="是否在A1单元格中输入100?", Buttons:=vbYesNo + vbQuestion) '判断用户按下哪一个按钮 If yn = vbYes Then Range("A1").Value = 100 ElseIf yn = vbNo Then Range("A1").Value = -2 End If End Sub
五、Application对象的FindFile方法
判断文件是否打开
Sub OpenFile() If Application.FindFile = True Then '判断文件是否打开 MsgBox "选中的文件已打开!" Else MsgBox "没有打开任何文件!" End If End Sub
六、Application对象的GetOpenFilename方法、FileFilter方法
获取选中文件的文件名
Sub GetFile() Dim fil As String fil = Application.GetOpenFilename() '将选中的文件名赋给变量fil1 If fil = "False" Then MsgBox "没有选中任何文件" Exit Sub Else Range("A1").Value = fil End If End Sub D:\Study\Excel\公式.xlsx
可以使用FileFilter参数限制可选择的文件类型。
Sub GetFile() Dim fil As String 'filefilter 参数是一个文本字符串 "Excel 97-2003 工作簿(*.xls)"是文件筛选条件,显示在【文件类型】下拉列表 '.xls指定在对话框中显示的文件类型,筛选条件和文件类型之间用英文逗号(,)隔开 'fil = Application.GetOpenFilename(filefilter:="Excel 97-2003 工作簿(*.xlsx),*.xls") '将选中的文件名赋给变量fil1 'fil = Application.GetOpenFilename(filefilter:="Excel 工作簿(*.xlsx),*.xlsx") '将选中的文件名赋给变量fil1 fil = Application.GetOpenFilename(filefilter:="Excel 文件(*.xl*),*.xl*", MultiSelect:=True) If fil = "False" Then MsgBox "没有选中任何文件" Exit Sub Else 'D:\Study\Excel\公式.xlsx Range("A1").Value = fil End If End Sub
如果希望能在两种或多种类型的文件中选择,可以修改参数值,如下(文件类型可以用*表示,例如*.xls*):
Sub GetFile() Dim fil As String fil = Application.GetOpenFilename(filefilter:="Excel或Word 文件(*.xls;*.xlsx;*.doc),*.xls*;*.xlsx;*.doc") If fil = "False" Then MsgBox "没有选中任何文件" Exit Sub Else Range("A1").Value = fil End If End Sub
除了FileFilter、GetOpenFilename方法还有其他参数,例如:
FileFilter参数执行在对话框中显示的文件类型
filerIndex参数指定【文件类型】下拉列表中的第几项为默认文件筛选条件,如果省略,默认为1
MultiSelect参数决定可以选中的文件个数。如果设置为True,表示可以同时选中多个文件,默认值为False,即只能选中一个文件
Title参数设置对话框的标题,如果省略,默认为“打开”
Sub GetFile() Dim fil 'filefilter 指定在对话框中显示的文件类型 'FilterIndex 指定【文件类型】下拉列表中的第几项为默认文件筛选条件,如果省略,默认为1 'Title 设置对话框的标题 'MultiSelect 决定可以选中的文件个数,如果设置为True,表示可以同时选中多个文件,默认值为False,即只能选中一个文件 fil = Application.GetOpenFilename(filefilter:="Excel 97-2003 工作簿(*.xls*),*.xls*,Word 97-2003 文档(*.doc),*doc", FilterIndex:=2, Title:="请选择文件", MultiSelect:=True) [A1].Resize(UBound(fil), 1) = Application.WorksheetFunction.Transpose(fil) End Sub 'D:\Study\Excel\Excel基础.xlsx 'D:\Study\Excel\公式.xlsx
七、Application对象的GetSaveAsFilename方法
GetSaveAsFilename方法打开【另存为】对话框,在对话框里选择文件,获得文件名。
Sub GetSaveAs() Dim fil As String, filename As String, filter As String, tle As String filename = "我要选择的文件" filter = "Excel 97-2003 工作簿(*.xls*),*.xls*,Word 97-2003 文档(*.doc),*.doc,文本文件(*.txt),*.txt" tle = "请选择需要的文件" '用变量做方法的参数 '第一个参数InitialFileName指定显示的文件名,如果省略,则显示活动工作簿的名称 '第二个参数filefilter执行文件的筛选条件 '第三个参数FilterIndex设置【保存类型】下拉列表中的第几项默认筛选条件,如果省略,默认值为1 '第四个参数Title指定对话框的标题,如果省略面膜人为“另存为” fil = Application.GetSaveAsFilename(InitialFileName:=filename, filefilter:=filter, FilterIndex:=2, Title:=tle) Range("A1") = fil '把文件名写入A1单元格 End Sub
八、Application对象的FileDialog属性
FileDialog属性可以获得指定目录的路径及名称,如下:
Option Explicit Sub getFolder() With Application.FileDialog(filedialogtype:=msoFileDialogFolderPicker) .InitialFileName = "D:\" '设置D盘根目录为起始目录 .Title = "请选择一个目录" '设置对话框标题 .Show '显示对话框 If .SelectedItems.Count > 0 Then '判断是否选中了目录 Range("A1").Value = .SelectedItems(1) '将选择的目录名及路径写进A1单元格 End If End With End Sub 'D:\Study\Excel\Excel公式与函数-示例文件
除了msoFileDialogFolderPicker,filedialogtype参数还可以选用其他的值,如下:
九、构建用户窗体,自己设计交互界面
用户窗体时Excel的另一个对象:UserForm对象,用户可以在窗体上自由添加ActiveX控件,并利用这些控件从用户那里获得信息,或将信息输出给用户
1、添加窗体两种:在VBA编辑窗口
1、【插入】——【用户窗体】
2、右键单击工程目录树——选中【插入】——【用户窗体】
2、设置窗体属性
分别是“窗体名称”、“窗体标题栏名称”
也可以按照属性分类查看,并进行设置
如果对属性不太熟悉,可以选中属性后,按快捷键F1,即可弹出帮助信息
帮助地址:https://docs.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help/bordercolor-property
3、在窗体中添加控件
如果窗口中没有显示【工具箱】,可以依次执行【视图】——【工具箱】菜单命令打开它。
默认情况下,【工具箱】中有16种控件相同。如果想增加【工具箱】中的控件数目,可以右键单击【工具箱】窗体,执行【添加控件】菜单命令进行添加。
4、窗体相关设置
Option Explicit '窗体显示 Sub xianshi() Load 录入 '加载"录入"窗体 录入.Show '显示"录入"窗体,将窗体显示给用户 End Sub '窗体的显示模式 Sub modal() '录入.Show vbModal '显示窗体模式窗体,默认或缺省则为vbModal,这个窗体将以模式窗体显示 录入.Show vbModeless '显示无模式窗体 Range("A1") = "现在显示的是无模式窗体!" End Sub '关闭窗体 Sub hideform() 录入.Hide '隐藏"录入"窗体 End Sub Sub unloadform() Unload 录入 '卸载"录入"窗体,卸载后窗体将从屏幕和内存中同时删除 End Sub
5、给窗体添加控件,并使用控件
对窗体进行初始化设置UserForm_Initialize
Private Sub UserForm_Initialize() '设置性别复合框的条目为“男”和“女” 性别.List = Array("男", "女") End Sub
为命令按钮添加事件过程
Option Explicit Private Sub UserForm_Initialize() '设置性别复合框的条目为“男”和“女” 性别.List = Array("男", "女") End Sub Private Sub 确定_Click() '判断信息输入是否完整 If 姓名.Value = "" Or 性别.Value = "" Or 出生年月.Value = "" Then MsgBox "信息输入不完整,请重新输入!", vbExclamation, "错误提示" Exit Sub '退出执行程序 End If Dim xrow As Integer xrow = Range("A1").CurrentRegion.Rows.Count + 1 '求第一行空行行号 '将姓名,性别,出生年月写入第一条空行 Cells(xrow, "A") = 姓名.Value Cells(xrow, "B") = 性别.Value Cells(xrow, "C") = 出生年月.Value '内容写入工作表后,将控件中的内容清除 姓名.Value = "" 性别.Value = "" 出生年月.Value = "" End Sub Private Sub 退出_Click() Unload Me '卸载“录入”窗体,Me指录入窗体,即代码所在的模块 End Sub
6、用键盘控制控件
1)更改控件的<Tab>键顺序
在【视图】——【Tab键顺序(A)】在弹出框调整即可
2)给控件执行快捷键
将Accelerator设置为N,表示按下<Alt+N>组合键等于在窗体单击【确定】按钮
7、改造Excel现有的界面
1)更改标题栏的程序名称,默认名称是“Microsoft Excel”
Application.Caption = "我的程序" '更改标题栏程序名称为“我的程序”
2)显示或隐藏菜单栏
逐个隐藏
Sub MenuHide() Dim i% '定义一个变量 With Application.CommandBars(1) .Controls("文件(&F)").Visible = False .Controls("编辑(&E)").Visible = False .Controls("视图(&V)").Visible = False .Controls("插入(&I)").Visible = False .Controls("格式(&O)").Visible = False .Controls("工具(&T)").Visible = False .Controls("数据(&D)").Visible = False .Controls("窗口(&W)").Visible = False .Controls("帮助(&H)").Visible = False End With End Sub
也可以用循环语句实现隐藏
Sub MenuHide() Dim i% '定义一个变量 With Application.CommandBars(1) For i = 1 To .Controls.Count .Controls(i).Visible = False '隐藏第i个菜单,false为隐藏,true为显示 Next End With End Sub
3)显示或隐藏工具栏
Sub ToolHide() '隐藏 常用工具栏 和 格式工具栏 With Application .CommandBars("Starndard").Visible = False '隐藏常用工具栏 .CommandBars("Formatting").Visible = False '隐藏格式工具栏 End With End Sub
想隐藏窗口中显示的所有工具栏,可以使用程序:
Sub ToolHide() Dim i% For i = 2 To Application.CommandBars.Count '索引号为2开始,因为1时菜单栏 Application.CommandBars(i).Enabled = False '隐藏所有工具栏 Next End Sub
4)设置窗口
Sub WindowSet() With ActiveWindow .DisplayHeadings = False '隐藏行标和列标 .DisplayHorizontalScrollBar = False '隐藏水平滚动条 .DisplayVerticalScrollBar = False '隐藏垂直滚动条 .DisplayGridlines = False '隐藏网格线 .DisplayWorkbookTabs = False '隐藏工作表标签 End With End Sub
5)其他设置
Sub Other() With Application .DisplayFormulas = False '隐藏编辑栏 .CommandBars.DisableAskAQuestionDropdown = True '隐藏帮助 .CommandBars("ply").Enabled = False '右键单击工作表标签后不显示菜单 .CommandBars("cell").Enabled = False '右键单击工作表区域后不显示菜单 .DisplayStatusBar = False '隐藏状态栏 .ShowStartupDialog = False '隐藏任务窗格 End With End Sub
十、典型的技巧或示例
等等……
十一、代码调试与优化
1、VBA可能发生的错误分类
编译错误
运行时错误
逻辑错误
2、VBA程序的3种状态
设计模式
运行模式
中断模式:这时通过F8键逐句执行程序,观察运行情况。
3、断点
设置断点,可以利用F9快捷键快速设置或清除断点
F8逐行执行程序,观察运行情况