Word VBAで「ミリ単位の行間」を支配する:帳票レイアウトの崩壊を防ぐ極限の設計術
業務自動化エンジニア諸君。Wordのレイアウト調整で、画面上では綺麗に見えるのに、印刷やPDF化で「なぜか行間がズレる」「環境によってレイアウトが崩壊する」という悪夢を見たことはないか?
特に帳票作成において、行間設定をデフォルトの「1行」や「倍数」に依存するのは、「設計図を砂の上に描く」のと同じだ。
今日は、Wordの行間をミリ単位で制圧し、どんな環境下でも寸分狂わぬ帳票を出力するための、堅牢なVBA設計術を伝授する。
—
1. なぜ「行間設定」は崩れるのか?
Wordの行間設定には、デフォルトで「1行」「1.5行」などの相対指定が存在する。これらは「使用するフォントのメトリクス」と「プリンタドライバ」に依存する。 つまり、開発者のPCとユーザーのPCでフォント環境が微妙に異なれば、レイアウトは容易に崩れる。
厳格なレイアウトを求めるならば、「固定値(wdLineSpaceExactly)」以外の選択肢はあり得ない。これを使うことで、Wordの自動調整機能を殺し、我々開発者がピクセルレベルで制御権を握る必要がある。
—
2. 厳密な行間制御を実現する「核心」
行間をミリ単位で制御するには、以下の3つのステップを定石とせよ。
1. wdLineSpaceExactly (固定値) を指定する: Wordの自動計算を無効化する。
2. ポイント(pt)への変換: Wordの内部単位は「ポイント」だ。1mm = 2.835pt という換算式を忘れてはならない。
3. 段落オブジェクトの独立: `Range`または`Paragraph`オブジェクトを明示的に指定し、プロパティを「叩き込む」。
—
3. 実践:プロダクション・コード例
以下は、選択範囲または指定範囲の段落行間を、ミリ単位で厳密に制御するための設計パターンだ。保守性を考慮し、関数化した実装を提示する。
‘ /
‘ 指定したRangeの行間をミリ単位で固定する
‘ @param targetRange 対象のRangeオブジェクト
‘ @param mmValue 設定したい行間(ミリ単位)
‘ /
Public Sub SetParagraphLineSpacingExactly(ByRef targetRange As Range, ByVal mmValue As Single)
‘ 1mm = 2.835pt
‘ 固定値の計算にはポイント単位が必須
Dim ptValue As Single
ptValue = mmValue 2.835
With targetRange.ParagraphFormat
‘ 行間を「固定値」に設定
.LineSpacingRule = wdLineSpaceExactly
‘ 計算したポイント値をセット
.LineSpacing = ptValue
‘ 念のため、段落前後の余白もゼロクリアしてレイアウトの不確定要素を排除
.SpaceBefore = 0
.SpaceAfter = 0
End With
End Sub
‘ 呼び出し例
Sub ApplyStrictLayout()
Dim doc As Document
Set doc = ActiveDocument
‘ 文書内の全段落に対して、行間を「8mm」で固定する例
Call SetParagraphLineSpacingExactly(doc.Content, 8)
MsgBox “レイアウトの固定完了。環境依存の崩壊を封印しました。”
End Sub
—
4. プロダクション環境における「注意すべき罠」
このコードを実務で運用する際、以下の3点に注意せよ。
- グリッド線設定の罠:
Wordの「文字グリッド線に合わせて配置する」という設定がONになっていると、どれだけ行間を固定しても、強制的にグリッドに吸い寄せられる。厳格なレイアウトが必須の帳票では、`ParagraphFormat.AutoAdjustRightIndent` や `CharacterUnit` 関連の設定を無効化(False)にする処理を必ず先行させろ。
- データベース連携時のゴミ:
外部DBから流し込んだテキストには、改行コードや隠しプロパティが混入していることが多い。流し込み処理の直後に、必ず上記関数を通すフローを構築すること。
- パフォーマンスの重み:
`Range`オブジェクトをループ内で何度も再生成すると、Wordのメモリ管理に負荷がかかり動作が重くなる。可能な限り `Selection` ではなく `Range` オブジェクトを使い、一括でプロパティを適用する設計を心がけよ。
—
最後に:エンジニアとしての矜持
「とりあえず動く」コードを書くのは初心者だ。我々が目指すべきは、「誰がどの環境で動かしても、1ピクセルの狂いもなく帳票が生成される」という、信頼の構築である。
Word VBAはレガシーと言われがちだが、オブジェクトモデルを深く理解し、この「固定値」という概念を突き詰めれば、それは強力な帳票生成エンジンに化ける。
次回の修正依頼が来たとき、「どこでレイアウトが崩れたのか?」と悩む前に、この「厳格な固定値制御」を導入せよ。それだけで、君のコードの信頼性は一段上のステージへ昇華されるはずだ。
