2011-12-29 204 views
4

我有以下一段VB代码来获取注册表子项(NOT注册表的键值或值)。我只需要列出Microsoft子项中的应用程序(例如Office,记事本,键盘等)。从VBA读取注册表子项

它的工作VB.NET,但我想同样的代码适用于VBA在宏,我得到一个运行时错误说对GetOBjectEmumKey"Object variable or With block variable not set"。我虽然下面的代码应该兼容VB.NETVBA。 任何人都可以请解释一下吗?

Dim temp As Object 
'On Error Resume Next 
Const HKEY_CURRENT_USER = &H80000001 
temp = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & "." & "\root\default:StdRegProv") 

Dim rPath As String 
rPath = "Software\Microsoft\IdentityCRL\UserExtendedProperties" 

Dim arrSubKeys(5) As Object 
temp.EnumKey(HKEY_CURRENT_USER, rPath, arrSubKeys) 

For Each ask In arrSubKeys 
    MsgBox(ask.ToString) 
Next 
+1

VB.NET是*不*像VBA立即窗口。为其中一个写的代码不会也不应该在另一个中编译。 – 2011-12-29 12:24:40

+0

我实际上在google上得到这段代码片段,它是为VBA编写的。奇怪的是,它在Visual Studio中编译和运行良好,但在Excel中的VBA宏中出现错误。 – KMC 2011-12-29 12:29:45

+0

@CodyGray,对不起,说他们彼此没有任何关系,这只是不正确也没有帮助。我不希望任何人阅读你的评论,相信这一点。实际上,它们非常相似,都使用BASIC语法,因此KMC的代码片段非常易于在任何环境下以最小的更改进行工作(如下面的答案),这正是KMC提供帮助的地方。我们可以抱怨优化,但完全不同。 – Chalky 2014-08-11 21:52:59

回答

9

对于VBA尝试这样

  • temp是一个对象,并需要与集
  • temp.Enum语法temp.EnumKey HKEY_CURRENT_USER, rPath, arrSubKeys使用不temp.EnumKey(HKEY_CURRENT_USER, rPath, arrSubKeys)
  • Dim您在顶部变数你的代码整齐:)

此代码列出了所有的文件夹HKEY_CURRENT_USER\Software\Microsoft\下的VBE

Const HKEY_CURRENT_USER = &H80000001 
Sub TestME() 
    Dim temp As Object 
    Dim strComputer As String 
    Dim rPath As String 
    Dim arrSubKeys() 
    Dim strAsk 

    strComputer = "." 
    Set temp = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
    strComputer & "\root\default:StdRegProv") 

    rPath = "Software\Microsoft\" 
    temp.EnumKey HKEY_CURRENT_USER, rPath, arrSubKeys 
    For Each strAsk In arrSubKeys 
     Debug.Print strAsk 
    Next 
End Sub 

example output

+0

非常感谢!它工作得很好。 Q1:为什么分配点“。”到一个变量,而不是连接它指向字符串? Q2:arrSubKeys和strAsk没有被声明为一个类型(即Object,String)并且仍然可用? – KMC 2011-12-30 08:18:20

+1

@KMC很高兴有帮助。 1)'StrComputer'变量通常用于vbscript来引用网络中不同的机器,'.'是本地机器。所以我采用了更灵活的标准,而不是对''进行硬编码。'2)这是因为这些变量是不同的,所以可以不加修改。 – brettdj 2011-12-30 08:26:11

+1

刚刚经过测试,它似乎它甚至迎合了HKLM中的32/64位问题,因此实际的密钥在软件\ Wow6432Node \ ... 顶部工作小组! – 2014-03-18 17:49:25