Word - как заставить событие у Application работать всегда? - VBA
Формулировка задачи:
Помогите решить такую проблему, бьюсь уже далеко не первый день.
Нужно, чтобы при закрытии: 1) документа; 2) оболочки Word срабатывало событие у Application таких процедур как: «Private Sub appWord_DocumentBeforeClose» и «appWord_Quit». Эти события у меня находятся в моем шаблоне, прописанные в созданном классе.
Работа должна происходить следующим образом. В Word есть некий файл, через него я запускаю и подключаю свой шаблон с макросами. На стартовой форме, перед подключением моего шаблона, если юзер выбирает кнопку ОК, шаблон подключается и инициируется событие «Public WithEvents appWord As Word.Application» для процедур: «Private Sub appWord_DocumentBeforeClose» и «Private Sub appWord_Quit».
Моя задача следующая:
1) В процедуре «Private Sub appWord_DocumentBeforeClose» прописана проверка на имя файла, чтобы для определенного документа запускалась специальная форма и в зависимости от выбора юзера этот документ либо закрывается после отработки с пользователем действий, либо закрытие документа приостанавливается, чтобы юзер сам произвел свои манипуляции с документом. Т.е. полученный результат приводит в "Cancel = True".
2) В процедуре «Private Sub appWord_Quit» прописано, чтобы мой шаблон удалялся из списка подключенных шаблонов и надстроек, потому что оболочка Word полностью закрывается.
3) В шаблоне у меня так же имеется моя кнопка, выведенная на моей отдельной вкладке на ленте для закрытия любого активного документа, чтобы не закрывать всю оболочку Word. В моем коде я делаю закрытие документа, если юзер в MsgBox выбирает закрыть документ.
При старте, когда событие Application для процедур: «Private Sub appWord_DocumentBeforeClose» и «Private Sub appWord_Quit» проинициировано, если закрытие документа использовать стандартным способом или же использовать стандартное нажатие в Word сочетание славишь "Ctr+W", событие работает каждый раз независимо от того сколько раз была попытка прервать работу с формой, а затем производить закрытие тем же самым стандартным способом. НО стоит воспользоваться кнопкой с панели, то событие после первого срабатывания перестает срабатывать в дальнейшем, если юзер прерывает работу формы, а затем вторично закрывает документ уже любым перечисленным мной способом.
Я не понимаю почему событие перестает срабатывать в дальнейшем после первого раза???
Т.е. код перестает срабатывать, событие игнорируется, документ просто закрывается, а при закрытии всей оболочки Word шаблон перестает удаляться из списка подключенных:
Решение задачи: «Word - как заставить событие у Application работать всегда?»
textual
Листинг программы
Public WithEvents appWord As Word.Application Private Sub appWord_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean) Dim objWordDoc As Word.Document Dim strActDocName As String ' имя активного документа Dim objPrOrgNovProj As Object ' проект Dim strFileName As String ' имя файла проекта On Error GoTo ErrHandl '---> Обработка strActDocName = ActiveDocument.Name Set objWordDoc = Documents.Item(strActDocName) If objWordDoc.ProtectionType = wdNoProtection Then 'активный документ НЕ защищен от редактирования Set objPrOrgProj = GetObjectPrOrgProj(strFN) If Not objPrOrgProj Is Nothing Then 'если проект существует strFileName = objPrOrgProj.Name If objWordDoc.Name = strFileName Then 'если имя файла другое ЗапускФормы If GetResult = True Then 'если юзер нажал "Отмена" или "Х" на форме Cancel = True Else 'если юзер нажал «Esc» на форме ... End If End If End If End If '---< Обработка On Error Resume Next Set objWordDoc = Nothing: Set objPrinOrgPoNovProj = Nothing Set D = New EventClassModule Set D.appWord = Word.Application Exit Sub ErrHandl: Select Case Err.Number Case 4248 ' команда недоступна, т.к. не открыт ни один документ Case Else MsgBox Err.Description, vbCritical, """AppWord_DocumentBeforeClose"". Ошибка № " & Err.Number End Select On Error Resume Next Set objWordDoc = Nothing: Set objPrinOrgPoNovProj = Nothing Set D = New EventClassModule Set D.appWord = Word.Application End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д