我想在一个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
答案 0 :(得分:0)
这是不可行的。 VBA指令测试的所有符号和条件都是从仅包含运算符的文字或表达式构建的(我认为除了Is
运算符除外)。
在声明指令符号和条件时不允许函数调用,并且在VBA中访问注册表的唯一方法是通过API(例如WScript.Shell
),这意味着函数调用。
答案 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