4.3 消息框和输入框
在VBA中Msgbox和Inputbox函数为用户和代码提供了交互的窗口。Msgbox能够给出用户一个信息提示,便于用户根据提示信息进行进一步的操作。输入框则提供了程序和用户互动的一个窗口,程序能够根据用户输入的内容做出反应。
4.3.1 MsgBox函数
MsgBox函数的作用是给用户一个消息框,提示用户根据消息框所示的信息做出反应。常见的MsgBox有两种使用方法。
● 一种是直接使用MsgBox函数本身,例如类似于MsgBox "没有找到相应的工作表!"这样的语句,在这种情况下Msgbox函数不使用括号,其效果仅仅是给用户一个提示信息。
● 一种就是将MsgBox函数的结果赋值给某个变量,在这种情况下MsgBox函数是带有括号的,其作用是要对用户的消息框的反映做出进一步的操作。
1. Msgbox的简单应用
MsgBox函数的语法结构如下所示。
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
上述结构中各参数的含义是:
● prompt:消息框中要显示的提示信息内容。
● Buttons:消息框中要显示的按钮。
● Title:消息框窗口的标题,如果不设置,其标题是“Microsoft Excel”。
● helpfile, context:表示消息框的帮助文件和帮助主题。
其中消息框中Buttons参数可能的取值有很多种,具体情况如表4-2所示。
表4-2 Button参数常量值
例4-15:利用代码显示一个消息框,消息框的内容为“没有找到相应的工作表!”,消息框能显示确定和取消按钮,焦点默认出现在确定按钮上。消息框的标题为“Msgbox测试”并显示关键信息图标。
#001: Sub消息框演示() #002: MsgBox "没有找到相应的工作表!", vbOKCancel + vbCritical + vbDefaultButton1, "Msgbox测试" #003: End Sub
在第2行代码中,“没有找到相应的工作表!”就是prompt参数的值。“vbOKCancel + vbCritical + vbDefaultButton1”定义了Button参数的值。其中vbOKCancel的含义是表示在消息框中显示“确定”和“取消”按钮;vbCritical表示要显示图标;vbDefaultButton1表示将使“确定”按钮保持为默认按钮。“Msgbox测试”定义了消息框的标题文字。上述代码执行的结果如图4-3所示。
图4-3 消息框
说明
所谓将“确定”按钮保持为默认按钮,就是在显示消息框的时候,“确定”按钮上会显示一个虚线的框,如图4-3所示。用户只需要按键盘上的Enter键就相当于单击了确定按钮。
2. 使用Msgbox函数
上例中所使用的Msgbox产生了一个消息框,在消息框中有两个按钮,不过用户可以发现,不论是单击了“确定”按钮还是单击“取消”按钮,都不会对程序产生任何影响,程序只是关闭了消息框。
Msgbox的作用不仅仅能够给用户一些信息提示,而且也能够根据用户对消息框的操作来进行进一步判断。例如对于上例所使用的消息框要能够判断出用户到底是单击了“确定”按钮还是“取消”按钮。这时就必须使用带括号的MsgBox函数,并将最终的Msgbox函数的运行结果赋值给一个变量。
例4-16:假设用户已经编写了一个程序,当退出程序的时候,要给用户一个信息提示,提示信息为“是否退出程序?”,并显示“确定”和“取消”按钮。消息框中的标题使用“退出程序提示”,当用户单击了确定按钮的时候就将退出程序。
#001: Sub退出程序() #002: Dim info As Integer #003: info = MsgBox("是否退出程序?", vbOKCancel + VbQuestion, "退出程序提 示") #004: If info = vbOK Then #005: Application.Quit #006: End If #007: End Sub
第2行代码定义名为info的变量,该变量的作用是判断用户到底按下了消息框中的哪个按钮。在第3行代码中,Msgbox使用了括号,表示使用Msgbox函数最终将会产生一个值,该值将会被赋值给info变量。“vbOKCancel + VbQuestion”表示将显示“确定”和“取消”按钮,并显示一个询问的图标。并且消息框的标题显示为“退出程序提示”。
当用户单击了消息框上的某个按钮,MsgBox函数就会产生一个整数值。这个整数值很难被记忆,因此一般不用数值来表示用户按动了什么键,而是用常量值来进行判断。在消息框中,MsgBox函数通过设置button参数为vbOKCancel来显示“确定”和“取消”按钮,因此用户单击了确定按钮,那么程序就会产生一个整数值,用常量表示就是“vbOK”,同理,用户单击了取消按钮,程序也会产生一个整数值,该整数值可以用常量“vbCancel”来表示。第4行代码中就表示如果用户单击了“确定”按钮,就会执行第5行代码的指令。第5行代码的含义就是退出Excel应用程序。
上述代码的运行结果如图4-4所示。
图4-4 消息框
当单击“确定”按钮后就会退出Excel程序。
3. 消息框提示文本的换行处理
在使用MsgBox函数的过程中,如果用户要显示的提示信息文本较长,通常可以采用将提示信息分成若干行进行显示的方法。用户可以在需要换行的地方加上vbCrLf或者vbNewLine。
例4-17:将消息框中的“没有找到相应的工作表”分成三行显示。并在消息框内显示“确定”和“取消”按钮。
#001: Sub提示信息分行显示() #002: Dim msg As String #003: msg = "没有" & vbNewLine #004: msg = msg & "找到相应的" & vbCrLf #005: msg = msg & "工作表" #006: MsgBox msg, vbOKCancel + vbCritical + vbDefaultButton1, "Msgbox 测试" #007: End Sub
这段代码和例4-15有了一些区别,这些区别就反映在提示显示的书写方式上。本实例中第2行代码声明了一个名为msg的变量,该变量用来方式提示信息。第3行到第5行代码确定了提示信息的产生方法。首先是第3行代码,提示信息msg变量的值被赋为“没有”和一个换行符号,然后在第4行代码接着第3行代码又加了“找到相应的”和换行符,都了第5行代码完成了整个的提示信息。由于msg包含了两个换行符,因此最终显示的时候会换成两行显示。上述代码执行的最终结果如图4-5所示。
图4-5 多行显示的提示信息
说明
除了可以使用vbCrLf换行外,还可以使用vbNewLine进行强制换行,也可以用Chr(10) + Chr(13)来代替vbCrLf和vbNewLine。
4.3.2 VBA的InputBox函数
通过InputBox函数可以给用户提供一个输入框,它允许用户输入内容,程序可以根据用户输入的内容进行判断。
InputBox函数的语法结构如下所示:
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
上述结构中各参数的含义是:
● prompt:输入框中要显示的文本内容。
● title:输入框窗口的标题,如果不设置,其标题是“Microsoft Excel”。
● default:默认值。
● xpos和ypos:输入框左上角的坐标位置。
● helpfile, context:表示输入框的帮助文件和帮助主题。
例4-18:利用InputBoxu弹出一个输入框,提示用户输入单位名称,如果用户在输入框中输入了单位名称,单击“确定”按钮,那么输入框就会消失,如果用户没有输入任何内容就单击“确定”按钮,或者输入了内容,但是单击了取消按钮,输入框会重新显示,直到用户输入内容为止。
上述问题需要完成两个任务,首先是要显示输入框,其次是要判断输入框中是否输入内容。具体的代码如下所示:
#001: Sub inputbox函数演示() #002: Dim mc As String #003: Do Until mc <> "" #004: mc = InputBox("请输入单位名称!", "单位名称输入提示") #005: Loop #006: Debug.Print mc #007: End Sub
第2行代码声明了变量mc用来放置消息框输入的单位名称。第3行到第5行代码用了一个Do……Loop循环,用来保证用户必须在消息框中输入内容。如果不输入内容,那么就会一直执行循环,执行循环的结果就是显示一个消息框。循环结束的条件就是mc变量的值不为空,如第3行代码所示。第4行代码中将Inputbox函数的结果赋值给变量mc。Inputbox函数中,给出了输入提示性的信息“请输入单位名称”以及输入框的标题“单位名称输入提示”。运行上述代码后会打开如图4-6所示的输入框,用户只有在输入框中输入内容,并单击“确定”按钮,才能够退出输入框,否则的话,如果不在输入框中输入内容,或者输入了内容后单击“取消”按钮,输入框都还会再次显示,直到用户完成内容输入为止。
图4-6 输入框
4.3.3 Excel的InputBox函数
VBA内置的InputBox函数其功能比较单一,如果要完成更加复杂的任务,那么使用VBA内置的Inputbox函数显然是不够的,此时使用Excel本身的InputBox函数则可以很好地解决这个问题。Excel内置的InputBox函数及语法结构为:
Application.InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type)
上述结构中各参数的含义是:
● prompt:输入框中要显示的文本内容。
● title:输入框窗口的标题,如果不设置,其标题是“Microsoft Excel”。
● default:默认值。
● left和top:输入框左上角的坐标位置。
● helpfile, context:表示输入框的帮助文件和帮助主题。
● type:输入框所返回的数据类型。
对比两个Inputbox函数,参数大致相同,关键差异在于,使用Excel内置的Inputbox函数多了一个Type参数,该参数能够确定输入框中输入内容后,最终的结果会返回的数据类型。Type参数的取值情况如表4-3所示。
表4-3 输入框的数据类型
例4-19:在图4-1所示的工作表中,利用InputBox函数,使用鼠标选择区域,并将选中的单元格区域中包含的文字颜色更改为红色。
#001: Sub Inputbox函数演示() #002: Dim rng As Range #003: Set rng = Application.InputBox(prompt:="请选择单元格区域", Title:=" 选择提示", Type:=8) #004: rng.Font.Color=vbRed #005: End Sub
第2行代码声明了一个单元格区域对象变量rng,第3行代码用Set语句为rng对象变量赋值,rng所指代的单元格区域就是InputBox函数的结果。在该InputBox函数中,type参数的取值为8,也就是单元格引用。当用户在工作表中选择单元格区域的时候,输入框中就能显示单元格区域的地址,单击“确定”按钮,即可将输入框中的地址最终转化为单元格区域,并将这个结果赋值给对象变量rng。这个过程如图4-7所示。当用户选择了B1到E6单元格区域的时候,输入框中就显示了地址“$B$1:$E$6”。单击输入框中的“确定”按钮后,选中的区域文字颜色将变为红色。
图4-7 选择单元格区域
使用Excel的Inputbox函数还有一个优势就是它限制了用户输入的内容。当用户输入了不合法的内容时,单击“确定”按钮,将会给出错误提示。还是以上例显示的输入框为例,如果用户此时不是用鼠标选择单元格区域,而是直接在输入框中输入“b1:e6”,单击“确定”按钮,代码执行没有发生错误。但是如果用户在输入框中输入了“abcd”这种不是单元格地址的内容时,单击“确定”按钮,会显示如图4-8所示的错误提示。该错误提示表示输入框将用户输入的内容进行数据转化时发生了错误。
图4-8 错误输入时的提示
4.3.4 Excel内置对话框
用户有时会发现自己绞尽脑汁所开发的功能实际上在Excel中早就实现了。使用VBA的时候,要能够将Excel中固有的功能纳入到自己的程序设计过程中,进而简化程序的设计过程。
在Excel中内置了众多的对话框,它们为用户提供了很多功能。只要灵活运用这些对话框,将能使自己设计的程序专业程度更高。当然要熟练使用Excel的内置对话框,首先是要能够熟练的使用Excel,了解Excel中到底存在哪些对话框,这些对话框的作用是什么,在何时调用这些对话框。
由于Excel内置的对话框太多,要完全记忆这些对话框的名称几乎是不可能的,也没有必要这样做。通常的办法可以通过对象浏览器来查看内置的Excel对话框的名称。例如要查找一个“打开”文件对话框,具体的操作步骤如下所示。
(1)在VBE中按F2功能键,或者执行“视图”菜单下的“对象浏览器”命令,打开“对象浏览器”对话框。
(2)在“对象浏览器”对话框中,从对象库中选择“Excel”,在搜索栏中输入“xldialog”,如图4-9所示。单击“搜索”按钮,将会显示Excel所有的内置对话框。在搜索结果列表框显示了所有的内置对话框。
图4-9 搜索内置对话框
如果在搜索结果列表框中找到了xlDialogOpen项目,那么就可以知道从Excel中存在的“打开”对话框其名称为“xlDialogOpen”。用户查找过程需要了解各种对话框的中文名称,并根据显示结果中的英文名称来确定和中文名称的对应关系。
从对象浏览器中找到了某个内置对话框后,接下来要使用内置对话框,将这些内置对话框显示出来。其语法结构为:
Application.Dialogs(内置对话框名).Show
例4-20:使用代码打开内置“打开”文件对话框。
#001: Sub显示内置对话框() #002: Application.Dialogs(xlDialogOpen).Show #003: End Sub
第2行代码就是显示“打开”文件对话框。运行上述代码,其结果如图4-10所示。
图4-10 显示打开对话框
4.3.5 命名参数
在使用某些方法或者函数的时候会涉及到参数。例如Msgbox函数其完整格式为“MsgBox(prompt[, buttons] [, title] [, helpfile, context])”括号内的部分都是参数,一共有5个。
例如在例4-15的代码中使用了下述一行代码:
MsgBox "没有找到相应的工作表!", vbOKCancel + vbCritical + vbDefaultButton1, "Msgbox测试"
在阅读这样的代码时就会遇到一些困难,那就是各个参数的值到底表示什么样的含义。为此可以将参数直接书写出来其格式为“参数名:=参数值”,并且在省略参数的位置上也不需要再保留逗号。
例如使用Msgbox函数来产生一个消息框,消息框的主题内容是“没有找到相应的工作表”,消息框的标题是“测试”,消息框中所产生的按钮使用默认值。
不使用命名参数的时候需要使用如下所示的代码,在使用默认值的位置用逗号代替。
MsgBox "没有找到相应的工作表!", , "测试"
而使用命名参数的时候,则可以直接将需要赋值的参数名称写出来,代码如下所示。使用默认值的位置上也不需要用逗号代替。
MsgBox prompt:="没有找到相应的工作表!", Title:="测试"
当某些函数或者方法参数很多,但是却只需要为少数参数赋值的情况下,用逗号代替不是一个好方法,因为很容易弄错逗号的个数,而使用命名参数则完全回避了这样的问题,用户只需要指定需要赋值的参数名称及参数值,对于无需赋值的参数,用户不需要理会。