【入門編】【中級者向け】表の特定の列を非表示(幅0)にするVBA実装 – Word VBA解析バイブル

スポンサーリンク

こんにちは! Word VBAの自動化の世界へようこそ。
マクロの記録ボタンを押すだけのステージから抜け出し、「自分の手でドキュメントを意のままに操りたい」と願うあなたへ、今日はとても実用的で、かつプログラミングの美しさが感じられるテーマをお届けします。

テーマは「Wordの表(Table)における特定列の動的な非表示(幅ゼロ)制御」です。

「機密情報が含まれる列だけ、印刷時や特定のユーザー向けにサッと消したい」
「毎回手動で列幅をドラッグして縮めるのは、もううんざりだ」

そんな現場の悩みを一発で解決するテクニックを、世界最高峰の自動化を知る先輩エンジニアが、優しく、そして本質的なところまで徹底的に解説します。ここをクリアすれば、あなたのWord VBAスキルは間違いなく中級者の領域に到達しますよ。ついてきてくださいね!

—

なぜ「行や列の削除」ではなく「幅の制御」なのか?

Wordの表から不要なデータを消すとき、反射的に「列そのものを削除(`Columns.Delete`)したくなる」かもしれません。

しかし、ちょっと待ってください。
一度削除してしまうと、「やっぱり元のデータに戻したい」「別の出力ではその列が必要だった」という時に大変な手間になります。

そこで私たちが使うのが、「列の幅を極限まで縮めて(実質0にして)視覚的に隠す」というアプローチです。
これなら、データの構造を破壊することなく、何度でも「表示・非表示」を自在に切り替えることができます。まさに、ドキュメントの「リバーシブル運用」ですね。

—

現場で即戦力になる!列非表示・表示切替マクロ

それでは早速、実際のコードを見てみましょう。
今回は、表の「第2列目(機密情報が入っていると仮定)」をターゲットにして、ボタン一つで「非表示」と「表示」が切り替えるプロシージャを書きます。

Sub ToggleTargetColumn()
Dim targetTable As Table
Dim targetColIndex As Integer
Dim i As Long

‘ 【設定】操作対象の列番号(例として2列目を指定)
targetColIndex = 2

‘ 1. カーソルが表の中にあるかチェックする(安全装置)
If Selection.Information(wdWithInTable) = False Then
MsgBox “表の中にカーソルを置いて実行してください。”, vbExclamation, “操作エラー”
Exit Sub
End If

‘ 2. アクティブなカーソルが存在する表を取得
Set targetTable = Selection.Tables(1)

‘ 3. 指定した列が存在するかチェック
If targetTable.Columns.Count < targetColIndex Then MsgBox "指定された列番号は、この表の列数を超えています。", vbCritical, "エラー" Exit Sub End If ' 4. 現在の幅を判定して、非表示(幅0)か復元かをトグル切り替え ' ※ここでは便宜上、2列目の幅が1mm以下(ほぼ0)かどうかで判定します If targetTable.Columns(targetColIndex).Width > 28.35 Then ‘ 28.35pt = 1cm
‘ —【非表示化の処理】—
‘ Word VBAでは、各セルの幅を個別に詰めるのが最も確実です
For i = 1 To targetTable.Rows.Count
‘ セル単位で幅を極小(0.1ptなど)にする
targetTable.Cell(i, targetColIndex).Width = 0.1
Next i
MsgBox targetColIndex & “列目を非表示にしました。”, vbInformation, “完了”
Else
‘ —【表示(復元)化の処理】—
‘ 自動調整機能を使って元の幅に戻します
targetTable.Columns(targetColIndex).AutoFit
MsgBox targetColIndex & “列目を再表示しました。”, vbInformation, “完了”
End If

‘ 5. オブジェクトの解放(メモリ管理の基本)
Set targetTable = Nothing

End Sub

—

コードの核心を読み解く:3つの重要ポイント

このコードには、実務で必ず直面する「Word VBA特有の罠」を回避するための知恵が詰まっています。一つずつ紐解いていきましょう。

1. 安全装置(`wdWithInTable`)

初心者がやりがちなのが、表以外の場所で実行して「エラー4108: メソッドまたはプロパティは、選択範囲が表内にないため利用できません」という赤いダイアログを出すことです。
`Selection.Information(wdWithInTable)` を先頭に置くことで、ユーザーがうっかり表の外でマクロを実行しても、優しく注意を促すことができます。こういう気配りが「できるエンジニア」の証です。

2. なぜ `Columns.Width` ではなく `Cell(…).Width` なのか?(ここが最重要!)

Wordの表は、Excelのグリッドとは異なり、行ごとにセルの結合や微妙なズレが生じやすい構造をしています。
そのため、`targetTable.Columns(2).Width = 0` と一括で指定しようとしても、Wordのエンジンがそれを無視したり、予期せぬレイアウト崩れを起こしたりすることが多々あります。

そこで、「行のループを回して、1つひとつのセルの幅(`Cell(i, col).Width`)を強制的にゼロ(実質0.1ptなど)にする」という職人技的アプローチをとります。これが、Word VBAで表を完全にコントロールするための極意です。

3. 復元には `AutoFit` を活用

隠したものを元に戻すときは、各セルの幅を個別に再計算させるよりも、`Columns(targetColIndex).AutoFit` を呼び出すのが最もスマートです。Wordがよしなに適切な幅に再調整してくれます。

—

陥りやすい罠とエラー対策

最後に、このコードを運用する上で現場でよくあるトラブルと、その対策を共有しておきます。

  • 「幅を 0 にしたら、Wordが固まったように崩れた!」
  • 対策: 完全な `0`(ゼロ)を指定すると、Wordのレイアウトエンジンがパニックを起こすことがあります。そのため、コード内では `0.1`(pt単位)という「目に見えない極小の幅」を指定するのが、実務上のベストプラクティスです。
  • 「結合セル(セル結合)がある表でエラーになる」
  • 対策: 表の中に縦方向・横方向の複雑なセル結合が含まれている場合、単純なループでは「存在しないセルインデックス」を指定してしまいエラーになります。もし結合セルが多用される帳票であれば、エラー対策として `On Error Resume Next` を適切に挟むか、事前に結合セルが含まれていない構造に整えておく配慮が必要です。

—

おわりに

お疲れ様でした!
「列を隠す」という一見シンプルな操作の裏に、Wordのオブジェクト構造を理解し、レイアウト崩れを防ぐためのエンジニアリングがいかに詰まっているか、感じていただけたでしょうか。

ここをクリアすれば、定型帳票の生成、機密情報のマスク印刷、多言語対応ドキュメントの切り替えなど、あなたのWord自動化の引き出しは圧倒的に広がります。

ぜひご自身の開発環境にこのコードを貼り付けて、動かしてみてくださいね。
それでは、次回の高度なVBA解説でお会いしましょう!あなたのプログラミングライフが素晴らしいものになりますように。

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