こんにちは!今日もWordのレイアウト崩れと格闘していませんか?
「フォントサイズを大きくしたら、なぜか行間が異常に広がってしまった…」
「1ページのなかに綺麗に収めたいのに、文字サイズを変えるたびに行数が変わってイライラする…」
Wordを使っていると、誰もが一度は直面するこの「行間暴走問題」。実はこれ、Wordが良かれと思って行間を「自動調整(1行や最小値)」にしていることが原因なのです。
この問題を根本から解決し、どんな環境でも絶対に崩れない美しいレイアウトを構築するための唯一の正解が、VBAを使って行間を「固定値(pt)」でカチッと固定すること。
「マクロの記録」から一歩踏み出し、Wordオブジェクトを自分の手でコントロールする楽しさを、私と一緒に体験してみましょう。ここをクリアすれば、Word VBAの基本はバッチリマスターできますよ!
—
1. なぜ行間が崩れるのか? Wordの「自動調整」の罠
コードを書く前に、まずはWordの「行間」の裏側で何が起きているのかを理解しておきましょう。敵を知ることは、美しいコードを書くための第一歩です。
Wordの行間設定には、主に以下の4つのルールがあります。
| 設定名 | VBAでの定数 | 挙動の特徴 |
| :— | :— | :— |
| 1行 / 倍数 | `wdLineSpaceMultiple` | フォントサイズに合わせて、Wordが自動で広げます。フォントサイズが1.1倍になると、行間はそれ以上に「ガバッ」と広がってしまう特性があります。 |
| 最小値 | `wdLineSpaceAtLeast` | 指定したpt数を「最低ライン」とし、文字が大きくなると自動的に行間を広げます。レイアウト崩れの原因になりやすい設定です。 |
| 固定値 | `wdLineSpaceExactly` | フォントサイズがどう変わろうと、指定されたpt(ポイント)幅を「絶対に」維持します。レイアウト維持の最強の味方です。 |
図解:自動調整 vs 固定値
- 自動調整(最小値・1行など):
`[ 文字 ]` $\rightarrow$ 大きくなると $\rightarrow$ `[ 大 き い 文 字 ]`(行間が勝手に広がり、ページを突き抜ける)
- 固定値(18pt固定など):
`[ 文字 ]` $\rightarrow$ 大きくなっても $\rightarrow$ `[ 大 き い 文 字 ]`(枠の高さは18ptのまま固定。1行の高さが絶対に変わらない)
実務の書類や、あらかじめフォーマットが決まった申請書などでは、「固定値」を指定して1行の高さを完全にロックすることが、レイアウト崩れを防ぐ最大の秘訣なのです。
—
2. VBAで行間を操る「2つの鍵」
Word VBAで段落の行間を制御するには、段落オブジェクト(`Paragraph`)が持つ「2つの鍵(プロパティ)」をセットで操作する必要があります。ここが初心者の方が最もつまずきやすいポイントです。
1. `LineSpacingRule`(行間ルールの決定)
まずは「固定値にしますよ」という意思表示をします。ここに `wdLineSpaceExactly` という定数を代入します。
2. `LineSpacing`(具体的な値の設定)
次に「具体的な行間の幅(pt数)」を数値で指定します。
⚠️ 超重要:設定する順番のルール
必ず、①「ルールを固定値にする」を設定してから、②「具体的な値を設定する」という順番でコードを書いてください。
この順番を逆にしたり、ルールを指定せず値だけを入れようとすると、Wordが混乱して意図しない挙動(行間が「倍数」の18倍になって画面が真っ白になるなど!)を引き起こす原因になります。
—
3. 【実践】マクロの記録から脱却する極上コード
それでは、実際に使えるVBAコードを見てみましょう。
ここでは実務で最もよく使う「選択している範囲(Selection)の行間を18ptに固定する」マクロを作成します。
コードの各行に、なぜその処理が必要なのかを詳しくコメントしました。ただコピペするだけでなく、コードが語りかけてくる意味を一緒に読み解いてみてください。
Sub SetParagraphLineSpacingExactly()
‘ — 1. 安全装置と変数の宣言 —
‘ 万が一、何も選択されていない場合やWordの準備ができていない場合のエラーを防ぎます。
On Error GoTo ErrorHandler
Dim targetRange As Range
Set targetRange = Selection.Range
‘ — 2. 処理中の画面更新を止めて高速化&チラつき防止 —
‘ これを入れるのが、プロの書くVBAへの第一歩です。
Application.ScreenUpdating = False
‘ — 3. 選択範囲の段落をループ処理 —
‘ 選択されたエリアに含まれる「すべての段落」に対して処理を繰り返します。
Dim targetParagraph As Paragraph
For Each targetParagraph In targetRange.Paragraphs
‘ 1つの段落に対して、行間の設定を適用していきます
With targetParagraph
‘ 【超重要】まず最初に行間のルールを「固定値」に設定します
.Format.LineSpacingRule = wdLineSpaceExactly
‘ 次に、具体的な行間の幅を「ポイント(pt)」で指定します
‘ ここではビジネス文書で最も美しく見えやすい「18ポイント」を設定しています
.Format.LineSpacing = 18
End With
Next targetParagraph
‘ — 4. 後処理と正常終了の通知 —
‘ 止めていた画面更新を元に戻します(これを忘れると画面が固まったように見えます)
Application.ScreenUpdating = True
MsgBox “選択範囲の行間を18pt(固定値)に整えました!”, vbInformation, “処理完了”
Exit Sub
ErrorHandler:
‘ エラーが発生した場合は、画面更新を再開してからメッセージを表示します
Application.ScreenUpdating = True
MsgBox “申し訳ありません。エラーが発生しました。” & vbCrLf & Err.Description, vbCritical, “エラー”
End Sub
このコードの「ここがプロ仕様」!
- `With targetParagraph … End With` の使用:
同じオブジェクト(ここでは段落の書式)に対して何度も命令を送る際、`With`を使うことでコードがすっきりと読みやすくなり、実行速度も向上します。
- `Application.ScreenUpdating` の制御:
行間を1ページずつ変更すると、Wordは「行間が変わったから、画面を描き直さなきゃ!」と何度も画面を再描画します。これを一時的に止めることで、処理スピードが劇的に向上し、ユーザーの目にも優しいマクロになります。
—
4. 陥りやすい罠:「文字が消えた!?」を防ぐプロのアドバイス
固定値設定を使いこなせるようになると、一度は遭遇する「最大の罠」があります。
それは、「行間を固定値にしたら、文字の上部(または全体)が欠けて見えなくなってしまった!」という現象です。
欠落の原因と対策
固定値を「18pt」に設定しているときに、その段落の中の文字サイズを「24pt」に大きくすると、どうなるでしょうか?
Wordは「何が何でも18ptの高さの中に文字を収めなさい!」という命令を忠実に守ろうとします。その結果、18ptの枠からはみ出た24ptの文字の上部が、まるで見えない天井に遮られたように削られてしまうのです。
- プロの対策:
行間を固定値にする際は、「その段落で使っている最大のフォントサイズよりも、2〜6ptほど大きい値」を固定値として設定してください。
- フォントサイズが 10.5pt なら、行間固定値は 16〜18pt がベスト。
- フォントサイズが 14pt なら、行間固定値は 20〜22pt がベスト。
この黄金比率を覚えておくだけで、「せっかくマクロを作ったのにレイアウトが壊れた!」というトラブルを100%回避できます。
—
まとめ:ここをクリアすれば、Word VBAの基本はバッチリ!
お疲れ様でした!
今回学んだ内容を振り返ってみましょう。
1. Wordのレイアウト崩れを防ぐには、行間を「固定値(`wdLineSpaceExactly`)」にする。
2. 設定する時は、「ルール(Rule)の指定」 $\rightarrow$ 「値(Spacing)の指定」の順番を守る。
3. 文字の欠けを防ぐために、フォントサイズより少し大きめのpt数を指定する。
この3つの原則は、Word VBAのオブジェクト操作における「最も基本的でありながら、最も強力な基礎」です。
マクロの記録が吐き出す冗長なコードを卒業し、オブジェクト(`Paragraph`)のプロパティを直接コントロールできるようになれば、Wordはあなたの指示通りに動く完璧なツールへと生まれ変わります。
一歩一歩、楽しみながらコードを書いていきましょう。あなたなら絶対にマスターできますよ!
