使用窗体和一系列的控件创建图形化的用户界面(GUI),可以提供更加友好的操作界面,本文将介绍如何在VBA程序中使用窗体、控件和其它图形化组件。
首先来了解MsgBox()和InputBox()函数的使用。
MsgBox()函数
MsgBox()函数的功能是显示消息对象框,其定义为MsgBox (prompt, [buttons,] [title,] [helpfile, context]),参数定义下面分别讨论。
prompt参数指定在消息对话框中显示的内容。
titie参数指定消息对话框标题的内容。可选参数。
helpfile和context参数需要一起使用,helpfile指定帮助文件的路径,context指定帮助的上下文ID。可选参数。
buttons参数指定消息对话框中的按钮、图标和其它设置,可选参数,不指定参数时默认只显示“确定”按钮。可以使用的常量如下表所示。
值 | 常量 | 说明 |
0 | vbOKOnly | 仅显示“确定”按钮。 |
1 | vbOKCancel | 显示“确定”和“取消”按钮。 |
2 | vbAbortRetryIgnore | 显示“中止”、“重试”和“忽略”按钮。 |
3 | vbYesNoCancel | 显示“是”、“否”和“取消”按钮。 |
4 | vbYesNo | 显示“是”和“否”按钮。 |
5 | vbRetryCancel | 显示“重试”和“取消”按钮。 |
16 | vbCritical | 显示“关键消息”图标。 |
32 | vbQuestion | 显示“警告查询”图标。 |
48 | vbExclamation | 显示“警告消息”图标。 |
64 | vbInformation | 显示“信息消息”图标。 |
0 | vbDefaultButton1 | 第一个按钮是默认按钮。 |
256 | vbDefaultButton2 | 第二个按钮是默认按钮。 |
512 | vbDefaultButton3 | 第三个按钮是默认按钮。 |
768 | vbDefaultButton4 | 第四个按钮是默认按钮。 |
0 | vbApplicationModal | 应用程序模式;用户在继续在当前应用程序中工作前必须响应消息框。 |
4096 | vbSystemModal | 系统模式;在用户响应消息框前,所有应用程序都挂起。 |
16384 | vbMsgBoxHelpButton | 在消息框中添加“帮助”按钮。 |
65536 | vbMsgBoxSetForeground | 将消息框窗口指定为前景窗口。 |
524288 | vbMsgBoxRight | 文本右对齐。 |
1048576 | vbMsgBoxRtlReading | 指定文本在希伯来语和阿拉伯语系统中应从右到左显示。 |
此外,MsgBox()函数会返回用户点击的按钮,类型如下表所示。
值 | 常量 | 说明 |
1 | vbOK | 确定 |
2 | vbCancel | 取消 |
3 | vbAbort | 中止 |
4 | vbRetry | 重试 |
5 | vbIgnore | 忽略 |
6 | vbYes | 是 |
7 | vbNo | 否 |
如下面的代码,将显示一个包含问号图标、“确定”和“取消”按钮的消息对话框,并在立即窗口中显示点击的按钮值。
VBA |
Sub Main() result = MsgBox("是否确认操作", vbOKCancel Or vbQuestion) Debug.Print (result) End Sub |
执行代码会显示如下图所示的消息对话框。

#图#消息对话框
本例,点击“确定”按钮会返回1,点击“取消”按钮或直接关闭对话框会显示2。
InputBox()函数
InputBox()函数用于显示一个输入对话框,其定义为InputBox (prompt,[title],[default],[xpos],[ypos],[helpfile,context]),参数定义如下:
prompt参数指定提示信息。
title参数指定对话框的标题。可选参数。
default参数指定初始的内容,可选参数,默认为空白字符串。
xpos和ypos设置对话框的位置,可选参数,不指定时居中显示。
helpfile和context同样需要一起使用,分别指定帮助文件路径和帮助上下文ID。
下面的代码演示了InputBox()函数的应用。
VBA |
Sub Main() Dim result As String result = InputBox("请输入身份证号码") If result = "" Then Debug.Print ("没有输入内容") ElseIf card18Check(result) Then Debug.Print ("输入身份证号码格式正确") Else Debug.Print ("输入身份证号码格式不正确") End If End Sub |
执行代码会显示如下图所示的输入对话框。

