みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Word VBAで段落の冒頭の全角スペースをインデントに一括変更するマクロの作り方をお伝えしています。
前回の記事はコチラです!
全角スペースを検索して、発見した全角スペースが段落の冒頭にあるかどうかを判定するプロシージャを作りました。
さて、今回はいよいよWord VBAで全角スペースをインデントに変更していく処理を追加したいと思います。
では、行ってみましょう!
前回のおさらい
前回作成した記事はこちらです。
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
ポイントは8行目ですね。
- Selection.Start:Executeメソッドの結果発見した全角スペースの開始位置
- Selection.Paragraphs.First.Range.Start:Executeメソッドの結果発見した全角スペースが含まれる段落範囲の開始位置
この二つが等しければ、Executeメソッドの全角スペースは段落の冒頭にあるということですね。
ですから、今はDebug.Printの処理となっている9行目を
- Executeメソッドの結果発見した全角スペースを削除する
- 該当の段落の先頭をインデントする
という処理に差し替えていけばOKですね。
選択範囲のテキストを削除する
では、まずExecuteメソッドの結果発見した全角スペースを削除する処理を考えていきましょう。
Executeメソッドの結果発見した全角スペースは選択されている状態、つまりSelectionオブジェクトですから、SelectionオブジェクトのテキストつまりTextプロパティを操作します。
今回は、全角スペースつまり選択範囲のテキストすべてを削除してしまいたいので、Textプロパティの値を「空」にすれば良いですね。
Selection.Text = ""
これでOKです。
インデントは段落書式
では続けて、インデントを挿入する方法について解説をしていきます。
以下記事でお伝えしている通り、インデントは「段落書式」なので段落に対して設定をする必要があります。
その証拠にWordのリボン「ホーム」を開くと、「インデントを減らす」「インデントを増やす」アイコンは「段落」のコーナーに配置されていますでしょ?
ついでに、段落の設定ものぞいてみましょう。小さいですが、右下のアイコンをクリックすると、「段落の設定ウィンドウ」が開きます。
すると「インデントと行間隔」タブの中断あたりに「インデント」関連の設定がありますね。
そして「最初の行」という箇所がありますね。VBAを用いてこの「最初の行」を「字下げ」に、その幅を「1字」にできればよさそうです。
段落のインデントを設定する方法
ポイント単位でインデントの設定するFirstLineIndentプロパティ
VBEで F2 キーを押してオブジェクトブラウザーを開き、「indent」と入力してみると、以下のように Paragraphオブジェクトのメンバーとして「FirstLineIndent」といういかにもな名前のプロパティを発見します。
これだ!
ということで、例えば以下のようにWord文書で選択している状態で
イミディエイトウィンドウに以下入力して Enter をしてみましょう。
Selection.Paragraphs.First.FirstLineIndent = 1
インデントがどうなっているかというと…
変わってないやんけー
と思いきや、よーくよーく見ると…少しだけ、ほんの少しだけインデント入っているのわかりますか?
聡明な読者の皆さんは、もうおわかりだと思うのですが、FirstLineIndentプロパティの設定単位はポイント単位なのです。
同様に、左インデントと右インデントをそれぞれポイント単位で設定するLeftIndentプロパティ、RightIndentプロパティもありますので、合わせて紹介しておきますね。
文字単位でインデントを設定するCharacterUnitFirstLineIndentプロパティ
じゃあ、文字単位にしたい場合はどうしたらよいでしょう。
1文字あたりのポイント数はフォントサイズに依存しているから、フォントのポイント数を調べる?でもフォント種類や文字によって違うようなどうだっけ…
はい、そんなことは気にしなくてOKです。実は文字単位でインデントをする別のプロパティがあります。
最初の行のインデントを文字単位で設定するCharacterUnitFirstLineIndentプロパティです。
先ほどのWord文書に対して、以下ステートメントをイミディエイトウィンドウで実行してみましょう。
Selection.Paragraphs.First.CharacterUnitFirstLineIndent = 1
すると、無事に1文字分のインデントが挿入されましたね。
同様に、左インデント、右インデントをそれぞれ文字単位で設定するプロパティも紹介しておきますね。
しかし、プロパティ名が長い…
段落冒頭の全角スペースをインデントに変更するプロシージャ
以上を踏まえて、全角スペースを検索してそれが段落の先頭であれば削除をしてインデント1文字分に差し替えるプロシージャを作りました。
Sub removeSpaces()
Dim par As Paragraph
With Selection.Find
.Text = " "
.Wrap = wdFindContinue
.MatchByte = True
Do While .Execute
Set par = Selection.Paragraphs.First
If Selection.Start = par.Range.Start Then
Selection.Text = ""
par.CharacterUnitFirstLineIndent = 1
End If
Stop
Loop
End With
End Sub
12行目で全角スペースを消す、13行目で段落の最初の行にインデントを1文字追加します。
これを実行すると、以下のようにじゃんじゃん全角スペースをインデントに変更をしていきますよ。
もちろん、Stopステートメントを削除すれば有無も言わさず一気に処理ができます。
まとめ
Word VBAで段落先頭の全角スペースをインデントに一括変更するマクロの作り方をお伝えしました。
以下2点が今回のポイントです。
- インデントの設定は段落に対して行う
- インデントの設定をするプロパティはポイント単位で設定するものと文字単位で設定するものがある
知っておいて損はないですね。
以上でシリーズの目的は達成しましたが、また便利なマクロがありましたら紹介しますね。
どうぞお楽しみに!