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 指令测试的所有符号和条件都是从仅包含运算符的 literals 或 expressions 构建的(我认为 Is
运算符除外)。
在声明指令符号和条件时不允许函数调用,而在VBA中访问注册表的唯一方法是通过API(例如WScript.Shell
),即函数调用。
延伸阅读:http://msdn.microsoft.com/en-us/library/tx6yas69.aspx
【讨论】:
以上是关于VBA:在预处理时访问注册表的主要内容,如果未能解决你的问题,请参考以下文章