【実務・中級編】【初心者向け】段落の「左インデント」と「ぶら下げインデント」をVBAで正確に制御する – Word VBA解析バイブル

スポンサーリンク

Word VBAを掌握する極限の知見:ミリ単位で段落インデントを完全制御する技術

開発現場で避けて通れないドキュメントの自動生成。提案書、仕様書、契約書――。どんなにテキストの内容が完璧であっても、インデント(左インデントとぶら下げインデント)のズレ一つで、生成された文書は一瞬で「素人の仕事」に見えてしまう。

手動での調整に何時間も費やしたり、場当たり的なスペースやタブでレイアウトを誤魔化したりする非効率なアプローチは、今日で終わりにしよう。

Word VBAにおける「段落の幾何学」を完全に掌握し、ミリ単位で正確無比なレイアウトを全自動で構築するプロフェッショナルな設計手法を伝授する。

1. なぜインデント制御でバグるのか?(Word VBAの構造的罠)

初心者が陥る最大の罠は、WordのUI(画面)の感覚そのままにVBAを書こうとすることにある。

Wordのルーラーを見れば、「左インデント」「ぶら下げインデント」「1行目のインデント」が視覚的に並んでいる。しかし、VBAの `ParagraphFormat` オブジェクトにおけるプロパティの挙動は、開発者が意図する直感的な動きとは異なる側面を持っている。

特に以下の3点を見落とすと、文書ごとにレイアウトが崩れる「爆弾」をコードに埋め込むことになる。

1. ポイント(Point)とミリ(Millimeters)の混同: Wordの内部単位は「ポイント(1pt = 1/72インチ)」である。`LeftIndent = 10` と書いた場合、それは10ミリではなく10ポイント(約3.5mm)を指す。実務では必ずミリ単位で指定し、それを内部で変換するロジックが不可欠である。
2. スタイルの継承と直接書式の競合: 段落に直接インデントを設定しても、適用されている「スタイル」の定義や、その後の段落区切りによって上書きされる。堅牢なシステムを構築するには、段落の直接書式(ParagraphFormat)を明示的に叩くか、カスタムスタイルをプログラム側で完全に制御するアプローチが必要だ。
3. ぶら下げインデントの計算ミス: 「左インデントを全体で10mm下げ、1行目だけは元の位置に戻す(=2行目以降が10mm凹む:ぶら下げインデント)」という処理を書く際、プロパティの引き算を誤ると文字が重なるなどの表示崩れを起こす。

2. 実務を救う!ミリ単位でインデントを精密制御するプロダクションコード

ここに示すのは、実務の現場でそのまま稼働できる堅牢なプロシージャだ。
指定した段落に対し、「左側全体のインデント」「ぶら下げ幅」をミリ単位で正確に適用する。さらに、外部データ(Excelやデータベース)からの連携を想定し、引数で動的に値を変更できるように設計している。

Option Explicit

‘ ==============================================================================
‘ 処理名 : SetParagraphIndentsMM
‘ 概要 : 指定した段落の左インデントとぶら下げインデントをミリ単位で正確に設定する
‘ 引数 : targetPara – 対象のParagraphオブジェクト
‘ leftIndentMM – 左インデント全体の値(ミリ)
‘ hangingMM – ぶら下げ幅(ミリ)※1行目に対する2行目以降の凹み量
‘ ==============================================================================
Public Sub SetParagraphIndentsMM(ByRef targetPara As Paragraph, ByVal leftIndentMM As Single, ByVal hangingMM As Single)

‘ エラーハンドリングの標準装備(オブジェクトの不在や保護された文書対策)
On Error GoTo ErrorHandler

If targetPara Is Nothing Then
Err.Raise 9999, “SetParagraphIndentsMM”, “対象の段落が取得できません(Nothing)。”
End If

With targetPara.Format
‘ 【重要】Word VBAの内部単位(ポイント)へミリを変換する
‘ 1ミリ ≒ 2.834645ポイント (1インチ = 25.4mm = 72pt より算出)
Const MM_TO_POINTS As Single = 2.834645

‘ 1. まず全体の左インデントを設定
.LeftIndent = leftIndentMM MM_TO_POINTS

‘ 2. ぶら下げインデントを設定
‘ Word VBAでは、FirstLineIndentに「負の値」を指定することで、
‘ LeftIndentの位置から左側に1行目を引き戻す(=ぶら下げインデントを作る)仕様になっている。
.FirstLineIndent = -(hangingMM MM_TO_POINTS)

End With

Exit Sub

ErrorHandler:
‘ ログ出力や上位へのエラー伝播をここに実装する
Debug.Print “インデント設定エラー: ” & Err.Description
Err.Raise Err.Number, “SetParagraphIndentsMM”, Err.Description
End Sub

3. 応用:文書全体(または特定の見出し以降)をバッチ処理する設計

単一の段落を制御できるようになったら、次は実務で頻出する「箇条書きリストや注釈ブロックの一括整形」に応用する。

データベースやExcelから読み込んだレコードの数だけ段落を動的に生成し、それぞれに適切なインデントを流し込むアーキテクチャの例を見てみよう。

‘ ==============================================================================
‘ 処理名 : FormatSpecificationDocument
‘ 概要 : アクティブ文書内の特定のキーワードを持つ段落を検出し、
‘ 自動的にぶら下げインデントを適用するバッチ処理
‘ ==============================================================================
Public Sub FormatSpecificationDocument()
Dim doc As Document
Set doc = ActiveDocument

Dim para As Paragraph
Dim targetFound As Boolean
targetFound = False

‘ 文書内の全段落を走査(パフォーマンス劣化を防ぐため、必要な範囲に限定するのがベスト)
Dim i As Long
For i = 1 To doc.Paragraphs.Count
Set para = doc.Paragraphs(i)

‘ 例として、”[NOTE]” から始まる段落に対して特殊なインデントを適用する
If Left$(Trim$(para.Range.Text), 6) = “[NOTE]” Then

‘ メソッドを呼び出し、左インデント15mm、ぶら下げ5mmの美しいレイアウトを構築
SetParagraphIndentsMM para, 15#, 5#

‘ 書式の視覚的調整(フォントカラーの変更や太字化など)
para.Range.Font.Color = wdColorDarkTeal

End If
Next i

MsgBox “文書のインデント自動整形が完了しました。”, vbInformation, “処理成功”
End Sub

4. チーフアーキテクトからの実践的アドバイス:保守性を高めるために

プロの現場では、「動くコード」を書くだけでは失格だ。「将来の仕様変更に耐え、誰もがメンテナンスできるコード」でなければならない。

  • マジックナンバーの排除: コード内に直接 `15#` や `5#` といった数値をハードコーディングしてはならない。これらは `Const`(定数)としてモジュールの先頭で定義するか、外部のコンフィグファイル(JSONやINI、あるいはExcelのパラメータシート)から読み込む設計に昇華させるべきだ。
  • 画面描画の抑制(パフォーマンスの極限化): 大量の段落に対してインデント操作をループで行う場合、Wordは描画処理のたびに画面を更新しようとして動作が著しく重くなる。処理の開始前に `Application.ScreenUpdating = False` をかけ、終了後に `True` に戻すお約束の作法を忘れてはならない。

ミリ単位の美しさをコードで担保し、手作業という不確実な要素をシステムから完全に排除すること。それこそが、業務自動化エンジニアに求められる真のプロフェッショナリズムである。

タイトルとURLをコピーしました