各ページの行数を取得する(Word)
各ページの行数を取得する(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を実行すると、
バッチリ。
おわりに
これで野望にイーシャンテン。
次回の記事で野望にリーチがかかる予定。
参考
続きはコチラ。