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

2.2 内置注册表函数

注册表是Windows系统中的一个系统数据库,主要存储硬件配置、软件设置等信息。注册表的操作主要有创建注册表项、删除注册表项、修改注册表项、读取注册表项等。

在实际编程过程中,可以把开发的程序中的一些变量的值存储在注册表中,也可以从注册表中读取内容,让程序加以利用。因此注册表操作很有必要学习和研究。

VBA操作注册表的方式有多种,本节介绍VBA、VB6的几个内置函数。

 GetSetting:根据指定的路径获取注册表项的值。

 GetSettings:与GetSetting类似,返回一个数组。

 SaveSetting:保存内容到注册表中。

 DeleteSetting:删除一个注册表项。

需要注意的是,上述4个内置函数的操作范围只限于HKEY_CURRENT_USER\Software\VB and VBA Program Setting这个键值内部。

按下快捷键【Windows +R】,输入regedit,按回车键即可弹出注册表编辑器。然后依次单击节点HKEY_CURRENT_USER\Software\VB and VBA Program Setting,就可以进入该文件夹中,如图2-19所示。

图2-19 VB、VBA专用的注册表项

以上四个内置函数的参数几乎都包含AppName、Section、Key三个层级。

以图中所选的节点为例,AppName、Section、Key依次是CnChessQipu、DataBase、FileName。

2.2.1 GetSetting

GetSetting的作用是从指定的层级获取Key的属性值,返回一个字符串。

运行上述过程,对话框中返回注册表中FileName的属性值,如图2-20所示。

与注册表中对比,完全一致,如图2-21所示。

图2-20 获取注册表信息

图2-21 核对获取的结果

需要注意的是,如果GetSetting函数的三个参数中的任何一个写错,都将造成找不到注册表项,不会出现运行错误,而是返回一个空字符串。

2.2.2 SaveSetting

在使用SaveSetting函数的过程中,如果指定的层级存在,就修改现有层级的属性值;如果层级不存在,则会自动创建层级路径。

SaveSetting是对注册表的修改,没有返回值,因此后面的参数不需要括号。

运行下面的过程,修改FileName这个Key的属性值。

刷新一下注册表,看到属性值已修改,如图2-22所示。

图2-22 修改注册表信息

在编程开发过程中,经常需要在一个Section下面建立多个Key,此时会对应多个属性值。下面以世界各国信息为例,说明一下注册表项的存取过程,如表2-3所示。

表2-3 世界各国基本信息表

假设要把表2-3中的内容保存到注册表中,那么“国家”这一列就相当于Section,而首都、国土面积和人口都是Key,要分别保存。以上所有项目都位于“世界大国”这个AppName下面。

运行上述过程,刷新注册表,可以看到注册表中已存在相关信息,如图2-23所示。

图2-23 批量存入注册表

2.2.3 DeleteSetting

DeleteSetting用于删除一个注册表节点,这里的节点可以是AppName、Section、Key中的任何一个。

DeleteSetting需要指定的参数也是三个,但是根据需要,可以更改参数个数。规定的参数越少,删除的层级越高,删除的内容也越多。

    DeleteSetting "世界大国", "加拿大",  "国土面积"

表示删除加拿大的国土面积这个Key和属性。

    DeleteSetting "世界大国", "加拿大"

表示删除加拿大这个Section,也就是删除加拿大这个文件夹。

    DeleteSetting "世界大国"

将会删除整个AppName根节点。

2.2.4 GetAllSettings

获取注册表的方法,除了前面讲过的GetSetting函数以外,还可以用GetAllSettings函数一次性获取一个Section下面的所有Key及其属性值。获取到的内容是一个多行2列的二维数组。

下面的代码把“中国”这个Section的所有属性装载到字符串数组v()中。

单步执行上述过程,可以在本地窗口看到v()是一个3行2列的二维数组,如图2-24所示。

图2-24 一次性获取全部注册表信息

为了把数组放到Excel单元格中,采用Range的Resize方法根据数组大小自动扩展区域。运行上述过程后,表格单元格的结果如图2-25所示。

以上内容的源代码文件为“实例文档07.xlsm”。

以上四个注册表操作函数一般用于产品开发时存取程序信息,如果要操作其他场所的注册表项,需要用到2.3节讲述的WshShell对象。

图2-25 将注册表信息发送到单元格