![](/img/trans.png)
[英]Workbook_BeforeClose() works in the first part, but does not close the Workbook
[英]Why does VBA Workbook.Close Statement Fail Inside Workbook_BeforeClose, If Close is Triggered Programmatically?
我想用我自己的進程攔截 BeforeClose,並取消默認進程。 沒有按預期工作。 要復制,請創建一個新工作簿,輸入以下內容並保存:
本工作簿模塊:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = True
Application.EnableEvents = False ' to prevent recursively calling this procedure
ThisWorkbook.Close
End Sub
在 Excel 前端,通過單擊 close-X 手動關閉工作簿。 正如預期的那樣,它將通過 ThisWorkbook.Close 語句關閉。 在 Excel 2016 和 365 中,如果其他工作簿處於打開狀態,它們將保持打開狀態。
請注意,EnableEvents 現在將為 false。 關閉並重新打開 Excel 以恢復它,或在直接窗格中輸入:
Application.EnableEvents = True
現在重新打開同一個工作簿。 在 Workbook_BeforeClose 上放置一個斷點。 轉到前端並再次手動關閉工作簿。 單步執行代碼,以確認它在做什么。 仍然工作正常。
如上所述恢復 EnableEvents。
再次打開文件。 轉到立即窗格,然后輸入:ThisWorkbook.Close
該文件不會關閉。 單步執行代碼以查看發生了什么。 還是不關。 為什么不?
考慮這個代碼:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
MsgBox "Start"
ThisWorkbook.Close
ThisWorkbook.Close
MsgBox "End"
End Sub
這似乎證實了我的評論。
如果ThisWorkbook.Close
可以調用ThisWorkbook.Close
,這將無限期地向“開始”消息框發送垃圾郵件。
合上書通常會給你兩個“開始”和一個“結束”
ThisWorkbook.Close
上BeforeClose
的開始,然后忽略它。 用ThisWorkbook.Close
關閉它給出一個“開始和一個”結束
ThisWorkbook.Close
在這種情況下,從ThisWorkbook.Close
開始應該讓它們的行為始終相同。 而事實並非如此。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Close
ThisWorkbook.Close
Cancel = True
Application.EnableEvents = False ' to prevent recursively calling this procedure
ThisWorkbook.Close
End Sub
看看這段代碼在使用ThisWorkbook.Close
關閉時如何執行:
它沒有關閉
如果我們不禁用事件,從ThisWorkbook.Close
運行它的行為完全相同。 走過去,不關門。
然而,從菜單上看,它是完全不同的:
並且不關閉。
因此,似乎使用ThisWorkbook.Close
調用Workbook_BeforeClose
將忽略所有其他ThisWorkbook.Close
,但使用菜單關閉文檔將嘗試運行每個ThisWorkbook.Close
一次。
在 Excel 前端,手動關閉工作簿。 正如預期的那樣,它將通過 ThisWorkbook.Close 語句關閉。
好吧,不完全是:
如果您通過單擊右上角的X
從 UI 關閉,則會發生所描述的行為劑量。 另一方面,如果您通過轉到 File/Close 從 UI 關閉,則行為會反映所描述的即時窗口(不關閉)
從文檔
取消 必需的布爾值
事件發生時為假。 如果事件過程將此參數設置為 True,則關閉操作將停止並且工作簿保持打開狀態。
這解釋了觀察到的行為。
如果您在ThisWorkbook.Close
之前設置cancel = True
那么它就會關閉。
那么,為什么點擊X
關閉它呢?
我相信這是因為該 UI 也正在退出 Excel 應用程序。 工作簿關閉是應用程序退出的副作用,所有打開的工作簿也是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.