我有一个excel工作簿,用作其他基于excel的工具的启动板,允许用户启动同一工具的多个实例,我每次通过设置新的应用程序来强制新工具在新的excel实例中打开。然后,代码还将一些数据从启动板传递到工具中。
不幸的是,对于某些用户(目前只有少数使用该系统的20-30位用户),如果他们关闭启动板工作簿,它似乎仍会保留在excel实例中(在VBE项目资源管理器中仍然可见)。奇怪的是,无论他们现在在excel实例中保持打开状态的任何工作簿中进行的操作(例如将其键入单元格并按回车键),启动板都会重新打开。他们必须完全关闭excel才能阻止该问题。
我释放了打开工具的例程中使用的所有对象,所以不可能是这样,我想知道是否有必要这样做,因为我正在打开工作簿并希望为用户打开它们?
Public Sub LaunchTool()
Dim WB1 As Workbook
Dim WS1 As Worksheet
Dim WT1 As Workbook
Dim EA1 As New Application
Application.DisplayAlerts = False
'Define workbook aliases
Set WT1 = ActiveWorkbook
EA1.Workbooks.Open Filename:=PathString, IgnoreReadOnlyRecommended:=True,
ReadOnly:=True
Set WB1 = EA1.ActiveWorkbook
Set WS1 = WB1.Worksheets("Import")
WB1.Windows(1).Visible = True
EA1.Visible = True
'pass on some values
WB1.Sheets("Control").Range("Dev_Flag") =
WT1.Sheets("Param").Range("Dev_Flag")
Set WT1 = Nothing
Set WS1 = Nothing
Set WB1 = Nothing
Set EA1 = Nothing
Application.DisplayAlerts = True
End Sub
Application.DisplayAlerts = False
用于禁止 Microsoft Excel正在等待另一个应用程序完成OLE操作警报,该警报有时会在加载过程中弹出。
我在ThisWorkbook
模块中尝试了以下操作:
Private WithEvents XL As Excel.Application
Private Sub XL_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
Set XL = Nothing
Workbooks.Open ThisWorkbook.FullName
ThisWorkbook.Close False
End Sub
但是没有运气!
对于大多数用户来说,一切正常,但是我所描述的某些用户无法成功关闭启动板,然后除非他们完全关闭excel或至少关闭启动板的实例,否则任何用户操作都将触发启动板执行以下操作重新打开。
谢谢。
答案 0 :(得分:1)
经过深思熟虑,我意识到问题不是由对象驱动的,而是我设置了一个Application.OnKey
触发器,但是从未释放过,这导致工作簿持续存在,释放了OnKey WorkbookBeforeClose
例程中的触发器已很好地解决了问题。
感谢您的帮助。