Перехват формы сохранения книги Excel с помощью события закрытия книги

Работая с событием VBA закрытия книги Excel (Workbook_BeforeClose), можно столкнуться с проблемой, о которой будет рассказано в данной статье.

Допустим, перед закрытием книги Вам необходимо произвести удаление каких-нибудь листов или отчистить переменные, которые хранили информацию для нее. Если файл Excel был изменен, то предварительно пользователю будет выведен диалог с предложением сохранить изменения. Но пользователь может решить продолжить работать с текущей книгой и нажмет кнопку «Отмена». Вроде бы все в порядке, но процедура события BeforeClose уже сработала, удалив данные, которые могут теперь потребоваться.

Чтобы решить описанную проблему, нужно узнать, какая кнопка на форме сохранения была нажата. Стандартный диалог этого не позволяет, поэтому его нужно перехватить и подсунуть пользователю свою форму с запросом (код приведен ниже).

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Do Until ThisWorkbook.Saved
    
    ' Выводим сообщение пользователю с запросом о необходимости сохранения
    Select Case MsgBox( _
                "Вы хотите сохранить изменения в файле " & ThisWorkbook.Name & "?", _
                vbQuestion + vbYesNoCancel)
    
    Case vbYes
    
        If ThisWorkbook.Path = "" Then
            ' Выводим диалог "Сохранить как", если книга является новой
            Application.Dialogs(xlDialogSaveAs).Show
        Else
            ThisWorkbook.Save
        End If
        
    Case vbNo
        ThisWorkbook.Saved = True
    Case Else
        Cancel = True
        Exit Sub
    End Select
Loop
End Sub

После цикла может быть расположен любой код, который выполнится при условии успешного сохранения.

Добавить комментарий