【入門編】Word VBAで『段落の行間』をミリ単位で厳密に制御する:LineSpacingRuleの勘所 – Word VBA解析バイブル

スポンサーリンク

Word VBAの「行間」をミリ単位で支配する。レイアウト崩れを防ぐ究極の制御術

こんにちは。業務自動化の世界へようこそ。

Wordで帳票や公的文書を作成する際、最も頭を悩ませるのが「行間」ではないでしょうか?「設定したはずなのに、環境が変わるとレイアウトが崩れる」「行間が微妙にズレてページ数が増えてしまう」。これらはWord VBAを扱う誰もが通る道です。

今回は、Wordのオブジェクトモデルを深く理解し、「ミリ単位で段落の行間を固定する」ための極意を伝授します。これさえマスターすれば、Wordのレイアウト制御はあなたの掌中です。

1. なぜ「行間」は勝手に変わるのか?

Wordの初期設定では、行間は「行グリッド線」に吸着される動きをします。これが「フォントサイズを変えたら行間が勝手に広がった」という現象の正体です。

VBAでこれを制御するには、`ParagraphFormat` オブジェクトを操作する必要があります。ここで重要なのが、以下の2つのプロパティです。

  • `LineSpacingRule`: 行間の「ルール(種別)」を指定する。
  • `LineSpacing`: ルールに基づいた「数値」を指定する。

2. ミリ単位指定の「極意」:固定値設定のコード

帳票作成において最も信頼性が高いのは「固定値」指定です。Wordは内部的に「ポイント(pt)」を単位として扱いますが、我々は「ミリ(mm)」で考えたい。

ここで、「1mm ≒ 2.835pt」という変換定数を使います。この変換をコードに落とし込むのが、プロのエンジニアの流儀です。

実践:選択範囲の行間を「10mm」に固定するコード

Sub SetLineSpacingToMillimeters()
‘ 単位変換用定数(1mm = 2.835pt)
Const PT_PER_MM As Single = 2.835
Dim targetMM As Single

‘ 設定したい行間(ミリ)
targetMM = 10

‘ 現在選択している範囲(またはカーソルがある段落)に適用
With Selection.ParagraphFormat
‘ 1. まず行グリッド線を無視する(これ重要!)
.AutoAdjustRightIndent = True
.DisableLineHeightGrid = True

‘ 2. 行間ルールを「固定値」に設定
.LineSpacingRule = wdLineSpaceExactly

‘ 3. ミリをポイントに変換して代入
.LineSpacing = targetMM PT_PER_MM
End With
End Sub

3. なぜ `.DisableLineHeightGrid = True` が必須なのか?

ここが初心者と中級者の分かれ道です。

多くのエンジニアが `LineSpacingRule = wdLineSpaceExactly` だけを指定して満足しますが、それだけでは「グリッド線に合わせる」設定が生きている場合、意図した数値が無視されることがあります。

  • `DisableLineHeightGrid`: これを `True` にすることで、「Wordの段落グリッド(マス目)」への吸着を強制終了させます。
  • `wdLineSpaceExactly`: これを適用することで、文字サイズがどうであれ、指定した行間が絶対的な数値として維持されます。

この2つをセットで記述することが、環境依存のレイアウト崩れを防ぐ唯一の解です。

4. 陥りやすい罠:オブジェクトの指定範囲

VBAを書くとき、`Selection`(現在の選択範囲)を使うのはデバッグ中だけにしましょう。実務で帳票を作成する際は、以下のように `Range` や `Paragraph` オブジェクトを明示的に指定するのがベストです。

Sub RefinedParagraphControl()
Dim doc As Document
Dim para As Paragraph

Set doc = ActiveDocument

‘ 文書内の全段落を対象にする例
For Each para In doc.Paragraphs
With para.Format
.DisableLineHeightGrid = True
.LineSpacingRule = wdLineSpaceExactly
.LineSpacing = 12 2.835 ‘ 12mm固定
End With
Next para
End Sub

このコードのポイント

  • `Selection` を使わず `Document` を直接操作することで、画面の描画更新を抑え、処理速度を劇的に向上させます。
  • `For Each` ループを使うことで、文書内の全ての段落に対して一貫したレイアウトを適用できます。

最後に:自動化エンジニアとしての心構え

「行間を制御する」ということは、Wordのキャンバスをあなたの意図通りにキャンバスを操るということです。

最初は難しく感じるかもしれませんが、「Wordはグリッド(マス目)に支配されている」ということさえ理解すれば、`DisableLineHeightGrid` を解除するだけで、あなたのWord自動化の精度は一気に上がります。

ここをクリアすれば、もうWordのレイアウトに振り回されることはありません。自信を持って、次の自動化ステップへ進んでください。応援しています!

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