こんにちは! Word VBAの自動化の世界へようこそ。
マクロの記録ボタンを押して「なんだか動いた!」と喜んでいた時期を通り越し、「もっと実用的な書類を作りたい」「チェックボックスの集計なんてスマートにやりたい」と感じているなら……おめでとうございます。あなたは今、中級者への素晴らしい一歩を踏み出しています。
今回は、業務ヒアリングシートやアンケート用紙などでよく見かける「表のセル内にあるチェックボックスのON/OFFを判定し、チェックが入っている行だけを抽出して別の表へ集計する」という、実務でめちゃくちゃ使えるロジックを解説します。
ここをクリアすれば、Word VBAのオブジェクト構造の本質がグッと見えてきますよ。温かく導いていくので、一緒にマスターしていきましょう!
—
1. なぜWordのチェックボックス判定は一筋縄ではいかないのか?
Excel VBAであれば `Range(“A1”).Value = True` のように一発で判定できますが、Wordの世界は少し勝手が違います。
Wordの表(Table)の構造を思い出してください。セル(Cell)の中には段落(Paragraph)があり、その中にテキストだけでなく、フォームコントロールやレガシーなチェックボックス、あるいはContentControl(コンテンツコントロール)が存在しています。
特に中級者が最初にハマる罠がこれです:
- 「セルの `.Range.Text` を読めばいいや」 → チェックボックスの状態はテキストとして取得できません。
- 「どのコレクションにチェックボックスが入っているか分からない」 → `FormFields` なのか `Range.ContentControls` なのか、Wordのバージョンや配置方法によってアクセス経路が異なります。
今回は、最も堅牢で実務で使われている「レガシーフォームのチェックボックス(FormFields)」をターゲットにした、極限まで無駄のない集計ロジックを組み上げていきます。
—
2. 実装イメージ(構造の理解)
今回のマクロがやることの全貌です。
1. 元となる表(Table 1)を走査する。
2. 各行の指定列にあるチェックボックス(FormField)の状態を確認する。
3. もし「ON(True)」であれば、その行のデータを取得する。
4. 集計用の表(Table 2)の末尾に新しい行を追加し、データを流し込む。
図解すると、こんなイメージです。
[ 元の表 (Table 1) ]
┌──────────┬──────────┬──────────┐
│ 項目名 │ 担当者 │ 完了 │
├──────────┼──────────┼──────────┤
│ 要件定義 │ 田中 │ [ ✔ ] │ ───┐ (抽出!)
├──────────┼──────────┼──────────┤ │
│ 基本設計 │ 鈴木 │ [ ] │ │
├──────────┼──────────┼──────────┤ │
│ 詳細設計 │ 佐藤 │ [ ✔ ] │ ───┼─┐ (抽出!)
└──────────┴──────────┴──────────┘ │ │
▼ ▼
[ 集計用の表 (Table 2) ]
┌──────────┬──────────┐
│ 要件定義 │ 田中 │
├──────────┼──────────┤
│ 詳細設計 │ 佐藤 │
└──────────┴──────────┘
—
3. 実践!チェックボックス集計マクロのコード
それでは、実際の開発現場でそのままコピペして使える完全版のコードを公開します。
VBAエディタ(`Alt + F11`)を開き、標準モジュールに貼り付けて実行してみてください。
Sub CollectCheckedRows()
Dim doc As Document
Set doc = ActiveDocument
‘ — オブジェクトの定義 —
Dim tblSource As Table
Dim tblTarget As Table
Dim targetRow As Row
Dim i As Long
Dim nextRowIdx As Long
‘ エラー対策:ドキュメント内に表が2つ以上あるかチェック
If doc.Tables.Count < 2 Then
MsgBox "ドキュメント内に表が2つ以上必要です(元データ表と集計表)。", vbExclamation, "エラー"
Exit Sub
End If
' Table 1を元データ、Table 2を集計先とする
Set tblSource = doc.Tables(1)
Set tblTarget = doc.Tables(2)
' 集計先の表をクリア(ヘッダー行を残して2行目以降を削除)
If tblTarget.Rows.Count > 1 Then
For i = tblTarget.Rows.Count To 2 Step -1
tblTarget.Rows(i).Delete
Next i
End If
‘ — 画面描画を停止してパフォーマンスを爆上げする作法 —
Application.ScreenUpdating = False
‘ — 元データ表の走査(見出し行を除く2行目からスタート) —
For i = 2 To tblSource.Rows.Count
‘ チェックボックスがセル内(例: 3列目)にあると仮定
‘ ※Wordのフォームフィールドが存在するか安全にチェック
On Error Resume Next
Dim chkBox As FormField
Set chkBox = tblSource.Cell(i, 3).Range.FormFields(1)
On Error GoTo 0
If Not chkBox Is Nothing Then
‘ チェックボックスが存在し、かつ「ON(True)」の場合
If chkBox.CheckBox.Value = True Then
‘ 集計表に新しい行を追加
Set targetRow = tblTarget.Rows.Add
‘ 1列目と2列目のテキストをコピー(セル内の末尾の特殊文字を排除するためRange.Textをスライス)
targetRow.Cells(1).Range.Text = CleanCellText(tblSource.Cell(i, 1).Range.Text)
targetRow.Cells(2).Range.Text = CleanCellText(tblSource.Cell(i, 2).Range.Text)
End If
End If
‘ 変数をリセット
Set chkBox = Nothing
Next i
‘ — 描画の再開 —
Application.ScreenUpdating = True
MsgBox “チェックされたデータの集計が完了しました!”, vbInformation, “処理完了”
End Sub
‘ ==============================================================================
‘ 【Helper関数】Wordのセルテキスト末尾にある「セル・段落 終了記号(Chr(13) + Chr(7))」を除去する関数
‘ ==============================================================================
Private Function CleanCellText(ByVal cellText As String) As String
If Len(cellText) >= 2 Then
CleanCellText = Left(cellText, Len(cellText) – 2)
Else
CleanCellText = cellText
End If
End Function
—
4. コードの深掘りポイント(知的なエンジニアの視点)
ここからは、なぜこのコードが優れているのか、プロの視点で重要なポイントを3つ解説します。
① `Application.ScreenUpdating = False` の魔法
Word VBAで表の行追加やテキスト書き換えを大量に行うと、画面がチラつき、処理速度が極端に落ちます。処理の冒頭で画面描画を止め、最後に一気に描画させることで、実行スピードが体感で数倍〜数十倍に跳ね上がります。 これは実務コードの必須テクニックです。
② Word固有の罠:「セルの中の不可視文字」への対策
Wordのセルから `.Range.Text` で文字列を取得すると、文末に必ず `[CR][Cell]` という制御文字(`Chr(13) & Chr(7)`)が混入します。これをそのまま別の表にコピーすると、謎の改行や変なスペースが生まれ、レイアウトが崩壊します。
それを綺麗に防ぐために用意したのが末尾のヘルパー関数 `CleanCellText` です。文字数を後ろから2文字削ることで、純粋なテキストデータだけを安全に転記できます。
③ エラーハンドリングの優しさ
`On Error Resume Next` を使うことで、「チェックボックスが配置されていないセル」に遭遇してもマクロがクラッシュせず、華麗にスルーして次の行へ進めるようにしています。堅牢なシステムは、こうした「例外への備え」で作られています。
—
まとめ
いかがでしたか?
「表のセル」「フォームコントロール」「テキストのクレンジング」、そして「パフォーマンスの最適化」。これらが有機的に噛み合うことで、Wordは単なるワープロソフトから、強力な業務データ処理プラットフォームへと生まれ変わります。
ここをクリアしたあなたなら、どんな複雑なWord帳票の自動化も怖くありません。ぜひ自分の環境で試して、日々の業務をスマートにハックしてくださいね。
それでは、次回の高度なWord VBAでお会いしましょう!
