索引的页码不正确

时间:2016-04-12 20:02:36

标签: ms-word word-vba

我正在通过宏构建索引,稍后,页码开始变得不稳定。起初,它们是正确的,但随着我们在文档中更深入,它们开始被抵消。

我有预感,因为我正在使用的代码使用范围(.Index.MarkEntry Range:=theRange ...),而范围的 end 的页面是页码的来源。

如何确保索引使用的页码是具有该范围中第一个字符的页面(这是否有意义?条目开始的任何页面,是我想要使用的页面)。< / p>

这是我的(截断相关性)代码:

Sub Find_Definitions()

Dim myDoc   As Word.Document
Dim oRng As Word.Range, rng As Word.Range, rngXE As Word.Range, tempHold As Word.Range
Dim addDefinition$, findText$, editedDefinition$
Dim meanTypes() As Variant
Dim rngEdited
Dim y&
Dim bFound  As Boolean

meanTypes = Array(Chr(150) & " means", Chr(151) & " means", "- means", Chr(150) & " meaning", Chr(151) & " meaning", "- meaning")

Set myDoc = ActiveDocument
bFound = True

Call Clear_Index

For y = LBound(meanTypes) To UBound(meanTypes)
'Loop through the document
Set oRng = myDoc.Content
Set rngXE = oRng.Duplicate
With oRng.Find
    .ClearFormatting
    .ClearAllFuzzyOptions
    '.Text = findText
    .Text = meanTypes(y)
    .MatchCase = False
    .Wrap = wdFindStop
End With                     'orng.find

Do While bFound
    bFound = oRng.Find.Execute
    If bFound Then
        Set rngXE = oRng.Paragraphs(1).Range.Duplicate
        rngXE.Select

        ' Here's where I could check the text, and see if it starts with Roman numerals.
        editedDefinition = Check_For_Roman_Numerals(rngXE, findText)

        If editedDefinition <> "" Then    'If editedDefinition is empty, that means there's no definition to add to the index
            Set rngEdited = rngXE.Duplicate
            With rngEdited
                .moveStart unit:=wdCharacter, Count:=x
                .Select
‘ This next line is my idea that the range’s page number is being used, so I just wanted to print it to see.
                Debug.Print rngEdited.Information(wdActiveEndPageNumber)
            End With         'rngEdited

            myDoc.Indexes.MarkEntry Range:=rngEdited, entry:=editedDefinition, entryautotext:=editedDefinition

        End If               ''editedDefinition <> ""


        oRng.Collapse wdCollapseEnd
        oRng.Start = oRng.Paragraphs(1).Range.End
        oRng.End = myDoc.Content.End

        rngEdited.Collapse wdCollapseEnd
        rngEdited.End = myDoc.Content.End
    '    Set rngXE = Nothing
    End If                   'bFound
Loop
bFound = True
Next y

TheEnd:
Set rng = Nothing
myDoc.Indexes(1).Update
MsgBox ("Added all definitions.")

End Sub

我在想我需要做的是“收紧”editedRange,所以它会在同一页面上结束?但如果定义跨越分页符,我想使用它出现的较小的页码(第一个)。

感谢您的任何想法/提示/想法。

1 个答案:

答案 0 :(得分:1)

通常,当索引中的页码与您期望的页码不匹配时,因为文档显示的内容不会出现在打印结果中。这会影响屏幕上的分页,&#34;推送&#34;内容&#34; down&#34;在文件中。大多数情况下,原因是字段代码,可以通过按Alt + F9来抑制字段代码,直到显示字段结果。

但是,此方法不适用于XE(索引标记)和其他一些字段类型,以及隐藏文本。只要显示&#34;隐藏&#34;它们就会显示文本是允许的。根据文件/选项/显示/&#34中的设置;始终在屏幕上显示这些格式标记&#34;点击&#34;向后P&#34;功能区主页选项卡中的按钮可能会也可能不会将其关闭。如果没有,那么你必须进入选项来进行显示,或者创建一个宏来执行此操作并根据需要运行它。

另一个可能的原因是,以编程方式生成的XE字段插入了一系列文本的末尾,这些文本突破到另一个页面,而不是在文本开始的页面上。为了确保字段是开始,而不是范围的结束,将范围折叠到其起点:

rngEdited.Collapse wdCollapseStart