Ошибка ActiveDocument 4248 в ленте onLoad sub - PullRequest
0 голосов
/ 23 января 2019

У меня есть глобальный шаблон с настроенной лентой. Когда я пытаюсь открыть документ, я получаю сообщение об ошибке 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 ]

0 голосов
/ 24 января 2019

Аналогично предыдущему ответу, но, возможно, проще - добавить в ваш код процедуры автооткрытия и автообновления и захватить активный документ в этих процедурах, а не процедуру загрузки.

0 голосов
/ 24 января 2019

Переместить код в обработчик событий уровня приложения. Код будет запускаться каждый раз, когда открывается новый документ, но при необходимости его можно исправить (см. Комментарии к коду).

Создайте новый модуль класса и назовите модуль класса 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

И, наконец, поместите это в свою подпапку Ribbon OnLoad:

'application event handler
 Set myEventHandler.appevent = Application
...