Word VBAの「表」を支配せよ:全セル書式一括制御の極意
業務自動化の世界で、多くのエンジニアが「表(Table)」の操作で躓く。
マクロ記録を信じて `Selection` オブジェクトを多用し、画面をチカチカさせながら遅い処理を繰り返す――それは、Word VBAを理解していない証拠だ。
WordのDOM(Document Object Model)において、`Table`オブジェクトは非常に重い。なぜなら、表は「行」「列」「セル」という階層構造を持ち、さらにその中に「段落(Paragraph)」や「フォント(Font)」といった複雑なプロパティがネストされているからだ。
今日は、ドキュメント内の全表に対して、一瞬で、かつバグを生まない堅牢な書式適用ツールを構築する手法を伝授する。
—
1. なぜ「Selection」を使ってはいけないのか
初心者が陥る最大の罠は、`Selection.Next` や `Selection.MoveRight` を繰り返してカーソルを移動させることだ。
`Selection` はUIと同期するため、描画負荷が膨大にかかる。また、ユーザーが操作中に触れれば処理は即座にクラッシュする。
プロの鉄則:Rangeオブジェクトを直接叩け。
`Range` を使えば、画面の描画をスキップしてメモリ上で直接データ構造を書き換えられる。これこそが、高速かつ安定したマクロの第一歩だ。
—
2. 堅牢な設計:全セル一括制御の実装
以下のコードは、ドキュメント内のすべての表を走査し、フォントと段落設定を強制的に統一する。
‘ ——————————————————————
‘ @description ドキュメント内の全表の書式を一括で統一するツール
‘ @author Chief Architect
‘ ——————————————————————
Sub ApplyFormatToAllTables()
Dim tbl As Table
Dim cell As Cell
‘ 画面更新を停止(高速化の必須儀式)
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
‘ 全表をループ
For Each tbl In ActiveDocument.Tables
‘ 表全体の書式設定
With tbl.Range
.Font.Name = “游ゴシック”
.Font.Size = 10
.ParagraphFormat.Alignment = wdAlignParagraphLeft
.ParagraphFormat.LineSpacingRule = wdLineSpaceSingle
End With
Next tbl
MsgBox “全表の書式統一が完了しました。”, vbInformation
CleanExit:
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Resume CleanExit
End Sub
このコードが「プロダクション品質」である理由
1. ScreenUpdatingの制御: 画面更新を止めることで、処理速度は数十倍に跳ね上がる。
2. Rangeプロパティの活用: `tbl.Range` を対象にすることで、セル単位のループを回さずとも表全体に一括でスタイルを適用している。これが最も効率的だ。
3. エラーハンドリング: 万が一表が壊れていたり、保護されていたりしても、マクロが途中で止まらずに制御を戻す設計にしている。
—
3. 現場で生き残るための「注意点」
実務でこのツールを運用する際、以下の3点は必ず押さえておいてほしい。
- 「隠し表」の罠: Wordには、ページレイアウトを調整するために意図せず挿入された「透明な表」が存在することがある。このマクロを実行するとそれらも全て書き換わる。対象を絞る場合は `tbl.Range.Text` で条件分岐を設けるなどのガードが必要だ。
- データベース連携: Excelからデータを流し込む際は、必ず「セルに値をセットした後に書式を整える」という順序を徹底すること。先に書式を設定しても、データを流し込んだ際に元ファイルの設定(スタイル)が上書きされるケースが多いためだ。
- 保守性: フォント名やサイズは定数化するか、設定用のシート(Excelなど)を読み込む設計にすべきだ。コードの中に直接値を書き込むのは、変更依頼が来た瞬間に技術負債となる。
—
最後に:なぜエンジニアは「型」を学ぶのか
Word VBAは「古い」と言われることがある。しかし、企業の実務でWordの表から逃げ出すことはできない。
今回紹介した「Rangeオブジェクトを直接操作する」というアプローチは、Wordに限らず、ExcelのRange操作や、他のAPI制御においても共通する「アーキテクトの思考」だ。
「とりあえず動く」コードを書くのは学生の遊びだ。
「壊れにくく、速く、誰が読んでも意図が伝わる」コードを書くこと。それこそが、我々が目指すべきエンジニアの姿である。
さあ、あなたのドキュメントを、美しいコードで支配せよ。