#图#输入对话框
输入对话框中,点击“取消”会返回空字符串,否则返回输入的字符串内容。代码中调用了前面封装的card18Check()函数检查输入的身份证号码格式是否正确,并在立即窗口中显示检查结果信息。
窗体与控件
窗体(Form)是图形界面的基本载体,在VBA开发环境中,可以在“工程”窗口中通过右键菜单“插入”>>“用户窗体”添加一个新的窗体。
下面创建一个新的窗体,并修改名称为frmTest,如下图所示。

#图#添加窗体
窗体的标题栏文本可以在“属性”窗体中通过Caption属性修改。修改窗体的尺寸可以使用鼠标拖拽窗体四周的锚点进行操作。
选中窗体后,会自动显示“工具箱”,如下图所示。

#图#工具箱
“工具箱”窗口中有一些“控件”,可以用于窗体的界面设计,控件名称如下图所示。

#图#工具箱中的控件
在窗体中添加控件时可以在“工具箱”选中控件类型,然后在窗体中通过鼠标拖拽绘制控件。
窗体作为主界面运行时,首先选中窗体,然后点击工具栏中的执行按钮(绿色三角)或直接使用键盘F5;此外,也可以在代码中调用窗体,如在模块1中使用下面的代码显示frmTest窗体。
VBA |
Sub Main() frmTest.Show End Sub |
代码中,使用窗体对象的Show方法即可显示窗体。
标签、文本框和按钮
标签、文本框和按钮是基本的,也是常用的几种控件,下面的示例将会使用这几种控件制作一个身份证号码验证的界面。
首先在frmTest窗体中添加两个标签、一个文本框和一个按钮,如下图所示。

#图#界面设计
其中,标签和按钮显示的内容可以使用Caption属性设置,文本框的内容则可以使用Text属性设置。接下来需要添加点击“验证号码”按钮的响应代码,双击按钮可以打开控件的默认事件响应方法,在按钮CommandButton1的Click事件响应方法中修改代码如下。
VBA |
Private Sub CommandButton1_Click() If card18Check(TextBox1.Text) Then With Label2 .Caption = "正确" .ForeColor = vbGreen End With Else With Label2 .Caption = "错误" .ForeColor = vbRed End With End If End Sub |
代码中使用了With <对象>...End With语句结构,可以简化对象成员的调用,如代码中只需要在With关键字后指定对象Label2,然后可以直接使用圆点运算符调用对象的属性、方法等成员。本例,在文本框中输入身份证号码后点击“验证号码”按钮进行检查,当输入内容是正确的18位身份证号码时,Label2标签显示“正确”,并设置为绿色字体;否则显示“错误”,并设置为红色字体。
实际上,通过文本框的Change事件可以在输入身份证号码的同时进行验证,双击文本框会自动打开Change事件的响应代码,修改如下。
VBA |
Private Sub TextBox1_Change() CommandButton1_Click End Sub |
就这么简单,直接调用CommandButton1_Click()子程序,即按钮CommandButton1的Click事件响应方法即可。打开窗体后,直接在文本框中输入身份证号码,可以判断格式是否正确并通过标签Label2显示结果。
窗体的代码编辑窗口的顶部有两个列表,如下图所示。左侧为控件列表,可以选择需要编写代码的控件或窗体,请注意,在控件列表中,窗体会显示为UserForm;右侧为选择控件(窗体)的事件列表,选中事件时,如果事件响应方法没有创建,则会自动生成,然后编辑事件响应代码即可。

#图#控件与事件列表
此外,窗体的Initialize事件中可以添加窗体显示前执行的代码,双击窗体后自动生成的是Click事件的响应方法,可以在事件列表中选择Initialize,然后进行编辑,如下面的代码。
VBA |
Private Sub UserForm_Initialize() Me.Caption = "窗体打开时间:" & Now() End Sub |
代码的功能是打开窗体时在标题栏显示打开的时间。代码中,Me关键字表当前对象,这里就是指frmTest窗体。