VBA编程——窗体与控件(1)

使用窗体和一系列的控件创建图形化的用户界面(GUI),可以提供更加友好的操作界面,本文将介绍如何在VBA程序中使用窗体、控件和其它图形化组件。

首先来了解MsgBox()和InputBox()函数的使用。

MsgBox()函数

MsgBox()函数的功能是显示消息对象框,其定义为MsgBox (prompt, [buttons,] [title,] [helpfile, context]),参数定义下面分别讨论。

prompt参数指定在消息对话框中显示的内容。

titie参数指定消息对话框标题的内容。可选参数。

helpfile和context参数需要一起使用,helpfile指定帮助文件的路径,context指定帮助的上下文ID。可选参数。

buttons参数指定消息对话框中的按钮、图标和其它设置,可选参数,不指定参数时默认只显示“确定”按钮。可以使用的常量如下表所示。

常量说明
0vbOKOnly仅显示“确定”按钮。
1vbOKCancel显示“确定”和“取消”按钮。
2vbAbortRetryIgnore显示“中止”、“重试”和“忽略”按钮。
3vbYesNoCancel显示“是”、“否”和“取消”按钮。
4vbYesNo显示“是”和“否”按钮。
5vbRetryCancel显示“重试”和“取消”按钮。
16vbCritical显示“关键消息”图标。
32vbQuestion显示“警告查询”图标。
48vbExclamation显示“警告消息”图标。
64vbInformation显示“信息消息”图标。
0vbDefaultButton1第一个按钮是默认按钮。
256vbDefaultButton2第二个按钮是默认按钮。
512vbDefaultButton3第三个按钮是默认按钮。
768vbDefaultButton4第四个按钮是默认按钮。
0vbApplicationModal应用程序模式;用户在继续在当前应用程序中工作前必须响应消息框。
4096vbSystemModal系统模式;在用户响应消息框前,所有应用程序都挂起。
16384vbMsgBoxHelpButton在消息框中添加“帮助”按钮。
65536vbMsgBoxSetForeground将消息框窗口指定为前景窗口。
524288vbMsgBoxRight文本右对齐。
1048576vbMsgBoxRtlReading 指定文本在希伯来语和阿拉伯语系统中应从右到左显示。

此外,MsgBox()函数会返回用户点击的按钮,类型如下表所示。

常量说明
1vbOK确定
2vbCancel取消
3vbAbort中止
4vbRetry重试
5vbIgnore忽略
6vbYes
7vbNo

如下面的代码,将显示一个包含问号图标、“确定”和“取消”按钮的消息对话框,并在立即窗口中显示点击的按钮值。

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窗体。