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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.571 из 5
Похожие ответы