Home » ワードマクロ・Word VBAの使い方 » 文字列を検索して行番号・ページ番号を取得するWordマクロ

文字列を検索して行番号・ページ番号を取得するWordマクロ

対象:Word2007, Word2010, Word2013

「word vba 検索 行 取得」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがあることに気が付きました。

Word VBA(Visual Basic for Applications)の検索関連のコードを探していることはわかりますが、
「word vba 検索 行 取得」
というキーワードだけでは、具体的に何を探していたのか判断に迷いますので、ここでは実務でニーズがありそうな、文字列を検索してページ番号と行番号を取得するマクロをご紹介しておきます。

[スポンサードリンク]

文字列を検索してページ番号と行番号を取得するサンプルマクロ

下記のマクロを実行すると、定数・SRCHに指定した文字列がアクティブな文書の中で検索され、見つかったページ番号と行番号がイミディエイトウィンドウに出力されます。

Sub 文字列を検索してページ番号と行番号を取得する()
 Const SRCH = "検索する文字列"

 Dim rng As Range
 Set rng = ActiveDocument.Range(0, 0)

 rng.Find.Text = SRCH

 Do While rng.Find.Execute
  Debug.Print _
   rng.Information(wdActiveEndAdjustedPageNumber) & vbTab & _
   rng.Information(wdFirstCharacterLineNumber)
 Loop

End Sub

上記のマクロで利用しているオブジェクトモデルの階層関係は下図のとおりです。

文字列を検索して行番号・ページ番号を取得するWordマクロ

Range.FindではExecute後にRangeが再定義される

Word VBAで検索を行うコードを自分で書けるようになるためには、RangeオブジェクトとFindオブジェクトの関係を、しっかりと理解する必要があります。

特にExcel VBAの経験がある方の場合、Word VBAのRangeオブジェクトからFindオブジェクトを取得した場合にRangeオブジェクトが勝手に再定義される、ということを理解しておくことはとても大切です。

文字列を検索して、ページ番号と行番号を取得するWordマクロは、実にさまざまな書き方ができますが、上記のマクロはRangeオブジェクトからFindオブジェクトを取得したときに、Rangeオブジェクトが再定義されるということを、感じていただきやすいコードにしています。

文字列を検索してページ番号と行番号を取得する処理の流れ

まずオブジェクト変数・rngに、Document.Rangeメソッドを使って、アクティブな文書の先頭位置をセットします。
 Set rng = ActiveDocument.Range(0, 0)

文字列を検索して行番号・ページ番号を取得するWordマクロ

定数・SRCHで指定しされている文字列を、検索したい文字列として設定して、
 rng.Find.Text = SRCH

FindオブジェクトのExecuteメソッドで検索を実行します。
 Do While rng.Find.Execute

FindオブジェクトのExecuteメソッドは、検索して見つかった場合にはTrueを、見つからなかった場合はFalseを返してきます。

文字列を検索して行番号・ページ番号を取得するWordマクロ

ここでは、
 Do While rng.Find.Execute
 Loop
というループにすることで、検索して見つかる限り、Do~Loopループを回しつづけるという処理になっています。

そして、rng.Find.Executeというオブジェクト式で文字列が見つかった場合、変数・rngの中身が、見つかった場所を表すRangeオブジェクトになってしまうというのがポイントです。

中身の変わった変数・rngの、ページ番号と行番号をRange.Informationプロパティを使って取得して、イミディエイトウィンドウに出力しています。
  Debug.Print _
   rng.Information(wdActiveEndAdjustedPageNumber) & vbTab & _
   rng.Information(wdFirstCharacterLineNumber)

ExcelのRange.FindとWordのRange.Findはまったく別物

特にExcel VBAのRange.Findメソッドに慣れている方だと、「Range」「Find」という同じ語句が登場するために混乱してしまいがちですが、Excel VBAとWord VBAでは別のアプリケーションをVBAで操作しているわけですから、Word VBAで登場するRangeやFindは、Excel VBAのRangeやFindとは、別物です。

Excel VBAのRangeとWord VBAの「Range」は、たまたま同じスペルの語句になっているだけで中身はまったく違います。

「Find」も、Excel VBAとWord VBAで、たまたま同じスペルの語句になっているだけで中身はまったく違います。

最終更新日時:2019-01-03 08:55

[スポンサードリンク]

Home » ワードマクロ・Word VBAの使い方 » 文字列を検索して行番号・ページ番号を取得するWordマクロ

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

検索


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

.