功能区onLoad子目录中的ActiveDocument错误4248

时间:2019-01-23 19:27:05

标签: vba ms-word ribbonx

我有一个带有自定义功能区的全局模板。尝试打开文档时,出现错误4248,该错误声称由于未打开任何文档而导致命令无法运行。

onLoad子目录中的代码正在检查以确保活动文档不是模板或Normal.dotm,因为我不希望通过调用的过程将文档变量写入这些文件。这在Word 2013中工作正常,但我注意到在Word 2016中,似乎在打开Word中的文档之前运行了功能区onLoad过程。 我已将问题定位到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 :(得分:0)

将代码移至应用程序级事件处理程序。该代码将在每次打开新文档时运行,但是可以根据需要进行补救(请参见代码注释)。

创建一个新的类模块,并将该类模块命名为EventMngr。

将以下代码放入类模块:

a.end() != b.end()

然后,您可以将该行放在任何其他子功能之前的普通模块中

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

最后,将其放置在Ribbon OnLoad子目录中:

'application level event handler
Public myEventHandler As New EventMngr

答案 1 :(得分:0)

类似于上一个答案,但可能更简单的方法是在代码中添加自动打开和自动更新过程,并在这些过程中捕获活动文档,而不是onload过程。