ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 9650|回复: 6

[分享] 操作注册表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-7-30 17:24 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:注册表
使用vba内置的savesetting等语句可以可以操作注册表,但是这些内置语句只能操作注册表中\HKEY_CURRENT_USER\Software\VB and VBA Program Settings\下的子键或注册表项,使用WMI对象的StdRegProv类可以操作注册表,并且没有范围限制、功能更强大。
WMI是Windows Management Instrumentation (Windows管理工具)的缩写,是一项核心的 Windows 管理技术。使用WMI对象可以管理Windows系统中的磁盘、事件日志、文件、文件夹、文件系统、网络组件、操作系设置、性能数据、打印机、进程、注册表设置、安全性、服务、共享、用户、组等等。相关资料可以参考:http://club.excelhome.net/thread-733445-1-1.html
WMI对象的StdRegProv类提供了多种操作注册表的方法,这里只是简单演示其中的几个常用方法,感兴趣的朋友可以查询StdRegProv类操作注册表的全部方法的使用说明。
Sub WMIReg()
    Dim vValue
    Dim vName
    Dim vType
    Dim i As Integer
    Dim strTemp As String
    Dim objWMI As Object
    Const HKEY_CURRENT_USER = &H80000001
    Set objWMI = GetObject("winmgmts:\\.\root\default:StdRegProv")
    objWMI.CreateKey HKEY_CURRENT_USER, "MyTest\测试"
    objWMI.SetBINARYValue HKEY_CURRENT_USER, "MyTest\测试", "测试1", Array(&H0, &H0, &H1)
    objWMI.SetStringValue HKEY_CURRENT_USER, "MyTest\测试", "测试2", "2"
    objWMI.SetDWORDValue HKEY_CURRENT_USER, "MyTest\测试", "测试3", 3
    objWMI.GetBinaryValue HKEY_CURRENT_USER, "MyTest\测试", "测试1", vValue
    For i = 0 To UBound(vValue)
        strTemp = strTemp & vValue(i)
    Next
    MsgBox "注册表项“测试1”的值是:" & strTemp
    objWMI.DeleteValue HKEY_CURRENT_USER, "MyTest\测试", "测试1"
    objWMI.EnumValues HKEY_CURRENT_USER, "MyTest\测试", vName, vType
    strTemp = "子键“测试”下共有" & UBound(vName) + 1 & "个项:" & vbCrLf
    strTemp = strTemp & "名称" & vbTab & "值" & vbCrLf
    For i = 0 To UBound(vName)
        If vType(i) = 1 Then
            objWMI.GetStringValue HKEY_CURRENT_USER, "MyTest\测试", vName(i), vValue
        ElseIf vType(i) = 4 Then
            objWMI.GetDWORDValue HKEY_CURRENT_USER, "MyTest\测试", vName(i), vValue
        End If
        strTemp = strTemp & vName(i) & vbTab & vValue & vbCrLf
    Next
    MsgBox strTemp
    objWMI.DeleteKey HKEY_CURRENT_USER, "MyTest\测试"
    objWMI.DeleteKey HKEY_CURRENT_USER, "MyTest"
