我正在从模板中构建一个大型文档。每个模板在页脚中都有一个关键字#OVERALLPAGENUMBER#
,我用编程方式替换(使用Excel VBA)字段。
如果我需要的只是该文件的页码,以下就足够了:
Dim storyRange As Object 'Word.Range
For Each storyRange In oDoc.StoryRanges
Do
With storyRange.Find
.Text = "#OVERALLPAGENUMBER#"
.Wrap = 1 'wdFindContinue
.Execute
While .found
storyRange.Fields.Add Range:=storyRange, Type:=-1, Text:="PAGE", PreserveFormatting:=True
.Execute
Wend
End With
On Error Resume Next
Set storyRange = storyRange.NextStoryRange
On Error GoTo 0
Loop While Not storyRange Is Nothing
Next
我已经测试了这段代码,它成功地将页码放在页脚中。但是,我想要的是嵌套(公式)字段,它为页码添加固定数字,以便我可以在多个文档中显示页数。我的解决方案,如果我手动(使用Ctrl + F9),会给出如下所示的字段代码:
{ = 5 + { PAGE } }
在第1页正确生成“6”,第2页正确生成“7”等等。
无论我尝试什么,我都无法使用VBA复制这种字段嵌套。 (宏录制器在这里没用)。任何人都可以找到以编程方式创建这些字段的方法吗?
解决方案
我的问题是让PreserveFormatting:=True
阻碍了我尝试将一个字段嵌套在另一个字段中。现在,以下简单的解决方案有效:
With storyRange.Find
.Text = "#POLICYPAGENO#"
.Wrap = 1 'wdFindContinue
.Execute
While .found
storyRange.Select
With oDoc.ActiveWindow
.Selection.Fields.Add Range:=.Selection.Range, Type:=-1, Text:="PAGE", PreserveFormatting:=False
.Selection.MoveLeft Unit:=1, Count:=1, Extend:=1
.Selection.Fields.Add Range:=.Selection.Range, Type:=-1, PreserveFormatting:=False
.Selection.TypeText Text:="= " & OverallPageNumber & " +"
End With
.Execute
Wend
End With
答案 0 :(得分:1)
我很确定您的查找和替换方法会在每次循环时选择文本#OVERALLPAGENUMBER#
。如果是这种情况,您可以使用以下内容替换storyRange.Fields.Add Range:=storyRange, Type:=-1, Text:="PAGE", PreserveFormatting:=True
,这只会将您所需的字段代码放在当前选择中:
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=False
Selection.TypeText Text:="= 5 +"
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=False
Selection.TypeText Text:="PAGE"
Selection.Fields.Update
修改:以前的代码仅在PreserveFormatting
设置为False
时才有效。如果PreserveFormatting
设置为True
,Word似乎会更新空字段代码。您可以导航选择以使用以下内容保持格式。你应该只需PreserveFormatting
来获得外场。
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=True
Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Selection.Fields.ToggleShowCodes
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.TypeText Text:="= 5 +"
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=False
Selection.TypeText Text:="PAGE"
Selection.Fields.Update
答案 1 :(得分:0)
我知道这很旧,但是昨天尝试这样做,我发现创建嵌套字段的解决方案比使用Selection对象更简单。我在网上找到的唯一解决方案错误地指出,如果不使用Selection对象,就无法插入嵌套字段。但是,我发现您可以在Field.Code范围中插入一个嵌套字段,这使代码更易于操作,更快且更直观。如:
Dim storyRange As Object 'Word.Range
For Each storyRange In oDoc.StoryRanges
Do
With storyRange.Find
.Text = "#OVERALLPAGENUMBER#"
.Wrap = 1 'wdFindContinue
.Execute
While .Found
Set fld1 = storyRange.Fields.Add(Range:=storyRange, Type:=-1, Text:="=p+" & OverallPageNumber, PreserveFormatting:=False)
Set fld2 = storyRange.Fields.Add(Range:=fld1.Code.Characters(3), Type:=-1, Text:="PAGE", PreserveFormatting:=False)
fld1.Update
.Execute
Wend
End With
On Error Resume Next
Set storyRange = storyRange.NextStoryRange
On Error GoTo 0
Loop While Not storyRange Is Nothing
Next