通しの行番号を取得するFunction(Word)

通しの行番号を取得するFunction(Word)

前回

akashi-keirin.hatenablog.com

の続き。

文書全体を通じての通しの行位置を取得する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オブジェクトがある箇所の、文書内での通しの行位置(通し行番号の値)を取得することができる。

使ってみる

たとえば、

f:id:akashi_keirin:20200531212013j:plain

このように、通しの76行目(2ページ目にある。)にカーソルを置いた状態で、イミディエイト・ウィンドウに

?getLineNumber(Selection.Range)

と書いて[Enter]を押すと、

f:id:akashi_keirin:20200531212016j:plain

このように、ちゃんと「76」が返る。

また、Rangeオブジェクトは、Bookmarkオブジェクトからも取得できる([Bookmark].Rangeプロパティ)ので、たとえば、

f:id:akashi_keirin:20200531212019j:plain

f:id:akashi_keirin:20200531212022j:plain

こんなふうに、64行目にある部分に「参照先01」という名前のブックマークを作成しておき、イミディエイト・ウィンドウに

?getLineNumber(ActiveDocument.Bookmarks("参照先01").Range)

と入力して[Enter]を押すと、

f:id:akashi_keirin:20200531212025j:plain

うむ。バッチリである!

おわりに

今回作成したFunctionをうまく使えば、文書中の「○行目参照」の「○」の部分を、参照先が移動しても正しく再設定するマクロが作れると思う。

リーチ!