Excel 2016 Workbook.BeforeClose evento disparando cada dos veces error

25/08/16 Actualización: actualicé Office 2016 (ahora en v 16.0.7167.2040) y parece que se ha solucionado. No cambié ningún complemento ni nada. ¡Quizás Microsoft sí mira estos problemas! Con suerte, cualquier otra persona con este problema puede actualizar su versión y ver que este error ha sido corregido. (Eliminé el enlace de Dropbox del OP).

4/9/16 Actualización: actualicé Office (ahora en v 16.0.6729.1012) En lugar de que el evento .beforeclose solo se active una vez, ahora el evento se dispara en cualquier otro momento. Aquí hay un video que muestra el comportamiento extraño:screencast.com/t/BdkTd9ib

Publicación original: Me encontré con este error hoy donde el evento .beforeclose solo se dispara una vez en Excel 2016. El siguiente código funciona como se esperaba en Excel 2007, 2010 y 2013 (todos de 32 bits en Windows 10) donde se dispara el evento .beforeclose cada vez. NO funciona como se esperaba en Excel 2016.

El código del evento Workbook.BeforeClose solo se activa una vez. Si el usuario hace clic en "Cancelar" en un cuadro de diálogo de guardado personalizado y Cancelar = Verdadero para que el libro no se cierre, y el usuario va a cerrar el libro nuevamente, el .BeforeClose no se activa. En su lugar, se muestra el cuadro de diálogo de cierre predeterminado de Excel.

Pasos para reproducir manualmente: Crear un nuevo libro de trabajo .xlsm. Cree un rango con nombre "isDirty". En el módulo sheet1 ponga lo siguiente:

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target(1) = [isDirty] Then Exit Sub
        Application.EnableEvents = False
        [isDirty] = True
        Application.EnableEvents = True
    End Sub

Ingrese esto en el Módulo ThisWorkook:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    With Application
        .EnableEvents = False
        .DisplayAlerts = False
        .Calculation = xlCalculationManual
    End With

    With Me
        If [isDirty] = True Then
            Select Case MsgBox("Do you want to save the changes you made to '" & .Name & "'?", _
                vbYesNoCancel + vbExclamation, "CUSTOM CLOSE BOX")
            Case Is = vbYes
                Call CustomSave
            Case Is = vbNo
                 Me.Saved = True
            Case Is = vbCancel
                Cancel = True
                GoTo Cleanup
            End Select
        End If
    End With

    With Application
        .EnableEvents = True
        .StatusBar = False
        .ScreenUpdating = True
        .DisplayAlerts = True
    End With

    Me.Saved = True
    Exit Sub

Cleanup: 'user hit cancel to custom save dialog box
    With Application
        .DisplayAlerts = True
        .CalculateBeforeSave = False
        .Calculation = xlCalculationManual
        .EnableEvents = True
        .ScreenUpdating = True
        .StatusBar = False
    End With
    Me.Saved = False
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
     [isDirty] = False
End Sub

Inserte un módulo personalizado y ponga este código:

Sub CustomSave()
    [isDirty] = False
    ThisWorkbook.Save
    ThisWorkbook.Saved = True
End Sub

Si el usuario realiza un cambio en Sheet1, el indicador isDirty se establece en True. El usuario hace clic en la X para cerrar el libro de trabajo y se inicia el evento .beforeclose, y se abre el cuadro de diálogo de confirmación personalizada. El usuario pulsa cancelar.

El usuario vuelve a presionar X y ahora se abre el cuadro de diálogo normal de cierre del libro de Excel preguntando si el usuario desea guardar los cambios. El evento .beforeclose no se vuelve a activar.

¿Alguna sugerencia?

Respuestas a la pregunta(1)

Su respuesta a la pregunta