Word VBAで検索した結果の段落とその範囲の開始位置を取得する方法

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Word VBAで段落の冒頭の全角スペースをインデントに変更するマクロを作っています。

前回の記事はコチラ。

Word VBAで文書全体で全角スペースのみを検索する方法
Word VBAで複数のドキュメントを一括処理するマクロの作り方をお伝えしています。今回は、その第一歩としてWord VBAで全角スペースを検索する方法をお伝えします。Word検索の方法を復習します。

文書の全体から全角スペースのみを検索する方法をお伝えしました。

今回はこれを一歩進めて、検索した全角スペースが含まれる段落を取得する、またその段落範囲の開始位置を取得する方法をお伝えします。

あ、今回ですが、はっきり言って地味です。ですが、マスターすればとても有用ですよ!

では、行ってみましょう!

スポンサーリンク

前回のおさらい

前回作成したプロシージャはこちらです。

Sub removeSpaces()

With Selection.Find
    .Text = " "
    .Wrap = wdFindContinue
    .MatchByte = True
    Do While .Execute
        Stop
    Loop

End With

End Sub

全角スペースを見つけて順番に選択するプロシージャです。

ポイントとしては2点。

  • 5行目のWrapプロパティ:wdFindContinueを設定することにより文書全体を検索する
  • 6行目のMatchByteプロパティ:Trueを設定することで、全角と半角を区別する

今回のお題:発見した全角スペースが段落の冒頭かどうかを判定する

さて、最終的にやりたいことは、段落の冒頭が全角スペースであればインデントに変更をするという処理でしたね。

このプロシージャを実行していくと、全角スペースが順番に選択されるわけですが、以下のように段落冒頭の全角スペースのときは、インデントに変更をすればよいですよね。

Word VBAで全角スペースを検索した結果

ただし、以下のように段落の途中の全角スペースの場合もあります。この場合は、段落の冒頭にインデントを挿入しないようにする必要があります。

Word VBAで全角スペースを検索した結果2

その判定は、上記の図のように

  • Excecuteメソッドの結果選択されている全角スペースのStart
  • その全角スペースが含まれている段落範囲のStart

を比較することで実現可能です。

…わかりますか?

全角スペースが段落の最初の文字でなければ、全角スペースの位置を表す範囲のStartと、その段落範囲のStartは異なるはずということです。

検索結果の選択範囲の開始位置を求める

では、Excecuteメソッドの結果選択されている全角スペースの位置を取得してみましょう。

選択されているのですから、その範囲はSelectionオブジェクトです。Selectionオブジェクトの開始位置はStartプロパティで取得できましたよね。

Selection.Start
Word VBAでカーソル位置に文字を入力するとっても簡単なプログラム
Word VBA初心者向けシリーズ。今回は、文字を入力する方法の中で最もシンプルな方法を紹介。SelectionオブジェクトのtypeTextメソッドを使って、現在のカーソル位置に文字を入力する方法です。

ですから、Excecuteメソッドで発見した全角スペースの範囲の開始位置は、そのまんま以下で取得できるということです。

Selection.Start

検索結果を含む段落範囲の開始位置を求める

続いて、検索結果の全角スペースを含む段落範囲の開始位置を求めます。

こちらはちょっと道のりが長いですよ。

まず、検索結果の選択範囲を含む段落はSelectionオブジェクトのParagraphsプロパティで集合として取得することができます。

Selection.Paragraphs

今回の場合、Selectionは全角スペース1文字ですから、取得したParagraphsコレクションの要素はただ1つです。ですから、取得したい段落は最初の要素つまりFirstプロパティ

Paragraphsコレクション.First

を使って取得できますね。

その段落の開始位置を知りたいのですが、残念ながらParagraphオブジェクトにはStartプロパティがありません。

ですので、いったんRangeプロパティで範囲を取得します。

Paragraphオブジェクト.Range

これら一連のプロパティについては以下記事でも紹介していますので、ご参考ください。

Word VBAで選択範囲の最初の段落&最後の段落を取得する方法
初心者向けWord VBAを使って便利な入力ツールを作る方法をお伝えしています。 今回はWord VBAで選択範囲の中から最初の段落と最後の段落を取得して、その文字列を出力する方法をお伝えします。

そして、範囲つまりRangeオブジェクトの開始位置はStartプロパティで、終了位置はEndプロパティで取得できます。

Rangeオブジェクト.Start
Rangeオブジェクト.End

これらを踏まえますと、検索結果を含む段落範囲の開始位置を求めることができ、以下のように書きます。

Selection.Paragraphs.First.Range.Start

検索した全角スペースが段落の冒頭かどうかを判定するプロシージャ

これらの二つを比較して同じかどうかを判断すればよいということですね。

そこで、以下のようなプロシージャを作りました。

Sub removeSpaces()

With Selection.Find
    .Text = " "
    .Wrap = wdFindContinue
    .MatchByte = True
    Do While .Execute
        If Selection.Start = Selection.Paragraphs.First.Range.Start Then
            Debug.Print "インデントに差し替えます"
        Else
            Debug.Print "何もしません"
        End If
        Stop
    Loop

End With

End Sub

全角スペースを検索するたびに、段落の冒頭かどうかを判定して、冒頭であれば「インデントに差し替えます」、そうでなければ「何もしません」とデバッグ出力されます。

まとめ

Word VBAで検索結果が含まれる段落を取得し、その段落範囲の開始位置を取得する方法についてお伝えしました。

特別なテクニックは使っていませんが

Selection.Paragraphs.First.Range.Start

こういった表現がシュパっと出てくるようになると、本当にいろいろなことができるようになります。

ぜひ、いろいろ試してみてください。

では、次回いよいよインデントに差し替える処理を追加していきます。

Word VBAで段落先頭の全角スペースを一括でインデントに変更するマクロの作り方
Word VBAで段落の冒頭の全角スペースをインデントに一括変更するマクロの作り方をお伝えしています。今回はいよい*Word VBAで全角スペースをインデントに変更していく処理を追加するマクロを完成させます。

どうぞお楽しみに!

連載目次:Word VBAで全角スペースをインデントに一括変更する

Wordで文書を作成するときに、段落の冒頭をうっかり全角スペースにしてしまったりすることありますよね。全部インデントに統一しておきたい、そんなときに使える一括変更マクロを作っていきます。
  1. Word VBAで文書全体で全角スペースのみを検索する方法
  2. Word VBAで検索した結果の段落とその範囲の開始位置を取得する方法
  3. Word VBAで段落先頭の全角スペースを一括でインデントに変更するマクロの作り方
タイトルとURLをコピーしました