こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだかよく分からないけれど動いた!」と喜んでいた時期を抜け出し、いよいよ自分の手で自由自在に文書を操りたい――そんな素晴らしい一歩を踏み出したあなたへ。
今回は、実務でめちゃくちゃ使う「表(Table)の動的生成とセル結合」をテーマに、見栄えの良い帳票を瞬時に自動生成するテクニックを伝授します。
ここをクリアすれば、Word VBAの構造と「オブジェクトを操る感覚」が一気に掴めます。慌てず、一つひとつ紐解いていきましょう。
—
1. なぜ「表の動的生成」と「セル結合」なのか?
実務で作成する請求書、報告書、仕様書などの帳票類。これらを毎回手作業でレイアウトしていませんか?
行数を数えて、セルを選んで右クリックして「セルの結合」を押して……。そんな単調作業は、VBAに一瞬で片付けさせましょう。
Word VBAで表を扱うときの基本方針はただ一つ。
「VBAに表を作らせ、データを流し込み、必要な場所をコードで結合する」これだけです。
「マクロの記録」だと、マウスの選択座標に依存した冗長なコードが記録されてしまい、行数が変わると途端にエラーを起こします。しかし、今回マスターする「オブジェクトの参照」を意識した書き方であれば、データ量に応じて何行になろうとも、完璧なレイアウトの帳票を自動で組み上げることができます。
—
2. 現場で即戦力になる!帳票自動生成マクロの全容
百聞は一見に如かず。まずは、今回のゴールとなる完成形のコードをドーンとお見せします。
WordのVBAエディタ(`Alt + F11`)を開き、標準モジュールにペーストして実行してみてください。たった一瞬で、綺麗にレイアウトされた「業務報告書」が目の前に現れます。
Sub CreateReportTable()
Dim doc As Document
Dim tbl As Table
Dim rowCount As Long
Dim colCount As Long
‘ 1. 新規ドキュメントを作成
Set doc = Documents.Add
‘ 2. 表の行数と列数を定義(例:5行×3列)
rowCount = 5
colCount = 3
‘ 3. カーソルの位置に表を挿入
Set tbl = doc.Tables.Add(Range:=Selection.Range, NumRows:=rowCount, NumColumns:=colCount)
‘ 4. 表のデザイン(スタイル)を適用
tbl.Style = “テーブル (格子)”
tbl.Borders.Enable = True
‘ 5. 【重要】見出し行の作成とセル結合
‘ 1行目の1列目から3列目までを結合する
tbl.Cell(1, 1).Merge MergeTo:=tbl.Cell(1, colCount)
‘ 6. 結合したセルにタイトルを流し込む
With tbl.Cell(1, 1).Range
.Text = “【 2023年度 業務進捗報告書 】”
.Font.Name = “MS ゴシック”
.Font.Size = 14
.Font.Bold = True
.ParagraphFormat.Alignment = wdAlignParagraphCenter
End With
‘ 7. 見出し行(2行目)の項目名を入力
tbl.Cell(2, 1).Range.Text = “項目”
tbl.Cell(2, 2).Range.Text = “担当者”
tbl.Cell(2, 3).Range.Text = “ステータス”
‘ 見出し行の背景色を薄いグレーにする(視認性の向上)
tbl.Rows(2).Shading.BackgroundPatternColor = wdColorLightGray
tbl.Rows(2).Range.Font.Bold = True
tbl.Rows(2).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
‘ 8. データ行(3〜5行目)に値を流し込む
‘ 3行目
tbl.Cell(3, 1).Range.Text = “要件定義”
tbl.Cell(3, 2).Range.Text = “山田 太郎”
tbl.Cell(3, 3).Range.Text = “完了”
‘ 4行目
tbl.Cell(4, 1).Range.Text = “基本設計”
tbl.Cell(4, 2).Range.Text = “佐藤 次郎”
tbl.Cell(4, 3).Range.Text = “進行中”
‘ 5行目
tbl.Cell(5, 1).Range.Text = “実装・テスト”
tbl.Cell(5, 2).Range.Text = “鈴木 花子”
tbl.Cell(5, 3).Range.Text = “未着手”
‘ 9. 列幅を綺麗に調整する
tbl.Columns(1).Width = InchesToPoints(2.5) ‘ 約6.35cm
tbl.Columns(2).Width = InchesToPoints(1.5) ‘ 約3.81cm
tbl.Columns(3).Width = InchesToPoints(1.5) ‘ 約3.81cm
MsgBox “帳票の自動生成が完了しました!”, vbInformation, “成功”
End Sub
—
3. コードの核心を解剖する(ここが分かれば怖くない!)
一見すると難しそうに見えるコードも、プログラミングの「住所の指定方法」が分かれば一撃です。コードの重要なポイントを3つに絞って解説します。
① 表の座標指定は `Cell(行, 列)` で行う
Excel VBAでは `Cells(row, col)` を使いますが、Word VBAでも全く同じ感覚で `Table.Cell(行番号, 列番号)` を使って特定のセルを狙い撃ちできます。
- `tbl.Cell(1, 1)` なら「1行1列目のセル」を指します。
② セル結合の魔法:`Merge` メソッド
今回のテーマの主役です。セルを結合するには、次のように書きます。
tbl.Cell(1, 1).Merge MergeTo:=tbl.Cell(1, 3)
「左上のセル(1, 1)から、右上のセル(1, 3)に向かって結合しなさい」という命令です。
Excel VBAの `Range.Merge` と少し書き方が違うので戸惑いやすいポイントですが、「起点となるセルから、終点のセルへ合体する」とイメージすればバッチリです。
③ セルへの文字入力には `.Range.Text` を使う
Wordのセルは、Excelのように「セルそのものに文字を入れる」のではなく、「セルの中にあるRange(領域)に対して文字を流し込む」という構造をしています。
tbl.Cell(3, 1).Range.Text = “要件定義”
この `.Range` を挟むルールさえ覚えておけば、フォントサイズ変更や太字化などの装飾も自由自在に行えるようになります。
—
4. 初学者が陥りがちな「罠」と回避策
Word VBAで表を操作する際、初心者が必ずと言っていいほどハマる罠が2つあります。
1. 結合したあとのセルを指定してエラーになる
- 罠: 1行目を結合したあとに、うっかり `tbl.Cell(1, 2)` や `tbl.Cell(1, 3)` を指定してデータを入れようとすると、「そんなセルはありません(インデックスが範囲外です)」というエラーが出ます。
- 対策: セルを結合した場合、その行の基準となるのは常に「左端のセル(今回なら `Cell(1, 1)`)」です。結合したセル群は消滅するのではなく、最初のセルに統合されると理解しましょう。
2. 列幅の調整が思い通りにいかない
- 罠: Wordの表は、ウィンドウの幅に合わせて自動調整する性質(オートフィット)を持っています。そのため、コードで列幅を指定しても、後から勝手に歪むことがあります。
- 対策: 必要に応じて `tbl.AutoFitBehavior wdAutoFitFixed`(固定列幅にする)などの設定を挟むと、レイアウトが崩れにくくなります。
—
5. おわりに:ここをクリアすれば、Word VBAの基本はバッチリですよ!
お疲れ様でした!
「表を作る」「セルを結合する」「データを流し込む」「装飾する」という一連の流れをプログラムで制御できるようになりました。
このスキルが身につけば、毎月手作業で何時間もかけて作っていたフォーマットの整った資料を、ボタン一つで、あるいは外部データ(ExcelやCSV)と連携させて一瞬で出力できるようになります。
「面倒な作業はすべてVBAに肩代わりさせる」
このエンジニアの特権とも言える爽快感を、ぜひあなたの手で味わってみてください。
それでは、次回の応用編でお会いしましょう!あなたの自動化ライフを応援しています。
