2

我正在从模板中构建一个大文档。每个模板#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
4

2 回答 2

3

我知道这是旧的,但昨天尝试这样做,我发现创建嵌套字段比使用 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
于 2019-06-19T23:24:48.653 回答
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如果设置为,Word 似乎会更新一个空域代码True。您可以导航选择以保留以下格式。您应该只需要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
于 2013-03-11T12:36:35.420 回答