我有一个带有自定义功能区的全局模板。尝试打开文档时,出现错误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打开文档(通过简单的双击)?我确定我在这里遗漏了一些东西,但是我很难在网上找到有关此信息的任何信息。
答案 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过程。