【入門編】Word VBAで表(Table)のセルを自在に操る:行・列の動的追加とセルのマージ・分割の自動化 – Word VBA解析バイブル

スポンサーリンク

こんにちは! Word VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだかよく分からないけれど動いた!」と喜んでいた時期は、もう卒業しませんか?

今回は、実務の書類作成で最も頭を悩ませるポイントの一つである「表(Table)の自由自在なコントロール」をテーマに解説します。行や列の動的な追加、セルのマージ(結合)や分割を、VBAのコードで完全に掌握する方法を伝授しましょう。

ここをクリアすれば、Word VBAのオブジェクトモデルの本質が手に取るように分かるようになります。しっかりついてきてくださいね!

1. Word表(Table)構造の「本質」を知る

Excelのセル操作(`Range(“A1”)` など)に慣れている人ほど、Wordの表操作で躓きます。なぜなら、Wordの表は「行(Row)と列(Column)、そしてセル(Cell)が複雑に絡み合う立体構造」をしているからです。

Word VBAのオブジェクト階層は、基本形としてこうなっています。

Document (文書)
┗ Tables (表の集合)
┗ Table (特定の表)
┗ Rows / Columns / Cells (行・列・セル)
┗ Range (テキストや書式そのもの)

Excelのように「B5セル」という固定の番地はありません。「何行目の何列目か(`Cell(row, column)`)」を指定するか、あるいは「Range(範囲)」そのものを操作するのがWord流です。

2. 【基本】表の行を動的に追加し、データを流し込む

まずは、実務で一番よく使う「キーワードをトリガーにして、表の行を動的に増やす」テクニックを見てみましょう。

例えば、見積書やチェックリストで、項目の数だけ行を自動で追加したい場面を想像してください。

Sub AddRowsDynamically()
Dim doc As Document
Dim targetTable As Table
Dim newRow As Row

Set doc = ActiveDocument

‘ 文書内の1番目の表をターゲットにする
If doc.Tables.Count = 0 Then
MsgBox “文書内に表が見つかりません。”, vbExclamation
Exit Sub
End If

Set targetTable = doc.Tables(1)

‘ 【重要】表の「最後尾」に新しい行を追加する
Set newRow = targetTable.Rows.Add

‘ 追加した行の各セルにデータを流し込む
‘ Wordのセルは 1-origin(1から始まる)です
newRow.Cells(1).Range.Text = “追加項目A”
newRow.Cells(2).Range.Text = “¥10,000”

MsgBox “行の追加とデータ書き込みが完了しました!”, vbInformation
End Sub

ここがポイント!

`newRow.Cells(1).Range.Text` という記述に注目してください。
セル(Cell)の中に直接文字を入れるのではなく、セルの持つ「Range(領域)」に対してテキストを代入するのがWord VBAの鉄則です。この一手間を忘れないことが、エラーを防ぐ最大の秘訣ですよ。

3. 【応用】特定のキーワードを探して行を挿入する

「表の末尾に追加するだけじゃなく、特定のタイトルの『下』に行を差し込みたいんだよ!」という現場の要望に応えましょう。

Sub InsertRowAfterKeyword()
Dim targetTable As Table
Dim i As Long, j As Long
Dim foundCell As Cell
Dim targetRow As Row

Set targetTable = ActiveDocument.Tables(1)
Set foundCell = Nothing

‘ 表全体を総ナメして「小計」というキーワードを探す
For i = 1 To targetTable.Rows.Count
For j = 1 To targetTable.Rows(i).Cells.Count
‘ セルのテキストから改行コード( vbCr )などを除外して比較
If InStr(targetTable.Cell(i, j).Range.Text, “小計”) > 0 Then
Set foundCell = targetTable.Cell(i, j)
Exit For
End If
Next j
If Not foundCell Is Nothing Then Exit For
Next i

‘ キーワードが見つかった場合、その「行の上(または下)」に行を挿入
If Not foundCell Is Nothing Then
Set targetRow = targetTable.Rows.Add(BeforeRow:=foundCell.Row)

targetRow.Cells(1).Range.Text = “消費税 (10%)”
targetRow.Cells(2).Range.Text = “自動計算行”

MsgBox “「小計」の行の直上に行を挿入しました!”, vbInformation
Else
MsgBox “指定したキーワードが見つかりませんでした。”, vbExclamation
End If
End Sub

4. セルのマージ(結合)と分割を自在に操る

帳票レイアウトの自動化で避けて通れないのが、セルの結合(Merge)と分割(Split)です。ここをコードで制御できれば、あなたも立派なWord VBAエンジニアです。

セルを結合する (`Merge`)

Sub MergeCellsSample()
Dim targetTable As Table
Set targetTable = ActiveDocument.Tables(1)

‘ 2行目の1列目から3列目までを結合する
targetTable.Cell(2, 1).Merge _
MergeTo:=targetTable.Cell(2, 3)

MsgBox “セルを結合しました。”, vbInformation
End Sub

セルを分割する (`Split`)

Sub SplitCellSample()
Dim targetTable As Table
Set targetTable = ActiveDocument.Tables(1)

‘ 1行目の1番目のセルを、[2列] × [1行] に分割する
targetTable.Cell(1, 1).Split NumRows:=1, NumColumns:=2

MsgBox “セルを分割しました。”, vbInformation
End Sub

5. 初学者が絶対にハマる「落とし穴」と回避策

ここで、実務で多くの人が涙を流すエラーとその対策を共有しておきます。知っているだけで無駄な残業が消えますよ。

罠1: セルを結合したあとに列数が狂う

【現象】
横に並んだ3つのセルを `Merge` で結合したあと、うっかり `Cells(2)` を指定してエラーになる。
【理由】
セルを結合すると、結合された行の「列の総数(Columns.Count)」の概念が物理的に変化します。Excelのように「見た目は1つだけど内部的にはセルが存在する」ではなく、Wordのセルは消滅・統合されます。
【対策】
表の構造を変更(結合・分割)した直後は、ループ処理の終了条件や列番号のハードコーディングを避け、動的な `Cells.Count` を利用するように設計しましょう。

罠2: 表が存在しないドキュメントで実行してクラッシュ

【現象】
`ActiveDocument.Tables(1)` と直書きしていて、表がないファイルで実行した瞬間に「インデックスが有効範囲にありません」エラー。
【対策】
必ず前段で `If ActiveDocument.Tables.Count > 0 Then` というガード節(条件分岐)を挟む癖をつけましょう。プログラミングの基本であり、最強の防御です。

おわりに

今回は、Word VBAにおける表(Table)の動的制御、行の追加、そしてセルの結合・分割について解説しました。

「マクロの記録」では絶対に作れない、動的で柔軟なドキュメント生成ツールが、あなたの手で形にできるようになります。ここをクリアできれば、Word VBAの基本はバッチリです!自信を持って、日々の業務自動化に挑戦してくださいね。

それでは、また次回の極限の知見でお会いしましょう。エンジニアライフを楽しみましょう!

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