【入門編】【中級者向け】表内の数値を読み取り、合計値を計算して最下行に書き込む自動計算ツール – Word VBA解析バイブル

スポンサーリンク

Word VBAを掌握せよ:表計算を自動化する「現場の流儀」

こんにちは。システム開発の現場で「自動化の魔法」を仕掛けているアーキテクトです。

Wordのマクロ(VBA)に挑戦しようとすると、多くの人が「マクロの記録」で生成された冗長なコードに絶望します。しかし、安心してください。Wordの表(Table)操作は、「オブジェクトの階層構造」と「行・列のインデックス」さえ理解すれば、驚くほど自由に操れるようになります。

今回は、業務で最も頻出する「表の数値を読み取り、合計して最下行に書き込む」というタスクを通じて、Word VBAの真髄を伝授します。

—

1. Word VBAにおける「表」の階層構造を理解する

Wordの表は、Excelのセル指定とは少し概念が異なります。以下の階層を頭に叩き込んでください。

  • Document (文書全体)
  • Table (文書内の表)
  • Row (行)
  • Cell (セル)
  • Range (セル内のテキストデータ)

ここが重要: `Cell(row, col).Range.Text` で値を取得すると、末尾に「セル終了マーク(特殊文字)」が含まれます。これをそのまま数値計算しようとすると型不一致エラーになります。この「ゴミ」を掃除するのがプロの第一歩です。

—

2. 実践コード:合計算出自動化ツール

以下のコードをVBE(Visual Basic Editor)に貼り付けてみてください。現場でそのまま使えるように、堅牢なエラーハンドリングを意識した設計にしています。

Sub CalculateTableTotal()
Dim tbl As Table
Dim i As Long
Dim total As Double
Dim lastRow As Row

‘ 1. カーソルが表の中にあるか確認
If Selection.Information(wdWithInTable) = False Then
MsgBox “表の中にカーソルを置いて実行してください。”
Exit Sub
End If

Set tbl = Selection.Tables(1)
total = 0

‘ 2. 表のデータ行(1行目~最終行の前まで)をループして合計算出
‘ ※今回は2行目から合計対象と仮定
For i = 2 To tbl.Rows.Count – 1
‘ セル内の値を取得し、不要な文字を削除して数値化
‘ Left(…, Len(…) – 1) でセル終了マークを取り除くのが定石
Dim cellVal As String
cellVal = Left(tbl.Cell(i, 2).Range.Text, Len(tbl.Cell(i, 2).Range.Text) – 1)

If IsNumeric(cellVal) Then
total = total + CDbl(cellVal)
End If
Next i

‘ 3. 最下行に合計を書き込む
Set lastRow = tbl.Rows.Last
lastRow.Cells(1).Range.Text = “合計”
lastRow.Cells(2).Range.Text = Format(total, “#,

0″)

MsgBox “計算完了!合計値: ” & total
End Sub

—

3. 現場で「ハマる」ポイントと対策

① セル終了マークの罠

Wordのセルには必ず`Chr(13) & Chr(7)`という文字が含まれています。これをそのまま `Val()` 関数や `CDbl()` 関数に渡すと、予期せぬ挙動やエラーが発生します。前述のコードのように `Left(…, Len(…) – 1)` で削り取るか、`Replace()` 関数で除去する癖をつけましょう。

② 表の構造が変わった場合

もし「表の行数」が動的に変わる場合、`tbl.Rows.Count` を使うのが正解です。しかし、表の結合(マージ)が含まれる場合、インデックスがずれることがあります。その際は `Selection.Information` や `Range.Information` を駆使して、現在のセル位置を特定するロジックを組むのが「伝説的エンジニア」への近道です。

③ パフォーマンスの重み

何百行もある表を処理する場合、`Application.ScreenUpdating = False` をコードの冒頭に入れ、最後に `True` に戻してください。画面の再描画を止めるだけで、実行速度は劇的に向上します。

—

最後に:マクロの記録から「設計」へ

マクロの記録はあくまで「ヒント」です。そのまま使うと、冗長で修正が困難なコードが出来上がります。
今回学んだ「オブジェクトを特定し、Rangeを制御する」という考え方は、Word VBAのあらゆる業務自動化の基礎となります。

ここをクリアできれば、次は「複数の表を一括処理する」「WordからExcelへデータを飛ばす」といった、一段上の自動化も夢ではありません。

まずはこのコードを、お手元の資料で試してみてください。分からないことがあれば、またいつでも聞きに来てくださいね。あなたの自動化ライフを、心から応援しています。

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