2016-04-12 13 views
0

マクロを使用してインデックスを作成していますが、少し後にページ番号がうごめきになります。最初は正しいものですが、ドキュメントの深さが深くなるにつれてオフセットが発生します。インデックスのページ番号が正しくありません

私は使用しているコードが範囲(.Index.MarkEntry Range:=theRange ...)を使用しており、範囲のエンドのページがページ番号の出所であるため、私はそれが愚かです。

インデックスで使用するページ番号が範囲内の最初の文字を持つページであることを確認するにはどうすればよいですか(それは意味がありますか?ここで

は私の(関連性のために切り捨て)コードです:

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

@ CindyMeister - それは 'RngEdited.Start = oRng.paragraphs(1).Range.End'を行うことを意味しますか?私はまだ単語が範囲を使用する方法の周りに私の頭をラッピングして、あなたの助けを感謝しています! – BruceWayne

+1

Rangeオブジェクトには、Collapseメソッドがあります。あなたがセレクションを持っているときに左(または右)矢印キーを押すのと同じように考えてください。 –

答えて

1

一般に、インデックスのページ番号が期待どおりでない場合、ドキュメントには印刷結果に含まれないコンテンツが表示されるためです。これは、画面上のページネーションに影響を与え、ドキュメント内のコンテンツを「押し下げ」ます。フィールドコードが表示されるまでAlt + F9キーを押すと表示されなくなります。

このアプローチは、XE(インデックスマーカー)や他のいくつかのフィールドタイプ、および隠しテキストでは機能しません。 「隠れた」テキストの表示が許可されているときは常に表示されます。ファイル/オプション/表示/「これらの書式マークを常に画面に表示する」の設定に応じて、リボンの「ホーム」タブの「後方P」ボタンをクリックすると、それらがオフになる場合もあります。表示されていない場合は、ディスプレイを表示するオプションを選択するか、またはこれを実行するマクロを作成し、必要に応じて実行する必要があります。

考えられる他の理由は、プログラムで生成されたXEフィールドが、テキストが始まるページではなく、別のページに壊れた長いテキスト範囲の末尾に挿入されたためです。フィールドではなく範囲の端部よりも、その出発点に範囲を折りたたむ、スタートであることを確認するために:

rngEdited.Collapse wdCollapseStart 
+0

素晴らしい説明、ありがとう! – BruceWayne

関連する問題