各ページの行数を取得する(Word)
Wordドキュメントの、各ページの行数を調べる方法を編み出した(笑)ので、覚書として記しておく。
カーソルのあるページの総行数を取得する
[Document].Bookmarks.Item("\Page")の返り値
BookmarksコレクションのItemメソッドのIndexに"\Page"を指定すると、カーソルのあるページ全体を表すBookmarkオブジェクトが返るっぽい。
たとえば、テキトーなページのどこかにカーソルを置いて、イミディエイト・ウィンドウに
ActiveDocument.Bookmarks("\Page").Select
と打ち込んで[Enter]してやると、カーソルがあるページ全体が選択された状態になる。
[Bookmark].Endプロパティ
BookmarkオブジェクトのEndプロパティは、そのページの最後の文字の、文書先頭から数えた位置を返す。
したがって、たとえば、
Dim Doc As Document
Set Doc = ThisDocument
Dim pageEnd As Long
pageEnd = Doc.Bookmarks("\Page").End
Call Doc.Range(pageEnd - 1, pageEnd - 1).Select '……(*)'
このようにすると、カーソルを置いてあったページの一番最後の位置にカーソルを移動させることになる。
[Range].Informationプロパティ
カーソル位置のRangeオブジェクトは、
Selection.Range
とすれば取得できる。
で、RangeオブジェクトにはInformationというプロパティがあり、引数の指定次第で実に色々な情報を取得することができる。
たとえば、WdInformation列挙体のメンバであるwdFirstCharacterLineNumber(=10)を指定してやると、そのRangeオブジェクトの1文字目の場所の、ページ内での行番号を返してくれる。
つまり、上掲コードの(*)の段階で、ページ末尾が選択されているので、ここで
Selection.Range.Information(wdFirstCharacterLineNumber)
とすれば、そのページ内の総行数を取得できることになる。
次のページに移動する
これは簡単。
すでにカーソルはページの末尾にあるのだから、一つだけ右に移動すればよい。
カーソルを動かすには、SelectionオブジェクトのMoveRightメソッドを使う。
Call Selection.MoveRight(wdCharacter, 1, wdMove)
これだけ。
各ページの行数を取得するマクロ
上記の各項目を総合して、ドキュメントの各ページの行数を取得して、イミディエイト・ウィンドウに出力するマクロを作った。
リスト1
Private Sub test04()
Dim Doc As Document
Set Doc = ThisDocument
'最初のカーソル位置を記録'
Dim orgRange As Range
Set orgRange = Selection.Range
'文書の先頭を選択'
Call Doc.Range(0, 0).Select
'1ページ目の末尾の位置を取得'
Dim pageEnd As Long
pageEnd = Doc.Bookmarks("\Page").End
'1ページ目の末尾を選択'
Call Doc.Range(pageEnd - 1, pageEnd - 1).Select
Dim n As Long
n = 1
Do
'ページ末尾のページ内での行番号を出力'
Debug.Print getPageNumber(n) & " page has " & _
Selection.Range.Information( _
wdFirstCharacterLineNumber) & _
" lines."
'文書の末尾に到達していたらExit'
If pageEnd + 1 = Doc.Range.End Then Exit Do
'一つ右へ。(次のページの先頭位置へ。)'
Call Selection.MoveRight(wdCharacter, 1, wdMove)
'ページの末尾位置を取得して選択'
pageEnd = Doc.Bookmarks("\Page").End
Call Doc.Range(pageEnd - 1, pageEnd - 1).Select
'nをインクリメント'
n = n + 1
Loop
'元のカーソル位置に戻す'
Call orgRange.Select
End Sub
Private Function getPageNumber( _
ByVal tgtPageNumber As Long) As String
Dim ret As String
Select Case tgtPageNumber
Case 0: ret = "None"
Case 1: ret = "1st"
Case 2: ret = "2nd"
Case 3: ret = "3rd"
Case Else: ret = CStr(tgtPageNumber) & "th"
End Select
getPageNumber = ret
End Function
細かくコメントを入れたので、説明は省略。
各ページを巡回して、そのページに何行あるかを語らせるマクロ。
もちろん、これだけでは何の役にも立たない。
実行


このようなドキュメントを準備。
1ページ目が42行、2ページ目が通し行番号で75行目まであるので、33行、ということになる。
上掲リスト1を実行すると、

バッチリ。
おわりに
これで野望にイーシャンテン。
次回の記事で野望にリーチがかかる予定。
参考
続きはコチラ。