如何使用 VBA 将页码字段逻辑插入到我的 Word 模板的页脚中?
How can I insert page numbering field logic into a footer on my Word template using VBA?
我有一个 word 模板,它根据部分使用不同的页脚字段。有时,此模板的用户会弄乱页脚,因此我正在编写一个宏来通过将默认页脚字段放回原处来修复页脚。
页脚字段中有一些基于部分的字段逻辑,基本上我需要执行以下操作:
从第 5 部分重新开始页码
根据以下部分将文本插入第 1 行第 2 列页脚的 table
第 1 至 4 节:
{ PAGE } //注意这是罗马数字格式,页脚设置了'Different first page'选项
从第 5 节开始
{ if { page } < { = { pageref ReferencesEnd } + 1 } "Page { = { page } } of { = { pageref ReferencesEnd }" “{Styleref "Att-Appendix Heading" \n }”
我已经成功完成了第一步,并为第 1 部分到第 4 部分插入了字段,但是我正在努力解决如何以编程方式将第 5+ 部分的复杂字段逻辑插入到我的相关页脚中使用 VBA 的模板?
我需要的代码在下面的代码块中被注释为:
'此处需要代码以将以下字段逻辑插入页脚
Sub FixPageNumbering()
Dim intSect As Integer
On Error Resume Next
'Insert footer code for Sections 1-4 into row1,col1 of 2x2 table
For intSect = 1 To 4
With ActiveDocument.Sections(intSect).Footers(wdHeaderFooterPrimary)
.PageNumbers.NumberStyle = wdPageNumberStyleLowercaseRoman
.Range.Tables(1).Rows(1).Cells(2).Select
Selection.TypeText Text:="Page "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
"PAGE ", PreserveFormatting:=True
End With
Next intSect
'Set page numbering to restart at #1 from Section 5
With ActiveDocument.Sections(5).Footers(wdHeaderFooterPrimary).PageNumbers
.RestartNumberingAtSection = True
.StartingNumber = 1
End With
'Insert footer code for Sections 5 and onwards into row1,col1 of 2x2 table
For intSect = 5 To ActiveDocument.Sections.Count
With ActiveDocument.Sections(intSect).Footers(wdHeaderFooterPrimary)
.PageNumbers.NumberStyle = wdPageNumberStyleArabic
.Range.Tables(1).Rows(1).Cells(2).Select
'NEED CODE HERE TO INSERT THE FOLLOWING FIELD LOGIC INTO FOOTER
'{ if { page } < { = { pageref ReferencesEnd } + 1 } "Page { = { page } } of { = { pageref ReferencesEnd }" "{Styleref "Att-Appendix Heading" \n }"
End With
Next intSect
ActiveWindow.View.Type = wdPrintView
End Sub
对于第 5 节及以后的部分,页脚字段应显示页码为 &,或者当有附录时(对于 ReferencesEnd 书签之后存在的页面)它将显示 "Appendix #"
虽然可以通过 VBA 创建复杂的字段结构,但您最好将所需的字段代码存储在源文档中的两个单独段落中,您的宏可以从中将它们复制并粘贴到目标文档中的适当位置。使用这种方法,您可以使用如下代码:
Sub Demo()
Application.ScreenUpdating = False
Dim DocSrc As Document, DocTgt As Document
Dim i As Long, Rng As Range, HdFt As HeaderFooter
Set DocSrc = ThisDocument
With Application.FileDialog(FileDialogType:=msoFileDialogFilePicker)
.Title = "Select the target file"
.AllowMultiSelect = False
If .Show = -1 Then
Set DocTgt = Documents.Open(.SelectedItems(1))
Else
MsgBox "No target file selected. Exiting", vbExclamation
GoTo ErrExit
End If
End With
With DocTgt
For i = 1 To .Sections.Count
Select Case i
Case 1 To 4: Set Rng = DocSrc.Paragraphs(1).Range
Case Else: Set Rng = DocSrc.Paragraphs(2).Range
End Select
With .Sections(i)
For Each HdFt In .Footers
With HdFt
If .Exists Then
If .LinkToPrevious = False Then
.Range.FormattedText = Rng.FormattedText
.Range.Characters.Last.Delete
End If
End If
End With
Next
End With
Next
End With
ErrExit:
Set Rng = Nothing: Set DocSrc = Nothing: Set DocTgt = Nothing
Application.ScreenUpdating = True
End Sub
如有必要,尽管这似乎不太可能,但您可以在上面添加代码以应用所需的编号格式 - 或者您可以将适当的开关添加到字段代码本身。
PS:您的第二个域代码可以简化为-
{IF{PAGE}< {={PAGEREF ReferencesEnd}+1} "Page {PAGE} of {PAGEREF ReferencesEnd}" {STYLEREF "Att-Appendix Heading" \n}}
如前所述,可以通过 VBA 创建复杂的字段结构。对于这种方法,您可以使用如下代码:
Sub Demo()
Application.ScreenUpdating = False
Dim DocTgt As Document, StrCode As String
Dim i As Long, Rng As Range, HdFt As HeaderFooter
With ActiveDocument
For i = 1 To .Sections.Count
Select Case i
Case 1 To 4
With .Sections(i)
For Each HdFt In .Footers
With HdFt
If .Exists Then
With .PageNumbers
.NumberStyle = wdPageNumberStyleLowercaseRoman
.RestartNumberingAtSection = False
End With
If .LinkToPrevious = False Or i = 1 Then
.Range.Fields.Add .Range, wdFieldEmpty, "PAGE", False
End If
End If
End With
Next
End With
Case Else:
With .Sections(i)
For Each HdFt In .Footers
With HdFt
If .Exists Then
If i = 5 Then
.LinkToPrevious = False
With .PageNumbers
.NumberStyle = wdPageNumberStyleArabic
.RestartNumberingAtSection = True
.StartingNumber = 1
End With
Else
With .PageNumbers
.NumberStyle = wdPageNumberStyleArabic
.RestartNumberingAtSection = False
End With
End If
If .LinkToPrevious = False Then
With .Range
.Fields.Add .Duplicate, wdFieldEmpty, "IF< ""Page of """, False
Set Rng = .Duplicate
With Rng
.Start = .Start + 19
.Collapse wdCollapseStart
.Fields.Add .Duplicate, wdFieldEmpty, "STYLEREF ""Att-Appendix Heading"" \n", False
End With
Set Rng = .Duplicate
With Rng
.Start = .Start + 17
.Collapse wdCollapseStart
.Fields.Add .Duplicate, wdFieldEmpty, "PAGEREF ReferencesEnd", False
End With
Set Rng = .Duplicate
With Rng
.Start = .Start + 13
.Collapse wdCollapseStart
.Fields.Add .Duplicate, wdFieldEmpty, "PAGE", False
End With
Set Rng = .Duplicate
With Rng
.Start = .Start + 6
.Collapse wdCollapseStart
.Fields.Add .Duplicate, wdFieldEmpty, "=+1", False
.Start = .Start + 3
.Collapse wdCollapseStart
.Fields.Add .Duplicate, wdFieldEmpty, "PAGEREF ReferencesEnd", False
End With
.Start = .Start + 4
.Collapse wdCollapseStart
.Fields.Add .Duplicate, wdFieldEmpty, "PAGE", False
End With
End If
End If
End With
Next
End With
End Select
Next
End With
End Sub
我有一个 word 模板,它根据部分使用不同的页脚字段。有时,此模板的用户会弄乱页脚,因此我正在编写一个宏来通过将默认页脚字段放回原处来修复页脚。
页脚字段中有一些基于部分的字段逻辑,基本上我需要执行以下操作:
从第 5 部分重新开始页码
根据以下部分将文本插入第 1 行第 2 列页脚的 table
第 1 至 4 节: { PAGE } //注意这是罗马数字格式,页脚设置了'Different first page'选项
从第 5 节开始 { if { page } < { = { pageref ReferencesEnd } + 1 } "Page { = { page } } of { = { pageref ReferencesEnd }" “{Styleref "Att-Appendix Heading" \n }”
我已经成功完成了第一步,并为第 1 部分到第 4 部分插入了字段,但是我正在努力解决如何以编程方式将第 5+ 部分的复杂字段逻辑插入到我的相关页脚中使用 VBA 的模板? 我需要的代码在下面的代码块中被注释为: '此处需要代码以将以下字段逻辑插入页脚
Sub FixPageNumbering()
Dim intSect As Integer
On Error Resume Next
'Insert footer code for Sections 1-4 into row1,col1 of 2x2 table
For intSect = 1 To 4
With ActiveDocument.Sections(intSect).Footers(wdHeaderFooterPrimary)
.PageNumbers.NumberStyle = wdPageNumberStyleLowercaseRoman
.Range.Tables(1).Rows(1).Cells(2).Select
Selection.TypeText Text:="Page "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
"PAGE ", PreserveFormatting:=True
End With
Next intSect
'Set page numbering to restart at #1 from Section 5
With ActiveDocument.Sections(5).Footers(wdHeaderFooterPrimary).PageNumbers
.RestartNumberingAtSection = True
.StartingNumber = 1
End With
'Insert footer code for Sections 5 and onwards into row1,col1 of 2x2 table
For intSect = 5 To ActiveDocument.Sections.Count
With ActiveDocument.Sections(intSect).Footers(wdHeaderFooterPrimary)
.PageNumbers.NumberStyle = wdPageNumberStyleArabic
.Range.Tables(1).Rows(1).Cells(2).Select
'NEED CODE HERE TO INSERT THE FOLLOWING FIELD LOGIC INTO FOOTER
'{ if { page } < { = { pageref ReferencesEnd } + 1 } "Page { = { page } } of { = { pageref ReferencesEnd }" "{Styleref "Att-Appendix Heading" \n }"
End With
Next intSect
ActiveWindow.View.Type = wdPrintView
End Sub
对于第 5 节及以后的部分,页脚字段应显示页码为 &,或者当有附录时(对于 ReferencesEnd 书签之后存在的页面)它将显示 "Appendix #"
虽然可以通过 VBA 创建复杂的字段结构,但您最好将所需的字段代码存储在源文档中的两个单独段落中,您的宏可以从中将它们复制并粘贴到目标文档中的适当位置。使用这种方法,您可以使用如下代码:
Sub Demo()
Application.ScreenUpdating = False
Dim DocSrc As Document, DocTgt As Document
Dim i As Long, Rng As Range, HdFt As HeaderFooter
Set DocSrc = ThisDocument
With Application.FileDialog(FileDialogType:=msoFileDialogFilePicker)
.Title = "Select the target file"
.AllowMultiSelect = False
If .Show = -1 Then
Set DocTgt = Documents.Open(.SelectedItems(1))
Else
MsgBox "No target file selected. Exiting", vbExclamation
GoTo ErrExit
End If
End With
With DocTgt
For i = 1 To .Sections.Count
Select Case i
Case 1 To 4: Set Rng = DocSrc.Paragraphs(1).Range
Case Else: Set Rng = DocSrc.Paragraphs(2).Range
End Select
With .Sections(i)
For Each HdFt In .Footers
With HdFt
If .Exists Then
If .LinkToPrevious = False Then
.Range.FormattedText = Rng.FormattedText
.Range.Characters.Last.Delete
End If
End If
End With
Next
End With
Next
End With
ErrExit:
Set Rng = Nothing: Set DocSrc = Nothing: Set DocTgt = Nothing
Application.ScreenUpdating = True
End Sub
如有必要,尽管这似乎不太可能,但您可以在上面添加代码以应用所需的编号格式 - 或者您可以将适当的开关添加到字段代码本身。
PS:您的第二个域代码可以简化为-
{IF{PAGE}< {={PAGEREF ReferencesEnd}+1} "Page {PAGE} of {PAGEREF ReferencesEnd}" {STYLEREF "Att-Appendix Heading" \n}}
如前所述,可以通过 VBA 创建复杂的字段结构。对于这种方法,您可以使用如下代码:
Sub Demo()
Application.ScreenUpdating = False
Dim DocTgt As Document, StrCode As String
Dim i As Long, Rng As Range, HdFt As HeaderFooter
With ActiveDocument
For i = 1 To .Sections.Count
Select Case i
Case 1 To 4
With .Sections(i)
For Each HdFt In .Footers
With HdFt
If .Exists Then
With .PageNumbers
.NumberStyle = wdPageNumberStyleLowercaseRoman
.RestartNumberingAtSection = False
End With
If .LinkToPrevious = False Or i = 1 Then
.Range.Fields.Add .Range, wdFieldEmpty, "PAGE", False
End If
End If
End With
Next
End With
Case Else:
With .Sections(i)
For Each HdFt In .Footers
With HdFt
If .Exists Then
If i = 5 Then
.LinkToPrevious = False
With .PageNumbers
.NumberStyle = wdPageNumberStyleArabic
.RestartNumberingAtSection = True
.StartingNumber = 1
End With
Else
With .PageNumbers
.NumberStyle = wdPageNumberStyleArabic
.RestartNumberingAtSection = False
End With
End If
If .LinkToPrevious = False Then
With .Range
.Fields.Add .Duplicate, wdFieldEmpty, "IF< ""Page of """, False
Set Rng = .Duplicate
With Rng
.Start = .Start + 19
.Collapse wdCollapseStart
.Fields.Add .Duplicate, wdFieldEmpty, "STYLEREF ""Att-Appendix Heading"" \n", False
End With
Set Rng = .Duplicate
With Rng
.Start = .Start + 17
.Collapse wdCollapseStart
.Fields.Add .Duplicate, wdFieldEmpty, "PAGEREF ReferencesEnd", False
End With
Set Rng = .Duplicate
With Rng
.Start = .Start + 13
.Collapse wdCollapseStart
.Fields.Add .Duplicate, wdFieldEmpty, "PAGE", False
End With
Set Rng = .Duplicate
With Rng
.Start = .Start + 6
.Collapse wdCollapseStart
.Fields.Add .Duplicate, wdFieldEmpty, "=+1", False
.Start = .Start + 3
.Collapse wdCollapseStart
.Fields.Add .Duplicate, wdFieldEmpty, "PAGEREF ReferencesEnd", False
End With
.Start = .Start + 4
.Collapse wdCollapseStart
.Fields.Add .Duplicate, wdFieldEmpty, "PAGE", False
End With
End If
End If
End With
Next
End With
End Select
Next
End With
End Sub