こんにちは!開発現場を渡り歩いてきたシニアエンジニアの私です。
「マクロの記録」ボタンを押してコードを覗いてみたものの、Excelとは違うWord特有のオブジェクト構造(`Selection`や`Range`の嵐)に絶望してブラウザを閉じちゃった……そんな経験はありませんか?
大丈夫、安心してください。今回は、マクロの記録から一歩抜け出し、現場で即戦力となる「Word表のクリーンアップ自動化」を題材に、Word VBAの本質を優しく、かつ深く紐解いていきます。
ここをクリアすれば、Wordの面倒な手作業から解放され、あなたのVBAスキルは確実に中級者の領域へと到達しますよ。
—
なぜWordの表処理は難しいのか?(Excelとの決定的な違い)
Excel VBAであれば、`Range(“A1”)`のようにセルを直接指定してズバッと値を入れられますよね。しかし、Wordの世界には「セルの座標」という概念がありません。
Wordの表は、「行(Row)の集まりの中に、セル(Cell)がぶら下がっている」という入れ子構造をしています。さらに、セルが結合されていると、行や列の数え方が狂い、初心者が書いたコードはすぐにお馴染みのエラー(「このメソッドまたはプロパティは、選択されている範囲では使用できません」など)を吐き出してクラッシュします。
だからこそ、Word VBAを制するには、「表・行・セルを正しく巡回(走査)する作法」を身につける必要があるのです。
—
今回のゴール:空欄セルを「-」で埋め尽くす
文書作成の最終段階で、表の中にうっかり空欄のまま放置されたセルがあると、なんだか締まりませんよね。これを1つずつ目視で探して「-」を入力していくのは、エンジニアの仕事ではありません。
アクティブな文書内にあるすべての表を自動で巡回し、空っぽのセルを見つけたら瞬時に「-」を流し込むスマートなマクロを作りましょう。
実装コード(コピペで使えます)
以下のコードをWordのVBAエディタ(`Alt + F11` → `挿入` → `標準モジュール`)に貼り付けて実行してください。
Sub FillEmptyCellsWithHyphen()
Dim oTable As Table
Dim oRow As Row
Dim oCell As Cell
Dim targetRange As Range
Dim processedCount As Long
‘ 処理カウンターの初期化
processedCount = 0
‘ 文書内に表が1つもない場合は早期リターン(安全性の確保)
If ActiveDocument.Tables.Count = 0 Then
MsgBox “文書内に表が見つかりませんでした。”, vbExclamation, “処理終了”
Exit Sub
End If
‘ 画面描画を停止してマクロの実行速度を爆発的に上げる(プロの常道)
Application.ScreenUpdating = False
‘ 1. 文書内のすべての表をループ処理
For Each oTable In ActiveDocument.Tables
‘ 2. 表の中のすべての行をループ処理
For Each oRow oTable.Rows
‘ 3. 行の中のすべてのセルをループ処理
For Each oCell In oRow.Cells
‘ セル内のテキストから「制御文字(改行マークやスペース)」を除去して判定
‘ ※Wordのセルには必ず「Chr(13) + Chr(7)」という特殊な終了文字が含まれるためトリムが必要
Dim cellText As String
cellText = oCell.Range.Text
cellText = Left(cellText, Len(cellText) – 2) ‘ 末尾のWord特有の制御文字を取り除く
cellText = Trim(cellText) ‘ 前後の半角/全角スペースも除去
‘ 空欄(長さが0)の場合のみ処理を行う
If cellText = “” then
‘ セル全体のRangeオブジェクトを取得し、末尾の制御文字を除外して書き込む
Set targetRange = oCell.Range
targetRange.MoveEnd Unit:=wdCharacter, Count:=-2
‘ 「-」を流し込む
targetRange.Text = “-”
‘ カウントアップ
processedCount = processedCount + 1
End If
Next oCell
Next oRow
Next oTable
‘ 画面描画の再開
Application.ScreenUpdating = True
‘ 完了メッセージ
MsgBox “クリーンアップが完了しました。” & vbCrLf & _
“空欄セル ” & processedCount & ” 箇所に「-」を補充しました。”, vbInformation, “処理成功”
End Sub
—
コードの核心:知っておくべき3つのポイント
このコードには、Word VBAで挫折しないための重要な知見が詰まっています。
1. 画面描画の停止 (`Application.ScreenUpdating = False`)
表の数が多く、セルが何百個もある場合、画面を1回1回書き換えているとものすごく時間がかかります(画面がチラチラ点滅します)。
処理の最初に `False` にし、最後に `True` に戻す。これだけで実行速度が何倍にも跳ね上がります。プログラミング現場の必須テクニックです。
2. Wordセル特有の「見えない罠」
Excelと違い、Wordの `oCell.Range.Text` をそのまま取得すると、文字列の最後に必ず `Chr(13) & Chr(7)`(セル終了マークと段落記号) がくっついてきます。
そのため、純粋な空欄判定をするためには、コード内で行っているように末尾の2文字を削るか、適切なトリム処理を入れる必要があります。ここを見落とすと、「空欄のはずなのに `cellText = “”` の判定をすり抜けてしまう!」というバグにハマります。
3. セルの中身を書き換える作法
`oCell.Range.Text = “-“` と書いても動くには動きますが、これだとセル全体の書式(フォントや配置など)が崩れてしまうことがあります。
プロは、セルから取得した `Range` の末尾2文字を削ってターゲット範囲を絞り込み、そこにテキストを流し込みます。こうすることで、元のセルの書式やスタイルを美しく保つことができます。
—
陥りやすいエラーと対策
- エラー:「このメソッドまたはプロパティは…」
- 原因: 結合セル(セルが合体している状態)が含まれているループで、行や列のインデックス(`Rows(1)` など)を直接指定してアクセスしようとすると発生します。
- 対策: 今回紹介した `For Each oCell In oRow.Cells` のように、コレクションを直接イテレート(巡回)する書き方であれば、結合セルが存在する複雑な表でも安全に走査できます。
—
まとめ
今回は、Word表の全セルを走査し、空欄を「-」で自動埋めするクリーンアップマクロを通じて、Word VBAにおけるオブジェクトの捉え方と安全な走査の極意を解説しました。
「マクロの記録」で作られたスパゲッティコードから卒業し、こうした論理的なコレクション操作ができるようになると、日々のドキュメント作成業務は劇的にスピーディーになります。
ここをクリアしたあなたなら、もうWord VBAを怖がる必要はありません。ぜひ自分の業務データで試して、自動化の爽快感を味わってみてくださいね!
