我在Excel VBA中编写了一组简单的模块化加载项。
在Addin1.xlam
中,我选择了"工具..参考"并添加了MyMenus.xlam
作为参考。
Addin1
也有一些代码可以从菜单中关闭。但是当Addin1
关闭时,MyMenus
会保持打开状态,即使它不再需要或被任何内容引用。
我也可能Addin2
或Addin3
引用MyMenus
。
如果没有其他打开的项目有参考文件,我怎样才能让MyMenus
自动关闭?
或者,我如何告诉Addin1
关闭,并关闭我参考的所有内容"?
答案 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
时,请确保不保存,否则你将永久失去参考。