1.4.2 运行VBA程序的常用方法
1.使用VBE中的“运行”按钮
在VBE的工具栏上可以看到 三个按钮,分别用于VBA程序的运行、暂停和终止(重置)。后两者一般用于程序调试过程中,本书会在相关章节介绍。使用三角形运行按钮是在VBE中执行VBA程序最快捷的方式。
不过这里有一个问题:既然一个模块中可以包含多个 VBA 程序,那么单击“运行”按钮之后,到底会执行代码窗口中显示的哪一个程序呢?VBE对此的规定是:光标在哪个程序的代码中闪烁,就执行哪个程序;如果光标不在任何程序代码中,则弹出一个对话框,请用户在所有程序中选择一个程序运行。
比如在图1.14所示的VBE界面中,如果想运行Demo2这个子程序,必须先用鼠标单击Sub Demo2()与End Sub之间的任意位置,确保代码窗口的光标能够在Demo2的代码范围内闪烁,再单击“运行”按钮,Demo2这个程序就会立即执行。如果用鼠标单击其他位置(比如End Sub下面的空白行),那么单击“运行”按钮就会弹出对话框,需要先选择“Demo2”,再单击“运行”按钮。
图1.14 如果光标没有在任何一个VBA程序中,单击“运行”按钮会弹出“宏”对话框(本图中的Demo2程序就是1.3节中课堂练习的答案)
使用VBE中的“运行”按钮,优点在于可以在开发代码的过程中随时执行程序及检查结果,一切开发调试工作都可以在VBE界面中完成。但是对于使用这个程序完成日常工作的用户来说,这一方法就显得十分麻烦,因为用户必须先调出VBA编辑器,然后不断地在工作表和VBE两个界面中来回切换。所以这种方法只适合开发过程,编写好代码之后,应该使用下面介绍的方式运行程序。
2.使用Excel中的“宏”对话框
单击Excel“开发工具”选项卡中的“宏”按钮,可以弹出“宏”对话框[7]。该对话框中列出了所有当前可以运行的VBA程序,用户只需选择并单击“运行”按钮,即可执行相应VBA程序。通过这种方式,我们可以在不打开VBE界面的情况下,直接在工作表中运行VBA程序。
在“宏”对话框中还可以直接创建一个新的 VBA 程序。只要在“宏名称”对话框中输入一个新的VBA程序名称,并单击“创建”按钮,Excel就可以自动转到VBE编程界面,并自动在当前工程中添加一个模块,还可以在该模块中自动写好“Sub”与“End Sub”两行代码。在临时开发一些简单程序时,这个工具用起来十分方便。
使用“宏”对话框虽然不必打开VBE,但用户仍然需要到选项卡和菜单栏中寻找“宏”按钮,并且还要记住每一个 VBA 程序的名字才能做出选择,因此这种运行方式对用户仍然不够友好。好在 Excel 还为我们提供了另外一些更加友好的运行方法,也就是下面介绍的“按钮”等表单控件及“形状”等图形元素。
3.使用“按钮”等表单控件
单击“开发工具”选项卡的“插入”按钮,可以弹出“表单控件”和“ActiveX 控件”工具箱。选中“表单控件”中的第一项“按钮”,光标将会变成十字花形状“+”,此时在 Excel工作表的任意位置按住鼠标左键,就可以绘制出一个矩形按钮,如图1.15所示。
图1.15 “开发工具”选项卡中的“插入”菜单和表单控件
绘制结束后松开鼠标,Excel会自动弹出“指定宏”对话框,询问该按钮与哪个VBA程序关联(也就是说,用户单击该按钮后应当运行哪个VBA程序)。在该对话框中选中一个VBA程序的名字,并单击“确定”按钮即可将该程序指定给这个按钮。用户也可以在之后的任何时刻,在该按钮上单击鼠标右键,并在弹出的菜单中选中“指定宏”选项,重新进入“指定宏”对话框对其进行修改。
按钮的外观尺寸和显示文字也可以随时被修改,以使其更加美观,让用户更加清楚地了解该按钮所执行的功能。只要在按钮上单击鼠标右键,使按钮的边框线上出现调整尺寸的八个圆圈(锚点),就进入了外部设计模式。此时拖动任意一个锚点都可以修改按钮的形状;而用鼠标左键单击按钮上的文字,就可以修改按钮标题。
事实上,“表单控件”中的任何一个元素(控件)都可以像按钮一样被插入工作表中,并且在发生某个特定操作时自动运行指定的VBA程序。比如,我们可以先插入一个“复选框”控件,然后用鼠标右键单击并在“指定宏”对话框中为其关联宏。这时只要选中或取消复选框,就会自动运行这个VBA程序。
“表单控件”下方的“ActiveX控件”工具箱同样提供了类似的控件,而且这些控件提供了更加丰富的功能和属性,可以实现一些复杂的控制功能和效果,本书后面对此有专门介绍。在一般情况下,使用“表单控件”中的按钮就可以满足很多日常需求了。
4.插入图形元素
如果读者觉得“表单控件”按钮的外观过于死板,还可以考虑使用“形状”。比如,可以先在“插入”菜单中单击“形状”,然后选择一个圆角矩形插入到工作表中并设置它的各种外观属性,再单击鼠标右键选中“指定宏”选项,就可以将其关联到自己编写的 VBA 程序上。这样每当用鼠标单击这个形状时,Excel都会运行这个程序。
这种操作几乎适用于所有可以插入工作表中的图形元素,包括“图标”“Smart Art”“图片”及“联机图片”等。灵活使用这个操作,可以将 VBA 与用户数据非常漂亮地结合在一起,或者编写一些有趣的图形游戏。
5.其他运行方式
严格来说,以上介绍的都是运行VBA“标准程序”的方法,也就是位于“标准模块”中的代码。而其他类型的 VBA 程序都有各自的运行途径,无法通过上述方式调用执行。比如,事件程序会在Excel发生某种状态变化时自动运行,窗体程序和类定义程序需要在其他VBA程序中调用执行,而用 VBA 编写的自定义函数则是像普通工作表函数一样由用户在单元格中引用执行等。对于这些执行方式,本书会在讲解相应类型VBA程序时再做介绍。
6.VBA程序还是不能运行怎么办
由于VBA与Office软件紧密结合在一起,所以很多Office操作和设置都有可能影响VBA程序的运行。其中最常见的一个原因,就是 Excel 工作表仍然处于编辑状态。假如我们有意或无意地双击了Excel工作表中的某个单元格,使其处于编辑状态(光标在单元格中闪烁),那么在切换到VBE界面后,VBA编辑器不会响应任何操作。此时不论单击“运行”按钮,还是尝试修改VBA代码,都不会成功。对于这种情况,我们必须回到 Excel 表格中,单击其他单元格使工作表脱离编辑状态,才能正常运行VBA。