Word VBAを掌握する:表の「列幅」をミリ単位で制御する極限テクニック
こんにちは。現場で泥臭い自動化を積み重ねてきたエンジニアにとって、Wordの「表(Table)」ほど気まぐれで、かつ手懐けがいのあるオブジェクトはありません。
「マクロの記録」で生成されたコードを見て絶望したことはありませんか? `Selection` を多用し、画面がチラつき、結合セルがあるだけでエラーを吐くあのコード。あれはエンジニアの書くべきものではありません。
今日は、「結合セルを壊さずに、ミリ単位で列幅を制御する」という、実務で最も要望が多く、かつ最も事故が起きやすい技術の本質に迫ります。
1. なぜ「列幅」の指定は難しいのか?
Wordの表において、列幅を指定する `Column.Width` プロパティは、非常に強力ですが「空気を読まない」側面があります。
- 自動調整の影響: `AutoFitBehavior` が有効だと、こちらの指定を無視して文字数で勝手に幅が変わります。
- 結合セルの呪縛: 結合されたセルが存在する場合、単純な `Columns(i).Width` の操作は、表全体のレイアウト崩壊(いわゆる「表がページからはみ出す」現象)を招くことがあります。
これを制御するには、「固定レイアウトへの強制移行」と「ポイント換算」という2つの武器が必要です。
2. 準備:単位の換算と固定レイアウト
WordのVBAにおける単位は「ポイント(pt)」です。我々が普段使う「ミリ(mm)」とは異なります。
1mm ≒ 2.835pt です。この係数を正しく使うことが、精密なレイアウトの第一歩です。
また、表のプロパティで「自動調整」がオンになっていると、どれだけ数値を指定しても無駄です。まずはここを「固定」にするのが定石です。
3. 実践:ミリ単位で列幅を操るコード
以下のコードは、選択した表に対して、各列の幅をミリ単位で精密に指定するプロフェッショナル・メソッドです。
Sub AdjustTableColumnWidths()
' 厳密なレイアウト調整のための定数
Const MM_TO_PT As Double = 2.835
Dim tbl As Table
Dim col As Column
Dim i As Integer
' 選択範囲内に表があるかチェック
If Selection.Information(wdWithInTable) = False Then
MsgBox "表の中にカーソルを置いてください。", vbExclamation
Exit Sub
End If
Set tbl = Selection.Tables(1)
' 1. 自動調整を解除し、幅を固定する(重要!)
tbl.AutoFitBehavior wdAutoFitFixed
' 2. 各列の幅をミリ単位で指定(例:全列を30mmにする場合)
' ※複雑な結合がある場合、Columnsオブジェクトへのアクセスには注意が必要
For i = 1 To tbl.Columns.Count
' ここでミリを指定(30mm * 2.835 = 85.05pt)
tbl.Columns(i).Width = 30 * MM_TO_PT
Next i
MsgBox "レイアウト調整が完了しました。", vbInformation
End Sub
このコードの「賢いポイント」
- `wdAutoFitFixed` の適用: これを忘れると、文字を入力した瞬間に幅がズレます。まずは「手綱を握る」のが先決です。
- 定数化: `MM_TO_PT` を定数として定義することで、コードの可読性とメンテナンス性を劇的に向上させています。
- エラーハンドリングの思考: `Selection.Information` を使って「今、本当に表の中にいるか?」を確認する。これができるだけで、マクロの安定感は段違いになります。
4. 陥りやすい罠と対策
罠:結合セルがある場合の「インデックスエラー」
表の中に結合セルがあると、`Columns(i)` のインデックスが予期せぬ挙動をすることがあります。特に「行によって列数が違う」複雑な表の場合、`Columns` オブジェクトをループさせるよりも、`Cell` オブジェクトの幅を操作するほうが安全なケースが多いです。
もし上記コードでエラーが出る場合は、以下のように「セル単位」でアプローチしてみてください。
' セル単位で幅を指定するアプローチ(列全体に影響を与える)
tbl.Rows(1).Cells(1).Width = 30 * MM_TO_PT
5. 最後に:エンジニアとしての心構え
「マクロの記録」は、あくまで「VBAという言語の辞書」に過ぎません。そこから、いかに「オブジェクトの状態(State)」を管理し、予測可能な挙動を実装するか。それがエンジニアの腕の見せ所です。
今日学んだ `AutoFitBehavior` と `pt変換`。この2つを押さえておけば、Wordの表はあなたの意のままです。
まずは目の前の表で、`30 * 2.835` を試してみてください。その時、Wordが「カタッ」と精密に音を立てて整列する感覚を味わえるはずです。それが、自動化の醍醐味ですよ。
何か詰まったら、いつでも聞いてくださいね。応援しています。