End Sub
代码解析:
第8行代码声明注册表根键常量。
第9行代码使用GetObject函数返回StdRegProv类的实例并赋值给对象变量objWMI
第10行代码在注册表根键“HKEY_CURRENT_USER”中创建子键“MyTest”,在子键“MyTest”中创建子键“测试”。
StdRegProv对象的CreateKey方法在注册表根键中创建指定的子键,其语法如下:
Object. CreateKey (hDefKey, sSubKeyName)
参数hDefKey是可选的,一个注册表根键常量,指定要操作的注册表根键。默认值为 HKEY_LOCAL_MACHINE,可为下面的常量之一。
常量        值
HKEY_CLASSES_ROOT        0x80000000
HKEY_CURRENT_USER        0x80000001
HKEY_LOCAL_MACHINE        0x80000002
HKEY_USERS        0x80000003
HKEY_CURRENT_CONFIG        0x80000005
参数sSubKeyName是必需的,一个字符串表达式,指定要创建的子键名称。
第11行代码在子键“MyTest”中创建一个二进制注册表项“测试1”并设置其值。
StdRegProv对象的SetBinaryValue方法创建或设置二进制类型的注册表项。语法如下:
Object. SetBinaryValue(hDefKey, sSubKeyName, sValueName, uValue)
参数hDefKey、sSubKeyName和CreateKey方法相同。
参数sValueName是必需的,一个字符串表达式,指定注册表项的名称。
参数uValue是必需的,一个二进制数组,指定注册表项的值。
第12行代码在子键“MyTest”中创建一个字符串注册表项“测试2”并设置其值。
StdRegProv对象的SetStringValue方法创建或设置字符串类型的注册表项。语法如下:
Object. SetStringValue (hDefKey, sSubKeyName, sValueName, uValue)
参数hDefKey、sSubKeyName、sValueName和SetBinaryValue方法相同。
参数sValue是必需的,一个字符串表达式,指定注册表项的值。
第13行代码在子键“MyTest”中创建一个双字节注册表项“测试3”并设置其值。
StdRegProv对象的SetDWORDValue方法创建或设置双字节类型的注册表项。语法如下:
Object. SetDWORDValue (hDefKey, sSubKeyName, sValueName, uValue)
参数hDefKey、sSubKeyName、sValueName和SetStringValue方法相同。
参数sValue是必需的,一个双字数据,指定注册表项的值。
第14行代码获取注册表项“测试1”的值并存储到数组vValue。
StdRegProv对象的GetBinaryValue方法获取二进制注册表项的值并存储到指定的二进制数组中。其语法及参数设置和SetBinaryValue相同。
第15行到第17行代码在循环中读取数组vValue中的值并赋值给变量strTemp。
第19行代码删除注册表项“测试1”。
StdRegProv对象的DeleteValue 方法删除指定的注册表项。其语法如下:
Object. DeleteValue(hDefKey, sSubKeyName, sValueName)
参数hDefKey、sSubKeyName、sValueName和SetStringValue方法相同。
第20行代码获取子键“测试”中所有注册表项的名称和值并存储到数组vName和vType。
StdRegProv对象的EnumValues方法获取获取指定子键中所有注册表项的名称和值,并把所有注册表项的名称和值分别存储到指定的数组中。语法如下:
Object.EnumValues(hDefKey, sSubKeyName, sNames, iTypes)
参数hDefKey、sSubKeyName和SetStringValue方法相同。
参数sNames是必需的,一个字符串数组,用来存储所有注册表项的名称。此数组的元素与 iTypes 的元素一一对应。
参数iTypes是必需的,一个整数数组,用来存储所有注册表项的类型。
第23行到第30行代码在循环中判断vType数组中每个元素的值(每个值代表一种注册表项类型,其值可为下面的常量之一),并根据注册表项的类型使用相应的方法获取其值。
常量        值
REG_SZ(字符串型)        1
REG_EXPAND(可扩充字符串型)        2
REG_BINARY(二进制型)        3
REG_DWORD(双字节型)        4
REG_MULTI_SZ(多字符串型)        7
第32行代码删除注册表键“测试”。
StdRegProv对象的DeleteKey 方法删除指定的注册表键。其语法及参数设置和如下:
Object. DeleteKey (hDefKey, sSubKeyName, sValueName)
参数hDefKey、sSubKeyName和CreateKey方法相同。它只能删除没有子项的注册表键。
第33行代码删除注册表键“MyTest”。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-7-30 17:59 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-7-30 19:00 | 显示全部楼层
谢谢王版主分享

在ADO查询Excel工作表时,如果某个字段是文本和数字混排,通常加一个IMEX=1解决,但需要修改注册表:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel修改TypeGuessRows
我想改为60000就足够了(十进制),请王版给个VBA代码

TA的精华主题

TA的得分主题

发表于 2013-7-30 19:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-8-4 16:56 | 显示全部楼层
zhaogang1960 发表于 2013-7-30 19:00
谢谢王版主分享

在ADO查询Excel工作表时,如果某个字段是文本和数字混排,通常加一个IMEX=1解决,但需要 ...

赵老师好,才看到
Private Sub CommandButton1_Click()
    Dim objWMI As Object
    Const HKEY_LOCAL_MACHINE = &H80000002
    Set objWMI = GetObject("winmgmts:\\.\root\default:StdRegProv")
    objWMI.SetDWORDValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Jet\4.0\Engines\Excel", "TypeGuessRows", 60000
End Sub

点评

谢谢  发表于 2013-8-4 17:49

TA的精华主题

TA的得分主题

发表于 2022-6-15 15:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 故从何生 于 2022-6-15 15:41 编辑

能不能演示一个完整的用GETSETTING和asavesetting 来对"HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Excel\Security\AccessVBOM" ,进行的存/取的操作?

image.png

TA的精华主题

TA的得分主题

发表于 2023-10-30 15:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
老师您好,用wmi我想定位到HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD,但是程序默认定位到HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Autodesk\AutoCAD,如何解决这个问题(32位程序,64位系统),要如何修改代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-4 00:58 , Processed in 0.055161 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表