在VBA中测试DLL引用

3

首先,很抱歉标题比较笼统 - 如果有人能建议一个更好的标题,我会很高兴进行修改,但现在,我不知道从哪里开始。

我有一个工作簿,利用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代码时会发生什么情况,为什么我在编译时会得到(我认为的)运行时错误?我的代码如何如此依赖外部因素,以至于它甚至无法失败?

1
编译期间发生运行时错误?毫无意义。 - user2140173
哪一行出现了错误?看起来你正在TestBloombergConnection中尝试使用早期绑定,如果引用不起作用,它会抛出编译错误(而不是运行时错误)。如果你使用了后期绑定,可能会抛出运行时错误... - user2140173
如果引用已经损坏,并且我试图从同一个子程序中调用它,那么代码将无法编译。但是,如果引用已经损坏,并且我从另一个子程序中调用它,我的代码将运行,但是我会在调用缺失的 DLL 的那一行收到错误。这就是我对运行时和编译时的混淆所在... - zuiqo
@docbrown:感谢您的编辑,但我的问题更多关于VBA的概念内部工作原理,而不是这个具体测试,我也不是在寻找特定的解决方案,而是想要一个解释。 - zuiqo
我不明白你在这里的问题。你能更具体一些或花点时间解释实际的问题吗?你能分享一下重现问题的代码吗? - user2140173
1个回答

4
这种行为表明,VBA会分别编译不同的子程序,并在不同的时间进行编译。当我试图代表用户解决引用问题(解决版本问题,我让它工作了,但后来放弃了),我遇到了类似的情况。
当你准备进入子程序时,它只会解释需要的部分,然后你可能会得到编译时错误,即使对你来说似乎是运行时。
你实际上收到的错误可能是429 Automation error或类似的东西。如果有一个损坏的链接(dll移动、删除或未注册),你就会收到这个错误。从我的项目中记得的是,如果在文件中保存了好的引用,或者没有保存引用,我可以可靠地处理它,但如果保存了一个坏的引用,代码必须被隔离,类似于你发现的。我想我的代码是在一个单独的类中,但原理是一样的。
我认为这种“尽可能少地解释”被认为是VBA的一个特性。即使在其他地方存在编译错误,你也可以运行某些代码段。当你只有部分编写的函数或其他半成品时,或者在没有安装一些引用软件的计算机上打开文件时,这非常有用。它至少让一些功能仍然可以使用。

谢谢,这正是我在寻找的...你有没有找到关于这个行为的更多文档?我即将将其部署到金融领域的客户端,我宁愿在发布之前了解发生了什么 :D - zuiqo
我认为他们不会记录这样的东西。当代码在另一个例程或模块中时,您是否已经使其可靠地处理了坏链接情况?如果没有,我会严重考虑永远不要在文件中保存引用,而是始终尝试在运行时添加它,以最小化发生无法捕获的编译异常的机会。但我仍然不知道这是否可以变得非常稳定。如果有人保存带有引用的文件,然后进行升级并更改.dll会怎样?很多奇怪的情况可能会发生。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接