VBA:在预处理时访问注册表

Posted

技术标签:

【中文标题】VBA:在预处理时访问注册表【英文标题】:VBA: Access to registry while preprocessing 【发布时间】:2014-07-03 15:46:14 【问题描述】:

我想有条件地编译一个 VBA 项目中的代码,其条件取决于某个注册表项。这在 VBA 中是否可行?

我知道在 VBA 中有一些简单的预处理可能性,但我看不出是否可以在预处理时以某种方式访问​​注册表。或者也许在编译之前检查注册表的其他可能性。

由于缺少一些引用(因此缺少类对象)而导致编译错误,因此我的目标是在编译之前检查注册表。

附:我只想阅读注册表项。

举个例子。下面如何到达debug.print,即避免编译错误。

sub sub1()
   dim testobj as new nonexistingobject
   sub2 testobj
   debug.print "Arrived at this point"
end sub

sub sub2( byref testobj as nonexistingobject)
   *do some stuff with testobj*
end sub

【问题讨论】:

为什么不检查对象本身是否存在? 你能贴一些代码吗? 好的,我贴了一些代码! 【参考方案1】:

不要使用早期绑定 (Dim obj as myObject),而是使用后期绑定 CreateObject。这样您就可以处理对象不存在的情况:

Sub test()
    Dim obj As Object
    On Error Resume Next
    obj = CreateObject("myObject")
    if Err then Exit Sub 'if the object wasn't found exit the function
    on error goto 0 'set back the error handling to its previous state

    'rest of the code
End Sub

【讨论】:

很好,谢谢。它部分地解决了这个问题。我看不到如何(如果有的话)我可以使用后期绑定的其余部分如下:将那些(可能不存在的)类传递给 subs。如果我只传递对象,然后在“sub”-function/sub(带有后期绑定)中指定,也许它会起作用。 @mr.gaussian 我的意见是,如果对象不存在,您不应该继续执行其余代码,只需显示错误消息即可。 是的,这就是我想做的。但是,如果我在某些子/函数的定义中将这些对象作为参数,那么我看不到如何检查是否存在。因此我无法显示错误,因为即使在代码执行之前,也会出现编译错误。你认为我应该只在函数中使用一般的“对象”类型作为参数,因为不能保证对象存在。在 Praxis 中,我想做的是给用户一个错误消息,如果他的系统上没有必要的软件(我通过引用包含了 dll)。 @mr.gaussian 你应该在你的主子中检查一次对象的存在。对于子函数/subs,使用Object 作为参数,使用CreateObject 作为局部变量。这样就不应该有任何错误,因为代码应该只在对象存在时执行【参考方案2】:

VBA 不直接提供对整个 Windows 注册表的访问,但您可以使用解决方法。

Dim RegObj as Object
Set RegObj = CreateObject("WScript.Shell")

RegObj.RegDelete RegKeyString
RegObj.RegWrite RegKeyString
Str = RegObj.RegRead RegKeyString

Set RegObj = Nothing

如果没有找到 RegKeyString,它会抛出一个错误,所以你需要一些 OnError -> Key Doesn't Exist 类型的代码。

不确定预处理部分,但您可以在Workbook_Open 事件处理程序中运行您的代码,以确保这部分在其他任何事情之前运行。

【讨论】:

【参考方案3】:

这是不可行的。 VBA 指令测试的所有符号和条件都是从仅包含运算符的 literalsexpressions 构建的(我认为 Is 运算符除外)。

在声明指令符号和条件时不允许函数调用,而在VBA中访问注册表的唯一方法是通过API(例如WScript.Shell),即函数调用。

延伸阅读:http://msdn.microsoft.com/en-us/library/tx6yas69.aspx

【讨论】:

以上是关于VBA:在预处理时访问注册表的主要内容,如果未能解决你的问题,请参考以下文章

VBA中使用类和事件的注册

vba修改INI中指定的项

用于启用宏的 VBA 或 VBA ms 字

VBA Selenium“类未注册”- 80040154

创建注册表项时访问被拒绝

PowerBI调用API处理地址(一)