首先,很抱歉标题比较笼统 - 如果有人能建议一个更好的标题,我会很高兴进行修改,但现在,我不知道从哪里开始。
我有一个工作簿,利用DLL访问数据提供程序(Bloomberg),要使其正常工作的要求非常棘手。此外,部署是一场噩梦,因为用户可能需要自己引用DLL。
自然而然地,我首先检查库是否被引用,然后再测试库本身。
以下是我的代码(按预期工作):
Public Sub TestBloomberg()
Dim ref As Object
Dim fRef As Boolean
fRef = False
For Each ref In ThisWorkbook.VBProject.References
If ref.GUID = "{4AC751C2-BB10-4702-BB05-791D93BB461C}" Then
If Not ref.IsBroken Then
fRef = True
End If
End If
Next
If fRef Then
' In separate Sub to get around User-defined type error
Call TestBloombergConnection
ElseIf Not fRef Then
' warn user about missing reference
End If
End Sub
正如您所看到的,如果设置了对DLL的引用,我会检查库是否按预期工作(这涉及许多外部因素,例如服务器应用程序是否正在运行,用户是否已登录等)。您可以将此视为简单的ON-ERROR-GOTO-wrapped调用dll。
我被迫将功能的实际测试移动到另一个子程序中,从第二个if块调用。如果我没有(或破损的)对dll的引用,即使库本身不会被调用,我也会收到用户定义的错误。如果我将完全相同的代码移动到另一个子程序中,则可以完美地工作。
最后,我的问题是: 当我运行VBA代码时会发生什么情况,为什么我在编译时会得到(我认为的)运行时错误?我的代码如何如此依赖外部因素,以至于它甚至无法失败?
TestBloombergConnection
中尝试使用早期绑定,如果引用不起作用,它会抛出编译错误(而不是运行时错误)。如果你使用了后期绑定,可能会抛出运行时错误... - user2140173