【入門編】【中級者向け】表のセル結合状態を維持したまま、特定の列の幅を一括変更する制御 – Word VBA解析バイブル

スポンサーリンク

Word VBAの深淵へ:複雑な表のレイアウトを「壊さずに」列幅を制御する極意

こんにちは。現場で泥臭い自動化を積み重ねてきたエンジニアとして、今日はWord VBAの中でも特に難易度が高い「表(Table)の列幅調整」という魔境に足を踏み入れましょう。

「マクロの記録」で生成されたコードをそのまま使って、レイアウトが崩れて絶望した経験はありませんか?実は、Wordの表は単なるグリッドではなく、セル結合という「時空の歪み」を抱えた複雑なオブジェクトなのです。

今日は、結合セルに恐れをなさず、正確に特定列の幅を操るための「プロの作法」を伝授します。

—

なぜ、単純な列幅変更では失敗するのか?

Wordの`Table.Columns(i).Width`プロパティを叩けば済む話だと思っていませんか?
もしその表が「結合セル」を含んでいる場合、そのコードは例外エラー(実行時エラー 5991)を吐き出すか、意図しない列まで巻き込んでレイアウトを破壊します。

Wordの表構造において、結合されたセルは「1つのセル」として扱われますが、列の定義上は「複数の列にまたがっている」状態です。この「見た目」と「データ構造」の乖離を理解することが、自動化の第一歩です。

—

実践コード:結合セルをケアした列幅変更の設計図

今回は、「指定した列の幅を調整しつつ、表全体のレイアウトを崩さない」ための堅牢なコードを紹介します。ポイントは「全セルをループして個別に判定する」のではなく、「列プロパティを直接操作する」前に、表の整合性を担保することです。

Sub AdjustSpecificColumnWidth()
Dim tbl As Table
Dim targetColIndex As Integer
Dim newWidth As Single

‘ 単位:ポイント(1cm = 28.35pt)
targetColIndex = 2 ‘ 2列目を変更したい場合
newWidth = CentimetersToPoints(5) ‘ 5cmに変更

‘ アクティブな表を取得
If Selection.Information(wdWithInTable) Then
Set tbl = Selection.Tables(1)
Else
MsgBox “表の中にカーソルを置いてください。”
Exit Sub
End If

‘ 【極意】エラーを防ぐため、表全体に対する操作を最小限にする
‘ 結合セルがあっても、Columnsオブジェクトにはアクセス可能ですが、
‘ 「特定の列」を指定する際は、その列が存在するか確認が必須です
On Error Resume Next
With tbl.Columns(targetColIndex)
.Width = newWidth
‘ 変更が反映されない場合は、表全体の自動調整を一時的に解除
tbl.AutoFitBehavior (wdAutoFitFixed)
End With
On Error GoTo 0

MsgBox “列幅の調整が完了しました。”
End Sub

コードの解説:ここが「プロ」のこだわり

1. `Selection.Information(wdWithInTable)`:
いきなり処理を走らせず、今ユーザーが表の中にいるかを判定します。これだけで「予期せぬエラー」を8割減らせます。
2. `CentimetersToPoints`:
Word VBAは内部単位が「ポイント」です。センチメートルで指定する変換関数を噛ませることで、メンテナンス性を劇的に向上させます。
3. `wdAutoFitFixed`:
ここが一番重要です。Wordの表はデフォルトで「ウィンドウ幅に自動調整」が効いていることが多く、列幅を固定値で指定しても勝手にリサイズされます。「固定幅にするなら、まず自動調整をオフにする」。これが鉄則です。

—

陥りやすい罠と回避策

1. 「列インデックス」の矛盾

表の途中でセルが結合されている場合、`tbl.Columns(2)`と言った時に、それが「視覚的な2列目」を指しているのか「データ上の2列目」を指しているのか、Wordは非常に曖昧な挙動をします。
回避策: 複雑すぎる表の場合は、`Columns`でアクセスするのではなく、`Cell(row, col).Width`で各セルを個別にループして計算するアプローチに切り替えてください。

2. ページ端の制約

設定しようとした幅がページの余白をはみ出すと、Wordは強制的にレイアウトを再計算します。
回避策: `tbl.PreferredWidthType = wdPreferredWidthPoints` と設定し、表自体の幅を明示的に指定してから列幅を調整すると、予期せぬ崩れを防げます。

—

最後に:自動化は「敬意」から始まる

Wordの表を操作する際、マクロは「文書の構造」を深く理解する必要があります。表を単なる数字の箱と思わず、「行と列が織りなす複雑なパズル」だと思って接してみてください。

今回紹介したコードは、あくまで「基本の型」です。ここから条件分岐(IF文)を加えれば、特定のキーワードが含まれる行だけ列幅を変える、といった高度な制御も可能になります。

「ここをクリアすれば、Word VBAの基本はバッチリ」です。ぜひ、ご自身の業務で試してみてください。分からないことがあれば、いつでもまた聞きに来てくださいね。一緒に最強の自動化ツールを作り上げましょう!

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