我有一个使用许多不同字段的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
答案 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
请参阅,代码清晰易懂。