![paragraph](https://tonari-it.com/wp-content/uploads/paragraph-2-680x383.jpg)
photo credit: Skley Paragraphendschungel 218/365 via photopin (license)
みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Word VBAで段落の冒頭の全角スペースをインデントに変更するマクロを作っています。
前回の記事はコチラ。
![](https://tonari-it.com/wp-content/uploads/word-space.jpg)
文書の全体から全角スペースのみを検索する方法をお伝えしました。
今回はこれを一歩進めて、検索した全角スペースが含まれる段落を取得する、またその段落範囲の開始位置を取得する方法をお伝えします。
あ、今回ですが、はっきり言って地味です。ですが、マスターすればとても有用ですよ!
では、行ってみましょう!
前回のおさらい
前回作成したプロシージャはこちらです。
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を設定することで、全角と半角を区別する
今回のお題:発見した全角スペースが段落の冒頭かどうかを判定する
さて、最終的にやりたいことは、段落の冒頭が全角スペースであればインデントに変更をするという処理でしたね。
このプロシージャを実行していくと、全角スペースが順番に選択されるわけですが、以下のように段落冒頭の全角スペースのときは、インデントに変更をすればよいですよね。
ただし、以下のように段落の途中の全角スペースの場合もあります。この場合は、段落の冒頭にインデントを挿入しないようにする必要があります。
その判定は、上記の図のように
- Excecuteメソッドの結果選択されている全角スペースのStart
- その全角スペースが含まれている段落範囲のStart
を比較することで実現可能です。
…わかりますか?
全角スペースが段落の最初の文字でなければ、全角スペースの位置を表す範囲のStartと、その段落範囲のStartは異なるはずということです。
検索結果の選択範囲の開始位置を求める
では、Excecuteメソッドの結果選択されている全角スペースの位置を取得してみましょう。
選択されているのですから、その範囲はSelectionオブジェクトです。Selectionオブジェクトの開始位置はStartプロパティで取得できましたよね。
![](https://tonari-it.com/wp-content/uploads/type-text.jpg)
ですから、Excecuteメソッドで発見した全角スペースの範囲の開始位置は、そのまんま以下で取得できるということです。
Selection.Start
検索結果を含む段落範囲の開始位置を求める
続いて、検索結果の全角スペースを含む段落範囲の開始位置を求めます。
こちらはちょっと道のりが長いですよ。
まず、検索結果の選択範囲を含む段落はSelectionオブジェクトのParagraphsプロパティで集合として取得することができます。
今回の場合、Selectionは全角スペース1文字ですから、取得したParagraphsコレクションの要素はただ1つです。ですから、取得したい段落は最初の要素つまりFirstプロパティで
を使って取得できますね。
その段落の開始位置を知りたいのですが、残念ながらParagraphオブジェクトにはStartプロパティがありません。
ですので、いったんRangeプロパティで範囲を取得します。
これら一連のプロパティについては以下記事でも紹介していますので、ご参考ください。
![](https://tonari-it.com/wp-content/uploads/underline.jpg)
そして、範囲つまりRangeオブジェクトの開始位置はStartプロパティで、終了位置は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
こういった表現がシュパっと出てくるようになると、本当にいろいろなことができるようになります。
ぜひ、いろいろ試してみてください。
では、次回いよいよインデントに差し替える処理を追加していきます。
![](https://tonari-it.com/wp-content/uploads/indent.jpg)
どうぞお楽しみに!