こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから、自分の手でドキュメントを意のままに操るエンジニアのステージへステップアップしようとしているあなたへ。
今回は、実務で最もリクエストが多く、かつ初心者が一発レッドカード(エラー)をもらいやすい「表(Table)の動的生成とデータ流し込み」を徹底解説します。
「データ量に合わせて行が勝手に増え、デザインも崩れない表」をWord VBAで作る方法、気になりますよね?
ここをクリアすれば、Word VBAの基本はバッチリですよ。優しく、そして本質的なところまでしっかり導いていきますので、ついてきてくださいね!
—
なぜ「固定の表」ではダメなのか?
実務で扱うデータ(売上リスト、メンバー一覧、アンケート結果など)は、日によって件数が変わりますよね。
それなのに、Wordのテンプレートがあらかじめ「10行分」に固定されていたらどうでしょう?
- データが15件あったら、5件あふれてデザインが崩れるか、エラーになる。
- データが3件しかなかったら、無駄な空白の行がポツンと残ってダサい。
プロの自動化エンジニアが作るドキュメントは、「流し込むデータ量に応じて、表が自ら呼吸するように伸縮する」のが鉄則です。この動的な仕組みをVBAで実装していきましょう。
—
押さえておきたいWord表の基本構造(オブジェクトモデル)
Excel VBAの「セル(Cells)」の感覚でWordの表を触ると、最初は少し戸惑います。
Wordの表(`Table`)は、「行(Rows)」と「列(Columns)」の二次元のマトリックスでできています。
特に重要なのは、「行の追加(`Add`メソッド)」の挙動です。
Wordの表に行を追加するときは、「表のどの位置(どの行の前/後)に追加するか」を指定します。今回は一番シンプルで実用的な「表の末尾にどんどん行を追加していく」パターンをマスターしましょう。
—
【実践】データ数に合わせて自動拡張するテーブル生成コード
それでは、開発の現場でそのままコピペして使える実用コードを公開します。
今回は、配列(メモリ上のデータ)を模したサンプルデータを用意し、それをWord文書の末尾に動的な表として美しく出力するプログラムです。
Sub CreateDynamicTable()
Dim doc As Document
Set doc = ActiveDocument
‘ 1. 流し込みたいデータ(今回は2次元配列で表現)
‘ 実務ではExcelから読み込んだり、DBから取得したりするデータに置き換えます
Dim rawData(3, 2) As String
‘ 見出しの設定
rawData(0, 0) = “社員ID”
rawData(0, 1) = “氏名”
rawData(0, 2) = “部署”
‘ データ本体の設定
rawData(1, 0) = “001”
rawData(1, 1) = “山田 太郎”
rawData(1, 2) = “開発部”
rawData(2, 0) = “002”
rawData(2, 1) = “鈴木 花子”
rawData(2, 2) = “人事部”
rawData(3, 0) = “003”
rawData(3, 1) = “佐藤 健一”
rawData(3, 2) = “営業部”
‘ 2. データの行数と列数を動的に判定
Dim totalRows As Long
Dim totalCols As Long
totalRows = UBound(rawData, 1) + 1 ‘ 配列の行数(0基底なので+1)
totalCols = UBound(rawData, 2) + 1 ‘ 配列の列数
‘ 3. 文書の一番最後に表を作成する(最初はヘッダー分の1行だけ作成)
Dim rng As Range
Set rng = doc.Content
rng.Collapse wdCollapseEnd ‘ 文書末尾にカーソルを移動
Dim targetTable As Table
‘ Table.Add(範囲, 行数, 列数)
Set targetTable = doc.Tables.Add(Range:=rng, NumRows:=1, NumColumns:=totalCols)
‘ 4. 表のデザイン(スタイル)を適用してリッチにする
targetTable.Style = “テーブル (格子)”
targetTable.AllowAutoFit = True
‘ 5. ヘッダー行にデータを流し込む
Dim c As Long
For c = 1 To totalCols
targetTable.Cell(1, c).Range.Text = rawData(0, c – 1)
‘ ヘッダーを目立たせるために太字にするおもてなし
targetTable.Cell(1, c).Range.Bold = True
Nxtc: ‘ (※ネスト用のラベルではありません、通常のNextです)
Next c
‘ 6. 【最重要】データ量に応じて行を動的に追加しながら流し込む
Dim r As Long
For r = 1 To totalRows – 1
‘ 表の末尾に新しい行を1行追加
targetTable.Rows.Add
‘ 追加した行(一番下の行)にデータを流し込む
For c = 1 To totalCols
targetTable.Cell(r + 1, c).Range.Text = rawData(r, c – 1)
Next c
Next r
‘ 完了メッセージ
MsgBox “データ量に応じた表の自動生成が完了しました!”, vbInformation, “処理成功”
End Sub
—
コードの解説:ここがエンジニアのこだわりポイント!
初心者の方に向けて、上記のコードで「おっ」と唸るべきポイントを3つ解説します。
1. 配列のサイズから動的にループを回す(`UBound`の活用)
`UBound(rawData, 1)` は、配列の「1次元目(行方向)」の最大インデックスを取得する関数です。
データの件数が「3件」だろうが「300件」だろうが、コードを書き換えることなく、VBAが自ら数えて最適なループ回数を計算してくれます。これが動的プログラミングの醍醐味です。
2. `targetTable.Rows.Add` で行を増やす
Wordの表に新しく行を足したいときは、`Rows.Add` メソッドを呼び出すだけ。これだけで、デザイン(罫線の太さや背景色など)を維持したまま、一番下に綺麗な行が1行スポッと追加されます。
3. Word特有の「セル指定」の罠を防ぐ
Wordの表のセルを指定するときは、`Cell(行番号, 列番号)` を使います。
Excelと違って「1から始まる」点に注意してください(Excelは `Cells(1, 1)` ですが、Wordも同様に1始まりなのでここは直感的で安心ですね)。
ただし、セルの `.Range.Text` に文字列を代入すると、セルの末尾に自動的に制御文字(段落記号)が入る特性があります。今回はシンプルにそのまま代入していますが、実務ではセルの書式や配置(中央揃えなど)もセットで整えると完璧です。
—
初心者が必ずハマる!陥りやすいエラーと回避策
最後に、現場で泣きを見るポイントを先回りして共有しておきます。
罠その1:「結合セル」がある状態で `Rows.Add` やデータ流し込みをする
Wordの表で、タイトル行や備考欄などで「セルの結合(Merge)」をしていると、VBAの `Cell(r, c)` 指定が狂い、「指定されたコレクションのインデックスが正しくありません(エラー 5941)」という有名なエラーが爆誕します。
- 回避策: 動的にデータを流し込むテーブル本体は、絶対にセル結合をしていない「綺麗なグリッド状(格子状)」で作ること。デザイン上の結合は、表の外や別の場所で行いましょう。
罠その2:毎回表を最初から作り直さず、無駄な空行を残してしまう
「マクロを実行するたびに、古い表の下に変な表がどんどん追加される…」という事故もよく起きます。
- 回避策: 処理の最初に「既存の特定の表をクリアする」か、上記コードのように「新しいドキュメントの末尾、または特定のブックマーク位置にクリーンに生成する」設計にしましょう。
—
まとめ
いかがでしたでしょうか?
今回は、Word VBAにおける「表の動的生成とデータの流し込み」について、オブジェクトの動きをイメージしながら解説しました。
- データ量に合わせた自動拡張は `Rows.Add` と `UBound` で実現できる。
- Wordの表構造は、行と列のグリッド(`Cell`オブジェクト)を正確に指定してあげるのがコツ。
このテクニックさえ身につければ、見積書、請求書、議事録、レポートなど、あらゆるビジネス文書の自動生成ボットをあなたが作り出すことができます。
ぜひ手元のWordVBAエディタ(`Alt + F11`)を開いて、このコードを動かしてみてください。
あなたの自動化ライフが、ここから一気に加速することを応援しています!
