Excel“Workbook_BeforeClose”事件在取消后不再触发

时间:2016-11-14 19:27:44

标签: vba excel-vba excel

更新:经过更多研究后,我发现了这个重复的问题:Excel 2016 Workbook.BeforeClose event firing every other time bug。我似乎使用了错误的关键字,这是一个错误,而不是我的代码的问题。但是,我似乎无法下载解决方案中提到的版本。我正在运行Windows 7并使用Microsoft Office 365 Pro Plus,而Office表示最新版本可用是16.0.6965.2105

我正在尝试使用Workbook_BeforeClose事件来测试是否选中了复选框。如果不是,则提示用户是否要继续关闭而不选中该框。如果他们选择“是”,则清除工作表并保存工作簿。如果他们选择“否”,则选中该框,并将“取消”设置为真。

第一次运行Workbook_BeforeClose事件时,此工作正常。但是,第二次关闭工作表时,标准Excel“想要将更改保存到...”对话框出现,并且Workbook_BeforeClose事件不会触发。如果我在对话框上单击取消并第三次关闭工作簿,则会触发该事件。当在对话框中单击“取消”时,某些内容正在被重置,但我无法弄清楚它是什么。我的代码如下:

Public Closing as Boolean

Sub Workbook_BeforeClose(Cancel As Boolean)

Debug.Print "Workbook_BeforeClose"

If Closing = True Then Exit Sub     'Closing is used as a switch to stop the event from looping on Application.ThisWorkbook.Close below

Closing = True

If Sheets(1).DraftCheckBox = False Then

    If MsgBox("This file is not being saved as a draft. This workbook will be cleared if the draft box is not checked." & vbCr & vbCr & "Would you like to continue?", vbYesNo, "Warning") = vbYes Then

        'If "Yes" selected
        'Stuff happens here

        Application.ThisWorkbook.Close savechanges:=True

    Else

        'If "No" selected
        Sheets(1).DraftCheckBox = True
        Cancel = True
    End If

End If

Closing = False

End Sub

我知道Application.EnableEvents设置为True的事实。我也知道事件本身没有触发,因为在“Debug.Print”的第一行有一个停止。这个停止在第一次关闭后激活,我可以单步执行代码。在第二次关闭之后,在对话框之前或之后,它根本不会激活。我是否应该采取任何措施防止对话框出现并在每次关闭工作簿时强制执行Workbook_BeforeClose事件?

1 个答案:

答案 0 :(得分:0)

您已经关闭了不想再次关闭的工作簿,请使用“保存”。 如果您使用以下代码,则也不需要多余的变量。仍然存在一个大问题……您的用户如何模仿Close事件?如果用红色的X表示,则下面的代码应该起作用。如果通过表单上的按钮,该按钮代码是什么样的?

注意:这是未经测试的代码,因为我没有您的工作簿。

Sub Workbook_BeforeClose(Cancel As Boolean)

  If Sheets(1).DraftCheckBox = False Then
  
      If MsgBox("This file is not being saved as a draft. " + _
                "This workbook will be cleared if the draft box is not checked."  _
                & vbCr & vbCr & "Would you like to continue?", _
                vbYesNo, "Warning") = vbYes Then
  
        'If "Yes" selected
        'Stuff happens here
        
        Application.ThisWorkbook.Save
        Cancel = False 'Just to be sure.
        
      Else
          'If "No" selected
          Sheets(1).DraftCheckBox = True
          Cancel = True
      End If
  
  End If
  
End Sub

HTH