到目前为止,我们已经编写了两三个简单的 VBA 程序,可能有些读者在运行这些程序时遇到了麻烦,比如,单击“运行”按钮后程序并没有马上执行,而是弹出一个选择窗口;或者弹出警告,禁止运行宏等。所以在这一节中,我们详细了解一下 VBA 程序的正确运行方式、保存方式和相关设置。
在运行VBA程序之前,首先要确认当前的Excel是否允许运行任意VBA程序。在默认情况下,Excel及其他各种Office软件都禁止运行VBA代码,原因在于,黑客会利用它编写一些病毒或木马等能够自动运行的恶意程序并保存在Office文档中。假如各种软件允许运行宏,用户一旦打开这些文档就会立马中招。
当我们需要运行可靠的 VBA 程序,并且确信 Office 文档中没有恶意代码时,可以将 Excel设置为“允许运行VBA”。在Office 2007及以后版本中,可以在“开发工具”选项卡中找到“宏安全性” 按钮。使用Office 2003及以前版本的用户,可以在“工具”菜单的子菜单“宏”中找到该功能。
单击“宏安全性”按钮后可以看到“宏设置”对话框及多个运行选项。如果想运行自己编写的VBA程序,一般要先选中“启用所有宏”(在早期版本的Office中为“安全级”选项卡里面的“中”或“低”),然后单击“确定”按钮退出即可。
读者可能会觉得奇怪:为什么用来管理VBA安全性的菜单,要被命名为“宏安全性”呢?所谓“宏”,其实是指用户会经常用到的一系列操作和指令 ,比如“①将背景设为红色;②将字号设置为16号;③将字体颜色设置为蓝色”。把这些指令保存在一起,并为其指定一个名字,比如高亮显示”,就新建了一个名为“高亮显示”的宏。以后每次需要高亮显示字体时,直接根据名字找到这个宏并运行就可以了。“
而在Office中,所有的宏都是以VBA代码的形式保存的。一个宏就是一个以“Sub”开始,以“End Sub”结束的VBA程序,与我们之前编写的代码完全相同。所以从这个角度看,宏就是普通VBA程序 的另一种称呼。
由于Excel等Office软件提供了“录制宏”功能,即使用户没有听说过VBA程序也能够自己录制一些常用操作,所以“宏”的概念比“VBA程序”更容易被普通用户接受。这就是在Office的选项卡和菜单中,普遍采用宏来代表 VBA 程序的原因。在没有做特别说明的情况下,本书也会将二者作为相同的概念使用。
在VBE的工具栏上可以看到 三个按钮,分别用于VBA程序的运行、暂停和终止(重置)。后两者一般用于程序调试过程中,本书会在相关章节介绍。使用三角形运行按钮是在VBE中执行VBA程序最快捷的方式。
不过这里有一个问题:既然一个模块中可以包含多个 VBA 程序,那么单击“运行”按钮之后,到底会执行代码窗口中显示的哪一个程序呢?VBE对此的规定是:光标在哪个程序的代码中闪烁,就执行哪个程序;如果光标不在任何程序代码中,则弹出一个对话框,请用户在所有程序中选择一个程序运行。
比如在图1.14所示的VBE界面中,如果想运行Demo2这个子程序,必须先用鼠标单击Sub Demo2()与End Sub之间的任意位置,确保代码窗口的光标能够在Demo2的代码范围内闪烁,再单击“运行”按钮,Demo2这个程序就会立即执行。如果用鼠标单击其他位置(比如End Sub下面的空白行),那么单击“运行”按钮就会弹出对话框,需要先选择“Demo2”,再单击“运行”按钮。
图1.14 如果光标没有在任何一个VBA程序中,单击
使用VBE中的“运行”按钮,优点在于可以在开发代码的过程中随时执行程序及检查结果,一切开发调试工作都可以在VBE界面中完成。但是对于使用这个程序完成日常工作的用户来说,这一方法就显得十分麻烦,因为用户必须先调出VBA编辑器,然后不断地在工作表和VBE两个界面中来回切换。所以这种方法只适合开发过程,编写好代码之后,应该使用下面介绍的方式运行程序。
单击Excel“开发工具”选项卡中的“宏”按钮,可以弹出“宏”对话框 。该对话框中列出了所有当前可以运行的VBA程序,用户只需选择并单击“运行”按钮,即可执行相应VBA程序。通过这种方式,我们可以在不打开VBE界面的情况下,直接在工作表中运行VBA程序。
在“宏”对话框中还可以直接创建一个新的 VBA 程序。只要在“宏名称”对话框中输入一个新的VBA程序名称,并单击“创建”按钮,Excel就可以自动转到VBE编程界面,并自动在当前工程中添加一个模块,还可以在该模块中自动写好“Sub”与“End Sub”两行代码。在临时开发一些简单程序时,这个工具用起来十分方便。
使用“宏”对话框虽然不必打开VBE,但用户仍然需要到选项卡和菜单栏中寻找“宏”按钮,并且还要记住每一个 VBA 程序的名字才能做出选择,因此这种运行方式对用户仍然不够友好。好在 Excel 还为我们提供了另外一些更加友好的运行方法,也就是下面介绍的“按钮”等表单控件及“形状”等图形元素。
单击“开发工具”选项卡的“插入”按钮,可以弹出“表单控件”和“ActiveX 控件”工具箱。选中“表单控件”中的第一项“按钮” ,光标将会变成十字花形状“+”,此时在 Excel工作表的任意位置按住鼠标左键,就可以绘制出一个矩形按钮,如图1.15所示。
图1.15 “开发工具”选项卡中的“插入”菜单和表单控件
绘制结束后松开鼠标,Excel会自动弹出“指定宏”对话框,询问该按钮与哪个VBA程序关联(也就是说,用户单击该按钮后应当运行哪个VBA程序)。在该对话框中选中一个VBA程序的名字,并单击“确定”按钮即可将该程序指定给这个按钮。用户也可以在之后的任何时刻,在该按钮上单击鼠标右键,并在弹出的菜单中选中“指定宏”选项,重新进入“指定宏”对话框对其进行修改。
按钮的外观尺寸和显示文字也可以随时被修改,以使其更加美观,让用户更加清楚地了解该按钮所执行的功能。只要在按钮上单击鼠标右键,使按钮的边框线上出现调整尺寸的八个圆圈(锚点),就进入了外部设计模式。此时拖动任意一个锚点都可以修改按钮的形状;而用鼠标左键单击按钮上的文字,就可以修改按钮标题。
事实上,“表单控件”中的任何一个元素(控件)都可以像按钮一样被插入工作表中,并且在发生某个特定操作时自动运行指定的VBA程序。比如,我们可以先插入一个“复选框 ”控件,然后用鼠标右键单击并在“指定宏”对话框中为其关联宏。这时只要选中或取消复选框,就会自动运行这个VBA程序。
“表单控件”下方的“ActiveX控件”工具箱同样提供了类似的控件,而且这些控件提供了更加丰富的功能和属性,可以实现一些复杂的控制功能和效果,本书后面对此有专门介绍。在一般情况下,使用“表单控件”中的按钮就可以满足很多日常需求了。
如果读者觉得“表单控件”按钮的外观过于死板,还可以考虑使用“形状”。比如,可以先在“插入”菜单中单击“形状”,然后选择一个圆角矩形插入到工作表中并设置它的各种外观属性,再单击鼠标右键选中“指定宏”选项,就可以将其关联到自己编写的 VBA 程序上。这样每当用鼠标单击这个形状时,Excel都会运行这个程序。
这种操作几乎适用于所有可以插入工作表中的图形元素,包括“图标”“Smart Art”“图片”及“联机图片”等。灵活使用这个操作,可以将 VBA 与用户数据非常漂亮地结合在一起,或者编写一些有趣的图形游戏。
严格来说,以上介绍的都是运行VBA“标准程序”的方法,也就是位于“标准模块”中的代码。而其他类型的 VBA 程序都有各自的运行途径,无法通过上述方式调用执行。比如,事件程序会在Excel发生某种状态变化时自动运行,窗体程序和类定义程序需要在其他VBA程序中调用执行,而用 VBA 编写的自定义函数则是像普通工作表函数一样由用户在单元格中引用执行等。对于这些执行方式,本书会在讲解相应类型VBA程序时再做介绍。
由于VBA与Office软件紧密结合在一起,所以很多Office操作和设置都有可能影响VBA程序的运行。其中最常见的一个原因,就是 Excel 工作表仍然处于编辑状态。假如我们有意或无意地双击了Excel工作表中的某个单元格,使其处于编辑状态(光标在单元格中闪烁),那么在切换到VBE界面后,VBA编辑器不会响应任何操作。此时不论单击“运行”按钮,还是尝试修改VBA代码,都不会成功。对于这种情况,我们必须回到 Excel 表格中,单击其他单元格使工作表脱离编辑状态,才能正常运行VBA。
编写完VBA程序之后,必须将它保存到一个文件中。否则一旦关闭Excel软件,之前编写的代码就会全部丢失,再打开Excel软件时将无法找回。
与用户在工作表中填写的数据一样,VBA 程序代码也要一起保存在这个工作簿文件中。在Excel 2003及之前版本中,工作簿是以“.xls”为扩展名的一个文件,比如“工资表.xls”。当我们在Excel界面或VBE 界面中执行“保存”或“另存为”命令后,程序代码就会和数据保存到同一个文件中。当我们希望再次运行该程序时,只要打开这个工作簿文件即可。
但是从Excel 2007开始,微软公司对文件格式进行了调整:在默认情况下,工作簿文件的扩展名为“.xlsx”,只能保存数据,不允许包含 VBA 程序代码。所以在编写完 VBA 程序以后,必须在“保存”或“另存为”对话框中将“保存类型”修改为“Excel启用宏的工作簿(*.xlsm)”,从而将其保存到一个扩展名为“.xlsm”的文件中,如图1.16所示。如果仍保存为默认的“.xlsx”文件,即使提示保存成功,再次打开时也将丢失全部VBA代码。
使用 Excel 2007或更新版本的读者,也可以选择将含有 VBA 程序的工作簿保存为“Excel 97-2003工作簿(*.xls)”,这样就能够在所有版本的Excel中打开并运行它。不过新版本的“.xlsm”文件在占用内存和效率方面相较于老版本的“.xls”文件有所优化,因此需要读者根据实际情况灵活选择。
图1.16 将工作簿保存为“Excel启用宏的工作簿
事实上,Excel还提供了“.xlam”“.xltm”等可以保存VBA程序的文件类型,这些文件专门用于开发“加载项”等特殊VBA程序,这里暂不详细介绍。