こんにちは!Wordの文書整形、手動でやるとイライラしませんか?
「箇条書きの2行目以降をきれいに揃えたいのに、ルーラーを動かしたら全部がズレてしまった…!」
そんな経験、誰しも一度はあるはずです。
マクロの記録を使えばコードは取れますが、生成されるコードはゴミだらけで、実務では使い物になりませんよね。
今回は、Word VBAにおける「段落のインデント(左インデントとぶら下げインデント)」の制御について、プロのアーキテクトの視点を交えつつ、初学者の方にも分かりやすく徹底解説します。ここをクリアすれば、Word文書の自動整形はあなたの手のものです。さあ、一緒にマスターしていきましょう!
—
1. なぜWordのインデント設定は手動だと辛いのか?
Wordのインデントには、大きく分けて以下の3つの概念があります。
1. 左インデント(LeftIndent): 段落全体の左側の余白。
2. 右インデント(RightIndent): 段落全体の右側の余白。
3. 1行目インデント(FirstLineIndent): 段落の「1行目だけ」の位置。プラスなら字下げ、マイナスなら「ぶら下げ」になります。
特に厄介なのが「ぶら下げインデント」です。Q&A形式の文書や、番号付きリストなどで、1行目は左に飛び出していて、2行目以降が内側に引っ込んでいるレイアウトですね。
これをマウスやルーラーで正確にミリ単位合わせようとすると、意図しないところが動いて発狂しそうになります。しかし、VBAなら数値を指定するだけで、一瞬かつ完璧に制御できます。
—
2. VBAにおける「ミリ単位」の罠と解決策
ここで重要なお話をしなければなりません。
Word VBAの内部単位は「ポイント(pt)」です。 「ミリ(mm)」ではありません。
「えっ、じゃあミリで指定できないの?」ご安心ください。1インチ=72ポイントであり、1インチ=25.4ミリです。つまり、「ミリ数 × (72 / 25.4)」という計算を挟むことで、完璧にミリ単位で指定できます。
実務では、この計算を毎回書くのは面倒なので、「ミリをポイントに変換する小さな関数」を作っておくのが、プロのスマートなやり方です。
—
3. 実践!インデントを完璧に制御するVBAコード
それでは、実際に動かせるコードを見てみましょう。
以下のコードは、カーソルがある段落、または選択している段落に対して、「左インデント」と「ぶら下げインデント」をミリ単位で正確に適用するサンプルです。
Sub SetHangingIndentSample()
‘ ==========================================
‘ 段落のインデントをミリ単位で正確に設定するマクロ
‘ ==========================================
Dim targetPara As Paragraph
Dim leftMarginMm As Single
Dim hangingMm As Single
‘ 1. 設定したい値を「ミリ(mm)」で直感的に指定する
leftMarginMm = 10# ‘ 全体の左インデント:10mm
hangingMm = 5# ‘ ぶら下げ幅:5mm(1行目に対して2行目以降が右に5mm入る)
‘ 2. 選択している範囲、またはカーソルがある段落を対象にする
If Selection.Paragraphs.Count = 0 Then
MsgBox “対象となる段落が見つかりません。”, vbExclamation
Exit Sub
End If
‘ 複数段落が選択されていても、すべて一括処理するループ
For Each targetPara In Selection.Paragraphs
With targetPara
‘ 【重要】ミリをWordの内部単位(ポイント)に変換して代入する
‘ 変換式: ミリ数 窓 2.8346 (72pt / 25.4mm)
‘ ① まず左インデント全体を設定
.LeftIndent = MillimetersToPoints(leftMarginMm + hangingMm)
‘ ② 1行目だけを左に戻すことで「ぶら下げインデント」を作る
‘ ぶら下げにするには、FirstLineIndentにマイナスの値を指定します
.FirstLineIndent = MillimetersToPoints(-hangingMm)
With End
Next targetPara
MsgBox “インデントの設定が完了しました!”, vbInformation
End Sub
> 💡 先輩エンジニアからのワンポイントアドバイス
> 実はWord VBAには標準で `MillimetersToPoints` という便利な関数が用意されています。これを使えば、わざわざ自分で計算式を書かなくても、ミリをポイントに一発変換してくれます。さすがWordの標準機能、忘れないように使っていきましょう!
—
4. コードの仕組みと、陥りやすいエラー
先ほどのコードの肝は、以下の2行です。
.LeftIndent = MillimetersToPoints(leftMarginMm + hangingMm)
.FirstLineIndent = MillimetersToPoints(-hangingMm)
Wordの「ぶら下げインデント」の構造は、少し特殊です。
- `LeftIndent` は、段落全体の左端の位置(2行目以降の位置)を決定します。
- `FirstLineIndent` は、全体の左端(LeftIndentの位置)から見た、1行目の相対位置を指定します。
そのため、ぶら下げを作りたいときは、
1. `LeftIndent` に「基本の左余白 + ぶら下げたい幅」を足した位置を設定する。
2. `FirstLineIndent` に「マイナスのぶら下げ幅」を指定して、1行目だけを左に戻す。
という手順を踏む必要があります。ここを理解していないと、「あれ?なぜか全体が右にいっちゃった…」というパニックに陥ります。これが、手動でもVBAでもインデント設定が難しく感じる最大の理由です。ここさえ押さえればもう怖くありません!
よくあるエラーと対策
- エラー 424「オブジェクトが必要です」
`Selection.Paragraphs` を使わずに、存在しないオブジェクトを操作しようとしたときに出ます。必ずドキュメントが開かれ、テキストが選択(またはカーソルがある)状態で実行してください。
- 表(テーブル)の中の段落で挙動がおかしくなる
Wordの表セル内の段落は、セル自体のマージン(余白)の影響を受けるため、通常の段落インデントと計算がズレることがあります。表の中を操作する場合は、セル単位のパディング設定も考慮に入れる必要があります(これについては、また別の機会に深く解説しましょう)。
—
まとめ
今回は、Word VBAにおける「左インデント」と「ぶら下げインデント」の正確な制御方法について解説しました。
- Wordの内部単位は「ポイント」だが、`MillimetersToPoints` 関数を使えばミリ単位で直感的に指定できる。
- ぶら下げインデントは、`LeftIndent`(全体)と `FirstLineIndent`(1行目の相対位置、通常はマイナス)の組み合わせで実現する。
この2つさえ分かっていれば、どんなに複雑なフォーマットの文書であっても、一瞬で美しく自動整形できるようになります。マクロの記録から一歩抜け出して、自分でロジックを組み立てる楽しさを味わっていただけたなら幸いです。
ここをクリアすれば、Word VBAの基本はバッチリですよ!
明日の業務から、ぜひあなたのコードフォルダにこのスニペットを取り入れてみてください。それでは、また次回の極限知見でお会いしましょう!
