首先,为通用标题道歉 - 如果有人可以提出更好的标题,我会很乐意改变它,但是现在,我不知道从哪里开始。
我有一个使用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的引用,我会继续检查库是否按预期工作(这有很多外部因素在起作用,例如服务器应用程序正在运行,用户是登录等。)您可以将此视为对dll的简单ON-ERROR-GOTO包装调用。
我被迫将功能的实际测试移动到另一个sub,从第二个if-block调用。如果我没有(或损坏)对dll的引用,即使库本身不会被调用,我将得到用户定义的错误。如果我将完全相同的代码移动到另一个子代码,它将完美地工作。
最后,我的问题: 当我运行我的VBA代码时会发生什么,为什么我在编译期间得到(我认为)运行时错误?我的代码如何依赖于外部因素,甚至无法达到失败的程度?
答案 0 :(得分:2)
此行为演示的是VBA在不同时间单独编译单独的子例程。当我试图代表用户解决引用时遇到了类似的情况(解决版本问题,我开始工作,但后来因为不值得麻烦而放弃)。
当你准备好输入一个子程序时,它只会解释它所需要的数量,然后你就会得到一个编译时错误,即使你看起来好像是在运行时。
您实际获得的错误可能是429自动化错误或类似情况。如果您的链接断开(dll已移动,删除或未注册),您将获得该链接。我记得在我的项目中,如果在文件中保存了一个好的引用,或者没有保存引用,我可以可靠地处理它,但如果保存了错误的引用,代码必须与您找到的类似地隔离。我想我在一个单独的班级里有我的,但原则是一样的。
我认为这"只能根据需要进行解释"被认为是VBA的一个特征。即使您在其他地方有编译错误,也可以运行某段代码。当您只有部分编写的函数或其他半成品,或者如果您在没有安装某些引用软件的计算机上打开文件时,这可能很有用。它至少可以使用部分功能。