关闭后,工作簿对象仍然存在,并且在关闭工作簿后,任何后续的excel操作会重新打开工作簿

时间:2019-05-02 16:35:45

标签: excel vba

我有一个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或至少关闭启动板的实例,否则任何用户操作都将触发启动板执行以下操作重新打开。

谢谢。

1 个答案:

答案 0 :(得分:1)

经过深思熟虑,我意识到问题不是由对象驱动的,而是我设置了一个Application.OnKey触发器,但是从未释放过,这导致工作簿持续存在,释放了OnKey WorkbookBeforeClose例程中的触发器已很好地解决了问题。

感谢您的帮助。