我有一个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
看,代码是如此清晰易懂。