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 шаблон перестает удаляться из списка подключенных:
Листинг программы
- Public D As New EventClassModule
- 'Для инициирования переменной, чтобы была возможность прервать закрытие документа
- Function InitializationEvents()
- Set D.appWord = Word.Application
- End Function
Решение задачи: «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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д