如何在没有更多引用的情况下关闭加载项?

时间:2012-05-11 13:23:59

标签: vba excel-vba excel

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

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

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

我也可能Addin2Addin3引用MyMenus

如果没有其他打开的项目有参考文件,我怎样才能让MyMenus自动关闭?

或者,我如何告诉Addin1关闭,并关闭我参考的所有内容"?

2 个答案:

答案 0 :(得分:3)

我以不同的方式解决了这个问题,因为用户经常保存工作表并破坏参考。这有点像黑客,但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更改为仅在您的开发计算机上进行的某些检查 - 例如Environ(“COMPUTERNAME”) - 因此它会保存插件并且您不会丢失开发更改。

答案 1 :(得分: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声明为Variant)。

当你最后关闭AddIn1.xlam时,请确保不保存,否则你将永久失去参考。