在VBA中更新页码

时间:2015-07-17 22:16:04

标签: vba reference word-vba page-numbering word-2013

我有一个使用许多不同字段的Word文档。我写了一个宏来更新所有 sequence reference ,页面和 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

2 个答案:

答案 0 :(得分: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

希望它对某人有帮助!

//大卫

答案 1 :(得分: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

请参阅,代码清晰易懂。