4.3 无须控件,一样交互
Excel VBA应用程序的一个重要功能是对数据进行处理,在数据处理过程中,程序需要知道处理什么数据和数据处理的结果如何告知用户,这就是常说的数据的输入和输出的问题。在Excel VBA中,使用对话框是实现数据输入输出的常用方法。在VBA程序中,创建对话框并不一定需要使用控件,可以使用InputBox函数来获得输入对话框,使用MsgBox函数获得输出对话框。另外,使用Print方法能够更为便捷地获得程序对数据处理后的结果。
4.3.1 使用输入对话框输入数据
在VBA中,InputBox函数能够产生接受用户输入数据的对话框,用户可以在该对话框中输入数据,在对话框被关闭时将输入的数据作为返回值传递给应用程序。如下面语句将能获得一个输入对话框,对话框如图4-4所示。
图4-4 输入对话框
InputBox ("请在此输入数据")
在使用InputBox函数时,用户不仅可以实现向程序输入数据,还可以通过对函数的参数进行设置来获得不同样式的对话框。InputBox函数的语法格式如下所示:
返回值=IputBox(Prompt, [Title][, Default][, Xpos, Ypos][, Helpfile, Context])
InputBox函数参数的意义如下所示。
● Prompt:该参数用于设置对话框中显示的提示信息,最大长度为1024个字符。如果需要在对话框中显示多行字符,可以在文字之间使用回车符vbCrLf来换行。
● Title:该参数用于设置对话框标题栏中显示的字符,其值为字符串型数据。如果省略该参数,将会把应用程序名放入标题栏,就像图4-3显示的那样。
● Default:该参数用于设置显示在文本框中的字符串。也就是说,该参数将在打开对话框还未输入数据时显示于对话框的文本输入框中。如果该参数被省略,则文本框输入框为空。
● Xpos和Ypos:这两个参数分别用于设置对话框在屏幕上的位置。Xpos值为对话框左边与屏幕左边的水平距离,Ypos值为对话框上边与屏幕上边的距离。如果省略Xpos参数,对话框会水平居中。如果省略Ypos参数,对话框将位于屏幕垂直方向距下边大约三分之一的位置。
● Helpfile:该参数用于设置对话框的帮助文件,此参数可以省略。
● Context:该参数用于设置对话框的帮助主题编号,此参数可以省略。
【示例4-1】使用InputBox函数输入多个数据。
(1)启动Excel并创建一个空白工作簿,打开Visual Basic编辑器,创建一个新模块。在该模块的“代码”窗口中输入如下程序代码:
01 Sub使用InputBox函数() 02 Dim myName As String, mySex As String, _ 03 myAge As String ’声明变量 04 myName = InputBox("请输入你的姓名", _ 05 "个人信息输入框") ’创建第一个输入对话框用于输入姓名 06 mySex = InputBox("您的姓名是:" + _ 07 myName + vbCrLf + "下面请输入您的性别信息", _ 08 "个人信息输入框", "男") ’创建第二个输入对话框用于输入性别 09 myAge = InputBox("您的姓名是:" + myName + _ 10 vbCrLf + "您的性别是:" + mySex + _vbCrLf + _ 11 "下面请输入您的年龄信息", "个人信息输入框", "30") '创建第三个输入对话框用于输入年龄 12 End Sub
(2)按F5键运行程序,在屏幕上出现第一个输入对话框,在输入对话框中输入姓名信息,如图4-5所示。单击“确定”按钮后将再次打开输入对话框,对话框中显示上次输入的姓名,并要求输入性别信息。此时输入文本框中的默认值为“男”,如图4-6所示。完成输入后单击“确定”按钮关闭对话框将再次打开输入对话框要求输入年龄,此时对话框中将显示已经输入的姓名和性别,如图4-7所示。
图4-5 在输入框中输入姓名信息
图4-6 输入性别
图4-7 输入年龄
代码解析:
● 使用InputBox函数一次只能返回一个值,如果需要输入多个值,则必须要多次调用该函数,就像本例中那样。
● 在默认情况下,InputBox函数的返回值是一个字符串,而不是变体型。因此,在代码开始声明变量时,将存储InputBox函数返回值的变量均定义为字符串型。
● 在设置输入对话框显示的文字时,如果文字需要换行,可以使用常量vbCrLf。同时,可以使用连接运算符“+”来将多个字符串连接在一起显示。
4.3.2 使用MsgBox函数输出数据
在VBA中,MsgBox函数能够以对话框的形式显示一些简单的提示信息,如错误、警告或信息提示等。此时,程序将等待用户对提示做出反应,用户操作可以通过单击对话框上的按钮来完成。这些按钮被赋予特殊的值,用户单击相应的按钮后,返回值将传递回程序,告诉程序用户所做的选择。
如下面的语句将能够创建一个简单的信息提示框,单击“确定”按钮将关闭该对话框,如图4-8所示。
图4-8 信息提示框
MsgBox "这是一个信息提示框", vbInformation
MsgBox函数有两种用法:
● 一种是不返回值的函数调用。也就是说,不需要告诉程序用户当前单击的是哪个按钮,只是需要显示某些提示信息。此时,可以使用下面的语法格式。
MsgBox Prompt [, Buttons] [, Title] [, Helpfile, Context]
● 如果是要获取返回值的函数调用,也就是需要将用户单击了哪个按钮告知程序,则可以使用下面的语法格式:
返回值=MsgBox(Prompt [, Buttons] [, Title] [, Helpfile, Context])
MsgBox函数和InputBox函数的参数意义基本一致,不同的只是其增加了一个Buttons参数,该参数用来指定显示按钮的数目与样式、对话框中的图标样式以及指定默认按钮等。这里,按钮的样式由VBA常数来设置,这些常数的意义如表4-1所示。
表4-1 按钮设置表
MsgBox函数可以使用VBA常数来设置对话框中显示的图标样式,这些常数的意义如表4-2所示。
表4-2 图标样式设置表
由于在对话框中往往会存在多个按钮,MsgBox函数允许用户设置哪个按钮是默认被选择的按钮,这个按钮称为对话框中的默认按钮。使用VBA中的常量可以指定对话框中的默认按钮,默认按钮设置所需使用的常量如表4-3所示。
表4-3 默认按钮设置表
在对Buttons参数进行设置时,可以将上面不同作用的多个常量结合起来使用,这样就可以随心所欲地定制自己的消息对话框的样式了。在使用多个常量时,可以使用“+”来连接它们。如使用下面语句定义消息对话框的样式,该消息框将有“是”“否”“取消”和“帮助”4个按钮,同时将显示Warning Message图标,并且以第2个按钮作为默认被选择的按钮,如图4-9所示。
MsgBox " 这 是 一 个 信 息 提 示 框 ", vbYesNoCancel + vbMsgBoxHelpButton + vbExclamation+vbDefaultButton2
图4-9 自定义消息对话框获得的样式
【示例4-2】使用MsgBox函数创建提示对话框。
(1)启动Excel并创建一个空白文档,打开Visual Basic编辑器。创建一个模块,在模块的“代码”窗口中输入如下程序代码:
01 Sub使用MsgBox函数() 02 Dim Msg, Style, Response, Title ’声明变量 03 Msg = "你想继续完成你的操作吗?" ’设置对话框现显示的提示文字 04 Style = vbYesNo + vbCritical + vbDefaultButton2 ’设置对话框的显示样式 05 Title = "操作提示" ’标题文字 06 Response = MsgBox(Msg, Style, Title) ’显示提示对话框,并获取用户的操作 07 If Response = vbYes Then ’如果用户单击了“确定”按钮 08 MsgBox "你选择了继续操作,操作将继续!", _ 09 vbOKOnly + vbExclamation, "注意" ’提示操作将继续 10 Else ’如果用户单击了“否”按钮 11 MsgBox "你选择了不再操作,当前操作将结束!", _ 12 vbOKOnly + vbExclamation, "注意" ’提示操作将终止 13 End If 14 End Sub
(2)按F5键运行程序,程序将首先给出提示对话框,对话框包含“是”按钮和“否”按钮,默认选择的按钮将是第2个按钮,即“否”按钮,如图4-10所示。如果单击“是”按钮,程序给出只含有一个按钮的提示对话框,提示当前的操作,如图4-11所示。如果单击“否”按钮,程序同样给出提示对话框,如图4-12所示。
图4-10 程序给出提示对话框
图4-11 提示对话框提示当前操作
图4-12 程序给出提示对话框
代码解析:
● 在代码中,将MsgputBox函数需要的参数置于变量中,这样,当需要更改对话框的提示文字时,只修改变量的值就可以了。
● 程序通过设置MsgBox函数的Buttons参数来设置“操作提示”对话框的样式,这包括指定在对话框中显示的图标样式、按钮类型以及默认选择的按钮。
● 程序将MsgBox函数的返回值置于变量Response中,使用if语句来判断用户单击的是哪个按钮。如果变量Response值为vbYes,说明单击的是“是”按钮,否则单击的是“否”按钮。根据用户选择的不同,分别使用提示对话框显示不同的提示内容。
4.3.3 简单实用的Print方法
使用MsgBox函数可以在一个独立的对话框中显示程序的运行结果,但是在程序调试时如果使用它来显示结果就显得不够快捷直观。这时,Print方法就显示出了独特的优越性,因为该方法能够直接在Visual Basic编辑器的“立即窗口”中显示程序的结果。在程序运行时,任何变量值的变化,都可以使用该方法在“立即窗口”中实时显示,就像看现场直播那样。
在VBA中,Print方法的语法结构如下所示。
Debug.Print显示内容
如下面的语句将在“立即窗口”中显示字符串"VBA很简单,I Love her! ",如图4-13所示。
图4-13 在“立即窗口”中显示的字符串
Debug.Print "VBA很简单,I Love her! "
在使用Print方法时,为了设置输出字符的格式,可以在输出字符时使用下面的参数。
● Spc(n):该参数为可选参数,用于指定在输出时需要在字符前添加的空格的数目,空格的数目由n决定。
● Tab(n):该参数为可选参数,用于将插入点定位到n所指定的列。
● 插入点参数:在输出字符时,可以通过插入点参数来设置插入点的位置。在输出时,使用逗号(,)能够以14个字符为一个分隔区,将数据输出到对应的输入区中。使用分号(;)能够指定插入点为前一个字符的后面,其能够将两个字符串连接在一起显示。
【示例4-3】使用Print方法创建字符画。
(1)启动Excel并创建空白文档,打开Visual Basic编辑器。创建模块,在模块的“代码”窗口中输入如下程序代码:
01 Sub使用Print方法() 02 Debug.Print Tab(3); "n"; "n"; "n"; Tab(7); Spc(5); "n"; "n"; "n" 03 Debug.Print Tab(2); "n"; Tab(7); "n"; Tab(10); "n"; Tab(15); "n" 04 Debug.Print Tab(1); "n"; Tab(9); "n"; Tab(16); "n" 05 Debug.Print Tab(0); "n"; Tab(4); "情人节快乐!"; Tab(16); "n" 06 Debug.Print Tab(2); "n"; Tab(15); "n" 07 Debug.Print Tab(3); "n"; Tab(14); "n" 08 Debug.Print Tab(4); "n"; Tab(13); "n" 09 Debug.Print Tab(6); "n"; Tab(12); "n" 10 Debug.Print Tab(9); "n" 11 End Sub
(2)按F5键运行程序,程序运行时将在“立即窗口”中显示指定的字符,这些字符将组成一幅有趣的字符画,如图4-14所示。
图4-14 在“立即窗口”中显示的结果
代码解析:
● 这段代码使用Print方法来输出字符组成字符画。
● 使用Tab(n)来确定字符出现的位置,该分隔符能够将插入点光标移动到指定的位置,其类似于按Tab来创建制表位。
● 程序使用分号“; ”分隔符来连接字符形成一行连续的字符。
● 程序使用Spc(n)来添加空格以增加字符间的间隔。
● 在使用Print方法时,用于换行的常数vbCrLf同样有用。因此,上面的代码完全可以只使用一个Print方法来完成,具体的代码如下所示。与上面的代码相比,这段代码只使用了一次Print方法,为了实现字符的分行显示,使用了vbCrLf来换行。当然这样做的代价是:这一行代码将会很长,要完整地看到它,读者只能无可奈何地不断地向右拖动“代码”窗口中的滚动条了。
Debug.Print Tab(3); "n"; "n"; "n"; Tab(7); Spc(5); "n"; "n"; "n"; vbCrLf; Tab(2); "n"; Tab(7); "n"; Tab(10); "n"; Tab(15); "n"; vbCrLf; Tab(1); "n"; Tab(9); "n"; Tab(16); "n"; vbCrLf; Tab(0); "n"; Tab(4); "情人节快乐!"; Tab(16); "n"; vbCrLf; Tab(2); "n"; Tab(15); "n"; vbCrLf; Tab(3); "n"; Tab(14); "n"; vbCrLf; Tab(4); "n"; Tab(13); "n"; Tab(6); "n"; Tab(12); "n"; vbCrLf; Tab(9); "n"