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

时间:2014-07-03 15:46:15

标签: vba excel-vba compilation preprocessor-directive excel

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

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

由于缺少引用(因而缺少类对象)而导致编译错误,因此我打算在编译之前检查注册表。

P.S。我只想阅读注册表项。

举个例子。如何在下面达到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

3 个答案:

答案 0 :(得分:0)

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

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

进一步阅读:http://msdn.microsoft.com/en-us/library/tx6yas69.aspx

答案 1 :(得分:0)

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事件处理程序中运行代码,以确保此部分先于其他任何内容运行。

答案 2 :(得分:0)

不使用早期绑定(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