Home » ワードマクロ・Word VBAの使い方 » 文字列を一行ずつ行単位で取得するWordマクロ

文字列を一行ずつ行単位で取得するWordマクロ

対象:Word2007, Word2010, Word2013, Windows版Word2016

「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文書の文字列を一行ずつ取得することができます。

Sub 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

End Sub

上記のマクロを実行すると、アクティブな文書の文字列が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マクロ

「ワードマクロ・Word VBAの使い方」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.