「excel vba word 行単位で取得」
という検索で、このサイト・インストラクターのネタ帳へのアクセスが、ありました。
行単位・一行ごとにWord文書の文字列を取得する、Excel VBA(Visual Basic for Applications)のコードを探している方による検索でしょう。
文字列を行単位で取得するのは面倒
Word文書の文字列を、行単位で取得するのはちょっと面倒です。
段落単位で取得するのであればDocumentオブジェクトのParagraphsコレクションに対してループ処理を行えば済みます。文単位で取得するのであればDocumentオブジェクトのSentencesコレクションに対してループ処理を行えば済みます。
しかし行の場合、DocumentオブジェクトからLinesコレクションを簡単に取得することはできません。行というのは段落や文と異なり、単なる見た目ですから、Windowオブジェクトから階層を辿って取得する必要があるのです。
「excel vba word 行単位で取得」
という検索をなさった方は、Excelマクロを作りたかったのだと思いますが、利用するWordのオブジェクトモデルがちょっと厄介なので、Word文書の文字列を行単位で取得するWordマクロをまずはご紹介します。
一行ずつ文字列を取得するサンプルマクロ
以下のようなWordマクロで、アクティブなWord文書の文字列を一行ずつ取得することができます。
Dim pg As Page
Dim rc As Rectangle
Dim ln As Line
With ActiveWindow
.View.Type = wdPrintView
For Each pg In .ActivePane.Pages
For Each rc In pg.Rectangles
For Each ln In rc.Lines
If rc.RectangleType = wdTextRectangle Then
MsgBox ln.Range.Text
End If
Next ln
Next rc
Next pg
End With
上記のマクロを実行すると、アクティブな文書の文字列が1行ずつ順番にメッセージボックスに表示されます。
サンプルマクロで利用しているオブジェクトモデルについて
ご紹介済みの1ページずつ順番に選択するWordマクロで利用している、
With ActiveWindow
For Each pg In .ActivePane.Pages
というページを順番に取得するFor Each~Nextループの中で、
For Each rc In pg.Rectangles
というRectangelを順番に取得するFor Each~Nextループの中で、
For Each ln In rc.Lines
という行を順番に取得するFor Each~Nextループを回しています。
2013までのWordの場合は、
For Each rc In pg.Rectangles
というFor Each~Nextループは不要っぽいのですが、Word 2016ではRectangleオブジェクトの扱いが変わってしまっているようなので(Word 2016の動きはバグなのではないかと思っているのですが)、For Each~Nextループを3階層にして、念のため、
If rc.RectangleType = wdTextRectangle Then
と、Rectangleオブジェクトの種別をチェックするようにしています。
で、最終的に各ページの各行を表すLineオブジェクトを取得するために、以下のような深い階層を辿っています。
Windowオブジェクト ← ActiveWindowプロパティ
└Paneオブジェクト ← Window.ActivePaneプロパティ
└Pagesコレクション ← Pane.Pagesプロパティ
└Pageオブジェクト ← Pages.Itemメソッド
└Rectanglesコレクション ← Page.Rectanglesプロパティ
└Rectangleオブジェクト ← Rectangles.Itemメソッド
└Linesコレクション ← Rectangle.Linesプロパティ
└Lineオブジェクト ← Lines.Itemメソッド
Home » ワードマクロ・Word VBAの使い方 » 文字列を一行ずつ行単位で取得するWordマクロ