![Office VBA开发经典:中级进阶卷](https://wfqqreader-1252317822.image.myqcloud.com/cover/711/26542711/b_26542711.jpg)
2.3 使用WshShell操作注册表
WshShell对象可以运行程序、操作注册表、创建快捷方式、访问系统文件夹、管理环境变量等。
要在VBA中使用该对象,需要向工程添加外部引用“Windows Script Host Object Model”,如图2-26所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/826.jpg?sign=1739145970-Mgy6ORKs42E3DuFXtkdMf3HJobp64a9L-0-c1236e46ce56eba66a3e893ecab8c523)
图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
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/828.jpg?sign=1739145970-PPGQBCpkHFPYl6I9MDC4S253hoJtQ5Jq-0-8e2fdf081b0014c03df856abd8c853cb)
图2-27 注册表信息
可以看到下面有一个Key为VBAWarnings,Key的取值对应于Excel宏安全性的设置(从上到下的4个单选按钮对应的属性值依次是4、2、3、1),如图2-28所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/829.jpg?sign=1739145970-P7Dgbeh3xYtV1KB2l7AJMPCDGAaXhZ88-0-db6ff6e1acc825ddc787bfb874224010)
图2-28 VBA安全性级别与注册表的对应关系
也就是说,手工在Excel中修改了宏安全性级别,注册表会同步变化;反之,通过注册表修改VBAWarnings的属性值,Excel的宏安全性也同步发生变化。
下面的代码用来判断当前Excel的宏安全性。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/830.jpg?sign=1739145970-ht9GuD5V4yd5RlJzjMPWSWmKFLXL16fZ-0-44dde0f35427906ae00cc50b2e4dac5d)
以上代码运行后,返回一个十进制数1,表示“启用所有宏”。
注意 如果RegRead函数中的注册表路径不存在,则会弹出“自动化”错误,如图2-29所示。
为了确保注册表路径书写不出问题,可以在注册表编辑器中右击节点,在弹出菜单中选择“复制项名称”命令,可以把完整路径复制到剪贴板,如图2-30所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/831.jpg?sign=1739145970-9welwEVX8Vn9qrmW9Vf08wBFEh2bxFAs-0-a94ec0b4a75064399660676323499fb5)
图2-29 注册表路径不存在引起的错误
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/832.jpg?sign=1739145970-KaNtwW6fc7WJlA626c6ImSRhFaruKe2c-0-b7129cf401addfd9394a9888fa96dd06)
图2-30 复制项名称
2.3.2 写注册表项
与RegRead函数相对应的是RegWrite方法,该方法用于修改注册表的值。
RegWrite方法包含以下3个参数。
Name:注册表的路径字符串。
Value:要设定的值。
Type:注册表项的类型,可以是REG_SZ(字符串值)、REG_DWORD(DWORD 32位置)、REG_BINARY(二进制值)。
下面的过程,通过改变注册表值,自动修改Excel 2013的宏安全性为“禁用所有宏,并发出通知”。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/833.jpg?sign=1739145970-20tPMbww7ktdOvVnaOd4SDuMMZIpcHb9-0-328c3fa8f0e1152f29c06205e97e9529)
代码分析:根据注册表编辑器,可以看到该注册表项的类型是一个DWORD值,因此Type参数设置为“REG_DWORD”。
2.3.3 删除注册表项
RegDelete方法的语法非常简单,只需要规定注册表项的路径即可。
下面的代码删除注册表中的Key VBAWarnings。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/835.jpg?sign=1739145970-3d2wEyeyTWvhoNwB0m7aizrdGZ3wDpm4-0-7256bcfef60e02e51987ee30359578e5)
实际上,注册表和资源管理器类似,也是一个树状结构,严格地讲,RegDelete方法不仅可以删除Key,还可以删除各层级的文件夹。也就是说:
RegDelete "HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Excel\Security\"
理论上可以删除Security整个文件夹,但微软不允许用户删除,因此运行时可能会出错。
最后演示一个用代码自动读取、设置记事本的字体名称。Notepad是Windows系统的默认程序,属于微软开发的产品。在注册表中查看该节点,可以看到右侧有大量的Key,这些其实就是记事本的配置信息,如图2-31所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/834.jpg?sign=1739145970-UrfmM560VFJjan4A1Y6njPSZd21GhrnB-0-2a333515e502a3f79869085e3438599f)
图2-31 记事本程序的注册表信息
可以看到字体名称的Key是lfFaceName,这是一个REG_SZ字符串,当前字体为“宋体”。
下面的过程首先读取记事本程序的字体名称,然后用RegWrite方法设置为“华文仿宋”。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/838.jpg?sign=1739145970-rMhu1NQULr56kuJJme5jeidh5DM3H7Og-0-413050f93b3809827d5751dcca4ec954)
运行上述代码后,再次打开记事本程序,可以看到字体风格已改变,如图2-32所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/837.jpg?sign=1739145970-IUpdt9JXAtgOABjL6h8UHGKFzwfIMpGY-0-3339cbfc4619607c124d94d24208993d)
图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所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/836.jpg?sign=1739145970-SUgXhiYd4ZtJ1aHioSRbfrOkSNZMAsYU-0-da18fa1b848bf17f624620c6062c6691)
图2-33 为注册表创建新项
在注册表中右击customUI_Excel注册表项,在弹出菜单中可以新建属性子项,也可以新建类似于文件夹一样的目录子项。
使用VBA同样可以创建新项。下面的过程包含4个修改注册表命令,其中前两个修改现有子项的数值,第3个命令增加一个名为Version的属性子项,第4个命令增加一个名为User的目录子项。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/840.jpg?sign=1739145970-f5eSILfpJvQTxntNWxeeoowleKJzM358-0-ddab0969529d4b31d3e2745eb31acf38)
运行上述过程,customUI_Excel的注册表项发生变化,如图2-34所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/839.jpg?sign=1739145970-fYb2EvBzWtWEBV6WVsyPoVbW9Rcich1w-0-1235fc195f642522961f65c9ea745cf6)
图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”。