Office VBA开发经典:中级进阶卷
上QQ阅读APP看书,第一时间看更新

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”。