【入門編】【初心者向け】表の各セルに連番を自動入力するシンプルなマクロ – Word VBA解析バイブル

スポンサーリンク

こんにちは!マクロの記録ボタンを押すだけの世界から一歩抜け出して、いよいよ本格的な自動化の世界へ踏み出そうとしているんですね。素晴らしい挑戦です。

Excel VBAなら触ったことがあるという方も、「Wordの表(Table)を操作する」となると、途端に勝手が違って戸惑うことが多いもの。Excelが「最初から綺麗なマス目(セル)が用意された方眼紙」だとしたら、Wordの表は「ドキュメントの流れの中に埋め込まれた、ちょっと気まぐれな生き物」のようなものです。

今回は、そんなWordの表の1列目に「1, 2, 3…」と自動で連番を振るシンプルかつ実用的なマクロを通じて、Word VBAの基本構造をマスターしていきましょう。ここをクリアすれば、あなたの文書作成スピードは圧倒的に変わりますよ。

—

なぜ「手作業のナンバリング」は危ういのか?

業務報告書、見積書、仕様書……。Wordで表を作っていて、途中に新しい行を挿入した途端、こんな絶望を味わったことはありませんか?

> 「あ、行を増やしたから、1から順に番号を打ち直さなきゃ……」
> 「あれ、途中で行を削除したら、番号が『3, 5, 6』みたいに飛んじゃった!」

人間は、こうした機械的な単純作業を行うと、どうしてもミスをします。そして、差し戻しを食らう。
こんな不毛な作業は、すべてWord VBA(マクロ)に丸投げするのが、プログラミングを嗜む者のスマートな生き方です。

—

本日のゴール:動くコードの全体像

まずは、何も難しいことを考えずに、以下のコードをそのまま眺めてみてください。そして、後述する解説を読んだあとに「なるほど、こういうことか!」と腑に落ちる体験をしてもらいましょう。

Sub InsertSequentialNumbers()
‘ 変数の宣言(記憶の引き出しを用意するイメージです)
Dim targetTable As Table
Dim i As Long

‘ 【重要】アクティブな文書に「表」が選択されているかチェック
If Selection.Information(wdWithInTable) = False Then
MsgBox “番号を振りたい表の中にカーソルを置いてください。”, vbExclamation, “エラー”
Exit Sub
End If

‘ カーソルがある表をオブジェクトとして取得
Set targetTable = Selection.Tables(1)

‘ 表の1行目から最終行までループ(繰り返し処理)を回す
For i = 1 To targetTable.Rows.Count
‘ i番目の行の「1列目のセル」に、変数iの数値を流し込む
‘ .Range.Text とすることで、セル内の文字列を指定・書き換えできます
targetTable.Cell(i, 1).Range.Text = i
Next i

‘ 完了の合図
MsgBox “連番の自動入力が完了しました!”, vbInformation, “成功”
End Sub

—

コードの急所を優しく解説!初心者がつまずかないための4つのポイント

この短いコードの中には、Word VBAを使いこなすためのエッセンスがぎっしり詰まっています。一つずつ紐解いていきましょう。

1. 「今、どこにいる?」を判定する安全装置

If Selection.Information(wdWithInTable) = False Then

初心者が最もやりがちなエラーが、「表の外にカーソルがある状態でマクロを実行してしまい、怒られる(実行時エラー)」というパターンです。
`Selection.Information(wdWithInTable)` は、「今、ユーザーのカーソルは表の中にありますか?」というイエス・ノーを返してくれる優秀な見張り番です。親切なエラーメッセージを挟むことで、使っていて心地よいマクロになります。

2. 「Selection(選択)」から「Table(実体)」への脱却

Excel VBAでもよく `Selection.Range` などと書きがちですが、Word VBAでは「選択されているもの」を直接いじり続けると、コードが遅くなったり予期せぬ挙動をしたりします。
そのため、`Set targetTable = Selection.Tables(1)` として、「今カーソルがある表」を `targetTable` という名前の変数(実体)にしっかり捕まえておくのがプロの作法です。

3. 縦の長さを自動で測る `Rows.Count`

「表が何行あるか」を手動で数える必要はありません。`targetTable.Rows.Count` と書けば、その表が現在何行で構成されているかを自動的にカウントしてくれます。たとえ10行でも100行でも、コードの書き換えは不要です。

4. Word VBA特有の壁:`Cell(行, 列).Range.Text`

ここが一番のポイントです。Excelなら `Cells(i, 1).Value = i` と書けるところを、Wordではこう書きます。

> `targetTable.Cell(i, 1).Range.Text = i`

なぜ `Range` を挟む必要があるのでしょうか?
それは、Wordの「セル」という空間の中に文字を入れるときは、そのセルの中にある「テキスト範囲(Range)」というオブジェクトを指し示して、そこに文字を流し込むという仕様になっているからです。呪文だと思って、まずはこの形をそのまま覚えてしまいましょう!

—

実際に動かしてみよう(使い方)

1. Wordを開き、[開発]タブから[Visual Basic]をクリック(または `Alt + F11` キー)。
2. メニューの [挿入] > [標準モジュール] をクリック。
3. 開いた真っ白な画面に、上記のコードをそのまま貼り付けます。
4. 適当な表を作り、表の中にカーソルを置いた状態で、マクロ(`InsertSequentialNumbers`)を実行(F5キー)します。

一瞬で1列目に「1, 2, 3……」と番号が振られたはずです。どうですか?快感ではありませんか?

—

陥りがちな罠とエラーへの対処法

Q. 数字の後ろに変なマーク(セル末尾の記号)が入ってしまう!

Wordの表のセルには、実は目に見えない「セルの終わり(段落記号のようなもの)」が必ず含まれています。
もし単純にテキストを代入するのではなく、既存の文字を綺麗に置き換えたい場合は、以下のように末尾の特殊文字(`vbCr` など)を取り除く処理を入れると、よりプロフェッショナルな挙動になります。

‘ セルに入れる際は、余計な改行コードが入らないように整えるテクニック
targetTable.Cell(i, 1).Range.Text = CStr(i)

※今回はシンプルさを優先して `targetTable.Cell(i, 1).Range.Text = i` としていますが、実務では上記のように文字列に変換(`CStr`)することが多いです。

—

先輩エンジニアからのエール

お疲れ様でした!今回は、Wordの表を操作する第一歩として「連番の自動入力」を解説しました。

「たかが数字を振るだけなのに、コードを書く方が面倒くさい」と感じた瞬間があったかもしれません。しかし、これが50行、100行の表になったとき、あるいは毎日のように同じフォーマットの報告書を作る業務が発生したとき、この数行のコードがあなたの自由な時間をどれだけ生み出してくれることか。

ここをクリアすれば、次は「特定の条件の行に色を塗る」「セルの幅を自動調整する」といった、より高度なWord自動化の扉が開きます。

焦らず、一歩ずつ。あなたの自動化ライフを心から応援しています!

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