通しの行番号を取得するFunction(Word)
通しの行番号を取得するFunction(Word)
前回
の続き。
文書全体を通じての通しの行位置を取得するFunctionを作った
考え方
[Range].Information
プロパティを参照すれば、Range
オブジェクトのあるページ位置(Information(wdActiveEndPageNumber)
)とか、ページ内での行位置(Information(wdFirstCharacterLineNumber)
)を取得することができる。
こいつらを組み合わせて、次のような手順で通しの行位置を取得することにする。
Range
オブジェクトのあるページ位置と、そのページ内での行位置を取得する- ページ位置が1ページ目にある場合は、そのまま行位置を返す
- ページ位置が2ページ目以降にある場合は、1ページ目から一つ手前のページまでの行数を累計して加算する
こんな感じ。
ちなみに、各ページの行数を取得するのは、前回述べた方法を用いる。
コード
作成したコードは次の通り。
リスト1
Public Function getLineNumber( _ ByVal tgtRange As Range) As Long Dim ret As Long 'tgtRangeのあるページ番号を取得' Dim currPage As Long currPage = tgtRange.Information(wdActiveEndPageNumber) 'tgtRangeのあるページ内での行番号を取得' Dim currLine As Long currLine = tgtRange.Information(wdFirstCharacterLineNumber) 'tgtRangeが1ページ目にあるときは、その行番号を返す' If currPage = 1 Then ret = currLine GoTo Finalizer: End If '2ページ以上ある時は、手前のページまでの累計を足さなければいけない' '親ドキュメントオブジェクトを取得' Dim Doc As Document Set Doc = tgtRange.Parent 'カーソル位置を記録' Dim orgRange As Range Set orgRange = Selection.Range '文書の先頭にカーソルを置く' Call Doc.Range(0, 0).Select Dim pageEnd As Long '1ページ目の最終位置を選択' Dim i As Long For i = 1 To currPage - 1 'ページの最終位置を取得' pageEnd = Doc.Bookmarks("\Page").End 'ページの末尾にカーソルを置く' Call Doc.Range(pageEnd - 1, pageEnd - 1).Select 'ページ末尾の行番号=そのページの総行数を加算' ret = ret + Selection.Range.Information(wdFirstCharacterLineNumber) '次のページの先頭へ' Call Selection.MoveRight(wdCharacter, 1, wdMove) Next ret = ret + currLine 'カーソル位置を戻す' Call orgRange.Select Finalizer: getLineNumber = ret End Function
例によって、コード内に詳しくコメントを書いたので、説明は省略。
これで、Range
オブジェクトを渡せば、そのRange
オブジェクトがある箇所の、文書内での通しの行位置(通し行番号の値)を取得することができる。
使ってみる
たとえば、
このように、通しの76行目(2ページ目にある。)にカーソルを置いた状態で、イミディエイト・ウィンドウに
?getLineNumber(Selection.Range)
と書いて[Enter]を押すと、
このように、ちゃんと「76
」が返る。
また、Range
オブジェクトは、Bookmark
オブジェクトからも取得できる([Bookmark].Range
プロパティ)ので、たとえば、
こんなふうに、64行目にある部分に「参照先01」という名前のブックマークを作成しておき、イミディエイト・ウィンドウに
?getLineNumber(ActiveDocument.Bookmarks("参照先01").Range)
と入力して[Enter]を押すと、
うむ。バッチリである!
おわりに
今回作成したFunctionをうまく使えば、文書中の「○行目参照」の「○」の部分を、参照先が移動しても正しく再設定するマクロが作れると思う。
リーチ!