Как запросить подтверждение, прежде чем разрешить закрывать документ Word? - PullRequest
0 голосов
/ 24 июня 2019

Я работаю с 2 различными раскладками клавиатуры (qwerty и azerty) и постоянно переключаюсь между ними с помощью Alt-Shift.Иногда, когда я пытаюсь отменить Ctrl-Z, я получаю вместо этого Ctrl-W, который закрывает документ.Вообще говоря, в этих ситуациях я получу подсказку для сохранения, которая предупредит меня о моей ошибке.Однако сейчас я использую OneDrive с автосохранением документов, над которыми я работаю.В результате этого никогда не появляется запрос на сохранение.Документ мгновенно закрывается, и, что еще хуже, отмена, которую я пытался выполнить, больше не появляется при повторном открытии документа.

Я хотел бы использовать VBA, присоединенный к шаблону Normal, такой, чтопри закрытии любого документа, созданного с помощью шаблона VBA, я проверю, включено ли автосохранение, и, если это так, подтвердите перед закрытием в окне сообщения.Очевидно, что если пользователь не подтвердит (например, выберет Отмена), то документ не должен закрываться.

Сначала я поместил свой код в Document_Close, но вскоре понял, что здесь уже слишком поздно, чтобы отменить закрытие.Это не хорошо для меня.Затем, основываясь на некотором онлайн-коде, я помещаю свой код в модуль класса (EventClassModule).В модуле ThisDocument я инициирую класс и активирую обработчик событий.Мой код, кажется, никогда не запускается, или в любом случае точки останова не срабатывают.

Я немного не уверен в том, где останавливается Normal, и начинается мой обычный документ ...

В этом документе нормального шаблона у меня есть этот VBA

Dim X As New EventClassModule

Sub Register_Event_Handler()
    Set X.App = Word.Application
End Sub

Private Sub Document_Open()
    Register_Event_Handler
End Sub

И у меня есть модуль класса с именем EventClassModule со следующим

Public WithEvents App As Word.Application

Private Sub App_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)

Dim res As VbMsgBoxResult

    If Me.AutoSaveOn Then
        res = MsgBox("OK to Confirm", vbOKCancel, "Closing Document")
        If res = vbCancel Then
            Cancel = True
        End If
    End If

End Sub

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

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Обработчик события Document_Open будет срабатывать только в том случае, если шаблон Normal открывается через File | Открыто. Чтобы код отвечал при запуске Word, вам нужно использовать процедуру AutoExec. Просто переименуйте вашу рутину, как показано ниже. Вы можете найти дополнительную информацию об автоматических макросах здесь

Public Sub AutoExec()
  Register_Event_Handler
End Sub
0 голосов
/ 25 июня 2019

Вот простой способ, включите метод, подобный этому:

Public Sub DocClose()
    ' Disables Ctrl + W  (but not other close methods, e.g. Alt + F4, menus, [X])
    ' Your code here:
    ActiveDocument.Close 
End Sub

По сути, есть некоторые имена методов, которые используются внутри MS-Word, и если вы включите их в свой код, они будут препятствовать действию по умолчанию. Если оставить подпункт пустым, он фактически отключит Ctrl + W .

См. Здесь для получения дополнительной информации: Зарезервированные имена методов в MS Word VBA


Преимущество 1 этой техники

Если вы используете Public WithEvents App As Word.Application и ваш проект по какой-либо причине будет сброшен и не сможет перезапуститься ... App будет Nothing, и ни одно из событий не сработает.

Преимущество 2 этой техники

В тех случаях, когда вы на самом деле хотите закрыть документ ... с помощью этой техники вы не будете прослушиваться (скоро станет) раздражающим подтверждающим сообщением - просто скажите ;-)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...