2.3 使用WshShell操作注册表
WshShell对象可以运行程序、操作注册表、创建快捷方式、访问系统文件夹、管理环境变量等。
要在VBA中使用该对象,需要向工程添加外部引用“Windows Script Host Object Model”,如图2-26所示。
图2-26 添加外部引用
代码中声明为:
Dim WS As New IWshRuntimeLibrary.WshShell
后期绑定方式为:
Set WS = CreateObject("WScript.Shell")
WshShell对象中,用于操作注册表的函数有如下三个。
RegRead:读注册表项。
RegWrite:写注册表项。
RegDelete:删除注册表项。
2.3.1 读注册表项
在使用RegRead函数时,只需要一个注册表项的完整路径即可返回注册表值。
Excel 2013的宏安全性设置其实是保存在注册表中的,通过查看注册表编辑器,按照如下路径可以找到Security节点,如图2-27所示。
HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Excel\Security
图2-27 注册表信息
可以看到下面有一个Key为VBAWarnings,Key的取值对应于Excel宏安全性的设置(从上到下的4个单选按钮对应的属性值依次是4、2、3、1),如图2-28所示。
图2-28 VBA安全性级别与注册表的对应关系
也就是说,手工在Excel中修改了宏安全性级别,注册表会同步变化;反之,通过注册表修改VBAWarnings的属性值,Excel的宏安全性也同步发生变化。
下面的代码用来判断当前Excel的宏安全性。
以上代码运行后,返回一个十进制数1,表示“启用所有宏”。
注意 如果RegRead函数中的注册表路径不存在,则会弹出“自动化”错误,如图2-29所示。
为了确保注册表路径书写不出问题,可以在注册表编辑器中右击节点,在弹出菜单中选择“复制项名称”命令,可以把完整路径复制到剪贴板,如图2-30所示。
图2-29 注册表路径不存在引起的错误
图2-30 复制项名称
2.3.2 写注册表项
与RegRead函数相对应的是RegWrite方法,该方法用于修改注册表的值。
RegWrite方法包含以下3个参数。
Name:注册表的路径字符串。
Value:要设定的值。
Type:注册表项的类型,可以是REG_SZ(字符串值)、REG_DWORD(DWORD 32位置)、REG_BINARY(二进制值)。
下面的过程,通过改变注册表值,自动修改Excel 2013的宏安全性为“禁用所有宏,并发出通知”。
代码分析:根据注册表编辑器,可以看到该注册表项的类型是一个DWORD值,因此Type参数设置为“REG_DWORD”。
2.3.3 删除注册表项
RegDelete方法的语法非常简单,只需要规定注册表项的路径即可。
下面的代码删除注册表中的Key VBAWarnings。
实际上,注册表和资源管理器类似,也是一个树状结构,严格地讲,RegDelete方法不仅可以删除Key,还可以删除各层级的文件夹。也就是说:
RegDelete "HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Excel\Security\"
理论上可以删除Security整个文件夹,但微软不允许用户删除,因此运行时可能会出错。
最后演示一个用代码自动读取、设置记事本的字体名称。Notepad是Windows系统的默认程序,属于微软开发的产品。在注册表中查看该节点,可以看到右侧有大量的Key,这些其实就是记事本的配置信息,如图2-31所示。
图2-31 记事本程序的注册表信息
可以看到字体名称的Key是lfFaceName,这是一个REG_SZ字符串,当前字体为“宋体”。
下面的过程首先读取记事本程序的字体名称,然后用RegWrite方法设置为“华文仿宋”。
运行上述代码后,再次打开记事本程序,可以看到字体风格已改变,如图2-32所示。
图2-32 修改注册表,从而修改记事本程序的字体设置
2.3.4 创建新项
在编程过程中,除了修改现有项目外,很多情况下需要创建新的子项。
例如HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\Addins\customUI_Excel这个注册表项类似于资源管理器中的文件夹,该注册表项的本身属性是一个字符串:“By Ryueifu”,此外,该注册表项还包括4个属性子项。
Description字符串子项:属性值是CustomUI_Excel。
FriendlyName字符串子项:属性值是CustomUI_Excel。
LoadBehavior整数子项:属性值是2。
Manifest字符串子项:属性值是一个路径文本。
右击注册表项,可以在弹出菜单中为已有子项的注册表项添加新的子项,如图2-33所示。
图2-33 为注册表创建新项
在注册表中右击customUI_Excel注册表项,在弹出菜单中可以新建属性子项,也可以新建类似于文件夹一样的目录子项。
使用VBA同样可以创建新项。下面的过程包含4个修改注册表命令,其中前两个修改现有子项的数值,第3个命令增加一个名为Version的属性子项,第4个命令增加一个名为User的目录子项。
运行上述过程,customUI_Excel的注册表项发生变化,如图2-34所示。
图2-34 使用代码自动修改注册表
需要特别注意的是,注册表路径末尾是否添加反斜杠,对操作后的影响非常大,例如RegWrite Name:=parent & "customUI_Excel\", Value:="Ryukou"这一句的含义是修改customUI_Excel的默认属性为Ryukou。
如果写成RegWrite Name:=parent & "customUI_Excel", Value:="Ryukou"则表示在Addins这个注册表项下面创建一个名为customUI_Excel的属性子项!
因此,在VBA中使用RegRead、RegWrite和RegDelete方法对注册表项进行操作时,一定要思考加与不加反斜杠的区别。
以上内容的源代码文件为“实例文档08.xlsm”。