Ошибка ActiveDocument 4248 в ленте onLoad sub
У меня есть глобальный шаблон с настроенной лентой. Когда я пытаюсь открыть документ, я получаю сообщение об ошибке 4248, в котором утверждается, что команда не может быть запущена, потому что ни один документ не открыт.
Код в подпрограмме onLoad проверяет, чтобы убедиться, что активный документ не является шаблоном или Normal.dotm, потому что я не хочу, чтобы переменные документа записывались в эти файлы с помощью вызываемых процедур. В Word 2013 это работало нормально, но я заметил, что в Word 2016 кажется, что процедура onLoad на ленте выполняется до открытия документа в Word. Я указал проблему в строке ActiveDocument.Name, где я могу перехватить сообщение об ошибке и продолжить его, но это не помогает мне запускать дополнительный код после определения, что это не глобальный шаблон документа или обычный файл..dotm.
Public myRibbonNewNormal As IRibbonUI
Public bVisible As Boolean
Dim bDocSaved As Boolean
Sub onLoad_newNormal(ribbon As IRibbonUI)
Set myRibbonNewNormal = ribbon
On Error GoTo onLoadError
If ActiveDocument.Name = "Styles.dotm" Or ActiveDocument.Name =
"newNormal.dotm" Then
Exit Sub
ElseIf ActiveDocument.ReadOnly Then
Exit Sub
Else
'Call checkDocType
Call uncheckUpdateStyles
Call removeClientFooter
Call checkTemplate
If bDocSaved <> True Then
Call preventSave
Else
'do nothing
End If
End If
Exit Sub
onLoadError:
If Err.Number = 0 Then
Resume Next
ElseIf Err.Number = 5 Then
Resume Next
ElseIf Err.Number = 5825 Then
Resume Next
ElseIf Err.Number = 5903 Then
Resume Next
'ElseIf Err.Number = 5155 Then
' Resume Next
ElseIf Err.Number = 4248 Then
Resume Next
Else
MsgBox "This error is in the onLoad sub in the newNormal RibbonControl" _
& vbCrLf & vbCfLf & "Error: " & Err.Number & vbCrLf & Err.Description, ,
"Error"
End If
End Sub
(Пожалуйста, извините за мою обработку ошибок. Я спешил, когда писал этот код, и просто не вернулся к тому, чтобы сделать это должным образом.)
Есть ли способ для меня, чтобы ждать, чтобы выполнить подпрограмму onLoad, пока Word не открыл документ (простым двойным щелчком мыши)? Я уверен, что чего-то здесь не хватает, но я изо всех сил пытаюсь найти какую-либо информацию об этом в Интернете.
2 ответа
Аналогично предыдущему ответу, но, возможно, проще - добавить в ваш код процедуры автооткрытия и автообновления и захватить активный документ в этих процедурах, а не процедуру загрузки.
Переместите код в обработчик событий уровня приложения. Код будет запускаться каждый раз, когда открывается новый документ, но при необходимости его можно исправить (см. Комментарии к коду).
Создайте новый модуль класса и назовите модуль класса EventMngr.
Поместите следующий код в модуль класса:
Public WithEvents appevent As Application
Private Sub appevent_DocumentOpen(ByVal Doc As Document)
'This code will only allow the event to fire once
Static hasOpened As Boolean
If hasOpened Then Exit Sub Else hasOpened = True
'Place Code Here...
End Sub
Затем вы можете поместить эту строку в обычный модуль перед любыми другими подпрограммами / функциями.
'application level event handler
Public myEventHandler As New EventMngr
И, наконец, поместите это в свой ленточный модуль OnLoad:
'application event handler
Set myEventHandler.appevent = Application