3

我有一个使用许多不同字段的 Word 文档。我编写了一个宏来更新文档中的所有sequence, reference, page 和numpages字段。

更新文本字段会将它们恢复为默认文本,因此我不希望这些更新。

这个宏在 Word 2007 中运行良好,但我最近更新到 Word 2013,它不再正常运行。

numpages此宏运行时,所有页面和字段都设置为 1。然而,当我手动更新它们时,它们会正确更新。

Office 2013 中的字段更新方式是否发生了变化?

宏代码如下。

Sub UpdateAllFields()
UnprotectDocument

'UpdateAllFields Macro
    Dim objDoc As Document
    Dim objFld As Field

'Updates the specified form fields. This can take a while when the document gets large
    Set objDoc = ActiveDocument
    For Each objFld In objDoc.Fields
        If objFld.Type = wdFieldRef Then 'Updates Cross References
            objFld.Update
        If objFld.Type = wdFieldPage Then 'Updates Page Numbers
            objFld.Update
        ElseIf objFld.Type = wdFieldNumPages Then 'Updates Total Page Count
            objFld.Update
        ElseIf objFld.Type = wdFieldSequence Then 'Updates Sequence Fields
            objFld.Update
        End If
    Next objFld

ProtectDocument

End Sub
4

2 回答 2

1

当我使用 ActiveDocument.Fields.Update 时,页面引用都指向文档中的第 1 页,但当我手动更新它们时它也起作用了。经过一些试验和错误后,我注意到它可以使用 Selection.Fields.Update,因此我将宏修改为以下内容:

Sub UpdateAllFields()
Dim oCurrentRng As Range
Dim oRng As Range

Application.ScreenUpdating = False
Set oCurrentRng = Selection.Range
Set oRng = ActiveDocument.Range
oRng.Select
Selection.Fields.Update

oCurrentRng.Select
Application.Screenupdating = True
End Sub

希望它可以帮助某人!

//大卫

于 2017-02-22T16:06:06.253 回答
0

您应该使用SELECT而不是多个 IF ELSE,如下所示:

Sub UpdateAllFields()

   UnprotectDocument

   'UpdateAllFields Macro
   Dim objDoc As Document
   Dim objFld As Field

   'Updates the specified form fields. 
   'This can take a while when the document gets large
   Set objDoc = ActiveDocument

   For Each objFld In objDoc.Fields

       Select Case objFld.Type

           Case wdFieldRef, wdFieldPage, wdFieldNumPages, wdFieldSequence
               objFld.Update

       End Select

   Next objFld

   ProtectDocument

End Sub

看,代码是如此清晰易懂。

于 2015-07-18T07:12:50.553 回答