2.3 VBA的安全性
20世纪90年代宏病毒泛滥,使人们对宏以及宏的安全性都有所了解。但事实上很多用户只通过宏毒病的传播了解宏的部分特点,这自然是很片面的。
2.3.1 VBA安全性
事物都有双面性,程序语言尤其如此。程序的功能越强,那么同时意味着用它做破坏也可以具有更大的破坏力。VBA依附于Excel程序,但它作为病毒传播时,可以破坏的对象却不局限于Excel程序,磁盘中所有文件皆可以任意修改。正因为如此,学习VBA时,有必要掌握好这把双刃剑。
在默认状态下,Excel 2003和Excel 2007都是禁用宏的,以确保用户数据不会因潜在的宏病毒而受破坏。但是同时也带来另一个问题——正常的VBA程序无法执行。所以通常有三种做法:
不用VBA程序的用户,彻底禁用宏,杜绝宏病毒蔓延。
常用VBA程序,包括自己开发和别人开发程序的用户,可以将宏的安全性稍加提高,即遇到宏时提示用户,当用户确定代码安全后再执行。
第三类自编自用型用户或者完全信任宏代码的开发者用户,则可以将宏的默认设置修改为无限制。即允许任何宏执行,从而提升工作效率。
2.3.2 了解安全性对话框
Excel 2007有两个安全性对话框。一个是打开带有宏代码时提示用户的“安全选项”对话框,如图2.2所示;另一个是位于Excel选项中的“信任中心”对话框,如图2.3所示。
图2.2 Microsoft Office安全选项
1.安全选项
当启动一个具有宏代码的工作簿或者启动一个COM加载宏时,默认状态下在Excel编辑栏上方会弹出一个“安全警告 部分活动内容已被禁用”的提示框(根据加载宏的类型不同,显示的文字也会有所差异)。当用户单击“选项”按钮后再次弹出一个“安全选项”窗口,在窗口中将罗列出所有被阻止的加载项。本例中有两个,包括一个xla格式的加载宏和一个DLL格式的COM加载项。
如果确认需要在工作簿使用某个加载项,或者信任该加载项中的代码,则选择“启用此内容”,然后单击“确定”按钮,安全警告对话框消失,而相关加载项所携带的代码也可以任意调用了。
图2.3 Excel信任中心
2.信任中心
前面所说的每次在开启工作簿时启用自己信任的插件或者宏工作簿,虽然确保了安全,事实上效率不高,操作上较烦琐。而设置信任中心可以一劳永逸的解决上述问题。
进入信任中心步骤如下:
01 单击左上角的圆形Office按钮;
02 选择“Excel选项”按钮打开“Excel选项”对话框;
03 单击左边的“信任中心”按钮即可显示“信任中心”对话框,如图2.3所示。
Excel选项的信任中心主要用于管理宏的安全性问题,它包括“受信任的发布者”、“受信任位置”、“加载项”、“ActiveX设置”、“宏设置”、“消息栏”、“外部内容”和“个人信息选项”共8个选项,作用如下。
受信任的发布者:罗列出本系统中所有数字签名证书。证书是文档中电子的、基于加密的安全验证戳。此签名确认该宏或文档来自签发者且没有被篡改,表明您认为该数据库是安全的并且其内容是可信的。这可以帮助数据库的用户确定是否信任该数据库及其内容。
受信任位置:表示该位置下存放的代码是受信任的,不受宏的安全性设置的影响,任何情况下都会执行其代码。在本对话框中罗列了Excel默认设置下的几个位置。用户也可以手工添加新的受信任位置。通常可以将自己编写的代码所存放的目录设置为受信任位置,以避免每次手工启用宏。
加载项:添加或者删除加载项,包括xla、xlam、DLL和xll格式的加载项。在本对话框中可以手工安装以及删除所有格式的插件。而笔者的习惯是把xla格式或者xlam格式的插件直接存到Excel自启动文件夹中,免除安装。对于COM加载项,即DLL格式的插件则可以使用本对话框中手工安装。获取自动启动的路径可以使用以下代码。
Sub 自启动路径() MsgBox Application.StartupPath End Sub
以上代码获取的是用户级自启动路径,即只对当前用户发生作用。如果需在任何用户打开Excel都可以启动插件中的宏,那么可以用以下路径:
C:\Program Files\Microsoft Office\Office12\XLSTART
其中Office12表示Office 2007的路径,如果用户安装的是Office 2003,则修改为Office11;另外“C:”也需要根据实际情况修改,例如Office安装在D盘则用“D:”。
ActiveX设置:控制ActiveX控件的启动方式,可以禁用ActiveX控件且不发出通知,达到最高的安全性。也可以禁止通知用户选择,还可以默认允许执行,以提高效率。在此处,效率和安全性是相冲突的。
宏设置:宏设置类似于ActiveX设置,它是对携带宏代码的工作簿进行安全限制。同样包括与ActiveX设置相似的选项。不过最下边的“信任对VBA工程对象模型的访问”则不控制宏的运行,而是用于控制代码对VBE环境的操作。默认状态下是禁用代码操作VBE环境中任何组件的,打勾后才允许读取或者修改VBE的任何组件,例如在VBE窗口中新建一个菜单,或者删除VBA代码模块。
消息栏:控制Excel是否弹出消息栏,即阻止宏运行时是否通知用户。默认状态是要发出通知。
外部内容:所谓外部内容是指工作表中的公式引发其他工作簿,包括加载宏中的数据。本选项决定是否禁止引用以及是否弹出提示。在确保数据安全的前提下尽量选择数据链接和自动更新,以提升效率。
个人信息选项:本选项包括几个与网络相关的信息,在网络不可用的情况下设置无效。而网络畅通的情况下数据引用也比较慢,建议不再启用所有选项。
2.3.3 让自己的VBA程序畅通无阻
根据前面的描述,Excel默认状态下是禁止宏代码和ActiveX控件运行的。而对于自己编写的完全可以信任的代码也产生了阻碍作用,这促使用户需要对其进行设置,让代码默认即可执行。
让自己的VBA程序畅通无阻有两种方式,签署数字证书和设置受信任位置。从操作程序比较,设置受信任位置是最快速、最方便的办法。下面以安装“D:\工具箱\批量获取身份证信息.xla”为例演示如何让程序自启动而不被Excel阻止。
01 在D盘新建文件夹,命名为“工具箱”;
02 将“批量获取身份证信息.xlam”插件复制到“工具箱”文件夹中;
03 单击【Office按钮】\【Excel选项】\【信任中心设置】\【受信任位置】\【添加新位置】打开“Microsoft Office受信任位置”对话框,该对话框中默认显示Office临时文件夹路径;
04 在“Microsoft Office受信任位置”对话框的“路径”文字框中输入“D:\工具箱\”,并勾选“同时信任此位置的子文件夹”,在“说明”文字框中输入说“我的信任位置”,如图2.4所示;
图2.4 设置受信任位置对话框
05 单击“确定”按钮后返回“受信任位置”,在列表中将会显示新增加的地址“D:\工具箱”;
06 单击“确定”按钮后返回“Excel选项”对话框,单击左边的“加载项”按钮,再在底部的“管理”下拉列表中选择“Excel加载项”,单击“转到”按钮打开“加载宏对话框”。该对话框中罗列了所有已安装的内置加载宏和外置加载宏,如图2.5所示。
07 单击“浏览”按钮,从对话框中选择“D:\工具箱”中的“批量获取身份证信息.xla”,然后返回加载宏对话框,可以发现插件列表中已经新增了一项:“批量获取身份证信息”,如图2.6所示;
图2.5 加载宏对话框
图2.6 加载xla格式的插件
08 经过以上设置后,重启Excel,可以看到插件已经可以正常运行,不会弹出任何阻止宏执行的对话框。
注意
将插件直接放到自启动路径中也可以实现不弹出阻止宏运行的对话框,且默认允许所有代码运行。但是它的缺点是不在“加载宏”列表中出现,不便于随时卸载与安装。而利用“加载宏”对话框安装的工具可以用在方框中打勾或者不打勾来表示安装与卸载。