1

我正在 Excel VBA 中编写一组简单的模块化加载项。

Addin1.xlam中,我选择了“工具..参考”并添加MyMenus.xlam为参考。

Addin1还有一些代码可以从菜单中关闭自己。但是当Addin1关闭时,MyMenus保持打开状态,即使它不再需要或被任何东西引用。

我也可能有Addin2Addin3参考MyMenus

当没有其他打开的项目对它有引用时,如何MyMenus自动关闭?

或者,我怎么能告诉Addin1“关闭,也关闭我有参考的任何东西”?

4

2 回答 2

3

我以不同的方式解决了这个问题,因为用户不断地保存工作表并破坏参考。这有点像 hack,但 Excel VBA 中不是什么?

Public Sub CloseYourself()
    Application.OnTime Now + TimeValue("00:00:00"), "CloseYourselfNow"
End Sub

Private Sub CloseYourselfNow()
    On Error Resume Next
    ThisWorkbook.Close False
End Sub

基本上,您在 Workbook_BeforeClose 事件中调用 CloseYourself,该事件将 CloseYourselfNow 安排为从现在起 0 秒(Excel 的这部分是单线程的,因此它等待原始工作簿关闭)。到 CloseYourselfNow 运行时,引用将被删除,插件可以自行关闭。如果其他静止的工作簿有参考,您需要 On Error Resume Next。最后,您可以将 False 更改为仅在您的开发机器上为 true 的某些检查 - 例如 Environ("COMPUTERNAME") - 这样它会保存插件并且您不会丢失开发更改。

于 2013-08-08T17:32:18.153 回答
0

保持MyMenus加载项打开会导致任何问题吗?像这样的引用通常会因为您描述的原因而保持打开状态,即以防它在其他地方引用。我建议保持原样,但如果您确实要继续,则需要分两步完成:首先从第一个加载项 ( Addin1.xlam) 中删除引用,然后关闭第二个加载项 ( MyMenus.xlam)。像这样的东西应该工作:

Dim objRef As Reference

Set objRef = ThisWorkbook.VBProject.References("MyMenus")

Call ThisWorkbook.VBProject.References.Remove(objRef)

'Do not raise an exception as may not be able to close if the add-in is referenced elsewhere
On Error Resume Next
Call Workbooks("MyMenus.xlam").Close(False)
On Error Goto 0

请注意,我已将Microsoft Visual Basic for Applications Extensibility引用添加到项目中(或者仅声明objRef为变体)。

当您 finally then closeAddIn1.xlam时,请确保您在没有保存的情况下这样做,否则您将永久丢失参考。

于 2012-05-11T14:30:49.297 回答