在工作簿打开期间编译错误

时间:2012-01-12 21:36:44

标签: excel-vba vba excel

我有一个使用某种类型的工作簿,我们称之为T,这是在我的参考文献中定义的模块(DLL)中 - 一切都很好。

我创建了一些在Workbook_Open()中调用的代码,如果它不在引用列表中,它将添加对DLL的引用。这样我就可以将工作簿交给某人,他们不必手工处理创建引用。

我的问题是,当我打开工作簿(双击),在执行Workbook_Open()之前(并且可以设置Refence),我会被抛入调试器,指向并抱怨类型为T,在未定义的DLL尚未定义。好吧,不开玩笑不是。

这似乎是一个小鸡蛋。有人见过这个吗?你是怎么解决的?

1 个答案:

答案 0 :(得分:1)

就像其他人说的那样,如果你不想在Workbook_Open之前添加对DLL的引用,你必须使用后期绑定来连接到DLL中的东西。

但是,我认为你这样做是错误的。不要在Workbook_Open中添加对DLL的引用,而是已经引用它并检查.IsBroken。然后,您可以使用代码来执行修复损坏的引用所需的操作。

这样可以保留早期绑定的好处,如果对DLL的引用被破坏,您将不会遇到相同类型的编译错误。

注意:您仍然可以获得编译错误,但它们不会用于丢失的DLL。虽然您的引用已损坏,但如果函数未以Strings开头,则VBA Strings.模块中的任何函数的使用都将触发编译错误。例如,以下代码将导致编译器错误如果您有任何损坏的引用,Workbook_Open会运行。

Private Sub Workbook_Open()
   Dim r As Reference
   For Each r In ThisWorkbook.VBProject.References
      If r.IsBroken Then
         MsgBox "Found broken reference." & vbCrLf _
              & Mid(r.FullPath, InStrRev(r.FullPath, "\") + 1)
      End If
   Next r
End Sub

要修复此问题,请在Mid前加上InStrRevStrings.

MsgBox "Found broken reference." & vbCrLf _
     & Strings.Mid(r.FullPath, Strings.InStrRev(r.FullPath, "\") + 1)