Excel VBA:不使用ThisWorkbook.Saved=True,关闭工作簿如何取消保存提示?
解决VBA工作簿关闭时的保存提示问题
问题分析
你遇到的核心问题是:选择对话框的No选项后,执行ThisWorkbook.Close Savechanges:=False会触发Workbook_BeforeClose事件,该事件内的代码会在ThisWorkbook.Saved = True时执行保存操作,直接导致保存提示或强制保存,和你的需求冲突。同时你无法直接用ThisWorkbook.Saved = True,因为会触发BeforeClose里的保存逻辑。
解决方案
通过添加模块级标记变量,让BeforeClose事件识别当前关闭操作是用户选择No触发的,从而跳过原有保存逻辑,实现无提示关闭。
步骤1:在ThisWorkbook模块顶部定义标记变量
在所有过程之外添加布尔变量,用来标记是否是强制关闭:
Private bSkipBeforeClose As Boolean
步骤2:修改Workbook_Open事件的No分支
更新代码,设置标记变量并确保关闭时不触发提示:
Private Sub workbook_open() Application.DisplayAlerts = True ' controlevraag drive gesynced? Dim Antwoord1 Antwoord1 = MsgBox("Heb je gecheckt of drive gesynced is en je daardoor dit doc kunt gebruiken?", vbQuestion + vbYesNo, "Drive sync gecheckt?") If Antwoord1 = vbYes Then GoTo Start1 ElseIf Antwoord1 = vbNo Then MsgBox "Dan sluit ik nu dit doc zodat je dat eerst kunt checken, tot zo!", vbOKOnly, "Eerst checken aub" bSkipBeforeClose = True ' 设置强制关闭标记 Application.DisplayAlerts = False ThisWorkbook.Close SaveChanges:=False Application.DisplayAlerts = True ' 恢复默认提示设置 End If Start1: ' Yes分支代码(已省略) End Sub
步骤3:修改Workbook_BeforeClose事件
添加对标记变量的判断,跳过原有保存逻辑:
Private Sub Workbook_BeforeClose(Cancel As Boolean) ' 如果是强制关闭,跳过所有保存逻辑 If bSkipBeforeClose Then Cancel = False ThisWorkbook.Saved = True ' 标记工作簿为已保存,避免触发系统保存提示 Application.DisplayAlerts = False Exit Sub End If ' 原有逻辑仅在正常关闭时执行 If ThisWorkbook.Saved = True Then Call AlleGSheet_netjes Call Juiste_Beveiliging ThisWorkbook.Save End If Application.DisplayAlerts = True End Sub
原理说明
- 标记变量
bSkipBeforeClose在用户选择No时被设为True,BeforeClose事件检测到这个标记后,直接跳过所有保存相关代码,设置ThisWorkbook.Saved = True让系统认为工作簿无需保存,同时关闭提示,实现无保存、无提示关闭。 - 关闭后恢复
Application.DisplayAlerts = True,避免影响后续其他操作的提示逻辑。
内容的提问来源于stack exchange,提问作者Jesse Vroom
相关产品推荐
相关产品推荐

