簡體   English   中英

如果以編程方式觸發關閉,為什么 VBA Workbook.Close 語句在 Workbook_BeforeClose 內失敗?

[英]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.CloseBeforeClose的開始,然后忽略它。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM