在VBA中更新页码



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

更新文本字段会将它们还原为默认文本,所以我不想更新这些文本。

这个宏在Word 2007中工作得很好,但我最近更新到Word 2013,它不再正常工作了。

当这个宏运行时,

所有的page和 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

当我使用ActiveDocument.Fields时,页面引用都指向文档中的第1页。更新,但它工作时,我手动更新。经过一些尝试和错误之后,我注意到使用Selection.Fields可以正常工作。更新,所以我修改宏如下:

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

希望它能帮助到别人!

大卫

//

您应该使用SELECT而不是multiple 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

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

相关内容

  • 没有找到相关文章

最新更新