【入門編】【初心者向け】表の行末に自動で連番を振り、行の追加・削除時に番号を再計算するロジック – Word VBA解析バイブル

スポンサーリンク
スポンサーリンク

【Word VBAの極意】行の増減に怯えない!表の連番を自動更新する『動的ロジック』の構築術

こんにちは。技術の荒波を共に渡る仲間として、今日から一歩先の世界へ踏み出してみませんか?

「マクロの記録」を使って、なんとか業務を自動化できた。そんな達成感を感じているあなた。素晴らしい一歩です。でも、ふとした時にこう思ったことはありませんか?

「行を追加したり、途中の行を消したりしたとき、番号がバラバラになってしまう……。これを自動で直すには、またマクロを動かさなきゃいけないのか?」

もし、あなたが「番号を書き換えるためのマクロ」ではなく、「表の構造が変わっても、常に正しい番号を維持し続けるロジック」を書きたいと願うなら、あなたはもう、単なるユーザーではなく「エンジニア」への階段を登り始めています。

今日は、帳票作成の現場で必ずと言っていいほど遭遇する「表の連番自動更新」をテーマに、Word VBAの真髄を伝授します。ここをクリアすれば、Word VBAの基本はバッチリですよ。

1. なぜ「マクロの記録」では限界が来るのか?

「マクロの記録」は、あなたの操作を忠実にトレースします。
例えば、セルに「1」と入力する操作を記録すれば、それは「特定のセルに『1』と書き込む」という命令になります。

しかし、実務ではどうでしょう?

  • 1行目に新しいデータを入れたい。
  • 3行目のデータが不要になったので削除したい。

これらが発生した瞬間、記録された「特定のセルに書き込む」という命令は、全く意味をなさなくなります。なぜなら、「番号が入るべき場所」が動いてしまうからです。

プログラミングの鉄則は、「場所(座標)」を固定するのではなく、「ルール(ロジック)」を記述することにあります。

2. 思考のプロセス:連番をどうやって「再計算」するか

「行が増えても減っても、番号を正しく振る」ためのロジックを、エンジニアの視点で分解してみましょう。

1. 対象の特定: どの表に対して処理を行うのか?
2. 範囲の把握: その表には、今、何行あるのか?(ここが動的である必要があります)
3. ループ(反復): 1行目から最後の行まで、順番に処理を繰り返す。
4. 書き込み: 各行の「特定の列」に対して、現在の行番号に基づいた数字を流し込む。

この「行数を動的に取得する」というステップこそが、今回の鍵となります。

3. 実装:連番自動更新マクロ

それでは、実際に動くコードを見ていきましょう。
以下のコードは、文書内の「最初の表」の「1列目」に、2行目以降(見出しを除いたデータ行)の連番を自動で振り直すものです。

Sub RefreshTableSerialNumbers()
    ' ===========================================================
    ' 目的: 表の1列目に、データ行の連番を自動で振り直す
    ' 対象: 文書内の最初の表 (Tables(1))
    ' ===========================================================
    
    Dim targetTable As Table
    Dim i As Long
    Dim rowCount As Long
    
    ' エラーハンドリング: 表が存在しない場合に備える
    On Error GoTo ErrorHandler
    
    ' 1. 対象の表をセット(文書内の1番目の表)
    Set targetTable = ActiveDocument.Tables(1)
    
    ' 2. 表の総行数を動的に取得
    ' これにより、行が増減しても常に最新の行数に基づいた処理ができる
    rowCount = targetTable.Rows.Count
    
    ' 3. 行のループ処理
    ' i = 1 は見出し行と想定し、2行目から最終行までループさせる
    For i = 2 To rowCount
        ' targetTable.Cell(行番号, 列番号) を使用してセルを指定
        ' 第1列(Column 1)に、連番を書き込む
        ' 連番は「現在の行番号 - 1」とする(見出しが1行目のため)
        
        targetTable.Cell(i, 1).Range.Text = CStr(i - 1)
    Next i
    
    MsgBox "連番の更新が完了しました!", vbInformation, "完了"
    
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました。表の構造(結合セルなど)を確認してください。", vbCritical, "エラー"
End Sub

コードの重要なポイント解説

# ① `targetTable.Rows.Count` の魔法

ここが最も重要です。`10` と直接書かずに `Rows.Count` と書くことで、プログラムは実行されるその瞬間の表の行数を数えに行きます。これが「動的」と呼ばれる所以です。

# ② `Selection` を使わない「プロの作法」

初心者はよく `Selection.TypeText`(選択している場所に文字を打つ)を使いますが、これは非常に危険です。もしユーザーが変な場所をクリックしていたら、意図しない場所に番号が書き込まれてしまいます。
`targetTable.Cell(i, 1).Range` のように、オブジェクトを直接指定して操作するのが、堅牢なプログラムを作るための鉄則です。

4. 陥りやすい罠:結合セルの恐怖

ここで、ベテランエンジニアからの警告です。
Wordの表操作において、最大の敵は「セルの結合」です。

もし、表の中でセルが縦や横に結合されていると、`targetTable.Rows.Count` や `targetTable.Cell(i, 1)` という命令が「そんな行(または列)は存在しません」とエラーを吐いて止まってしまいます。

【対策】

  • 連番を振る列には、絶対に「セルの結合」を行わない設計にする。
  • もし結合が必要な場合は、結合されていないシンプルな表を別途用意するか、より高度なエラー回避ロジック(結合を考慮したループ)を組む必要があります。

まずは、「連番列は結合させない」という運用ルールを徹底すること。これが、複雑なコードを書くよりもずっとスマートな解決策になることが多々あります。

5. まとめ:次の一歩へ

今回のロジックをマスターすれば、以下のような応用が可能です。

  • 行を追加するボタンを作る: 行を追加した直後に、この `RefreshTableSerialNumbers` を呼び出すようにすれば、ユーザーは番号を気にせずに行を追加できます。
  • 特定の列を指定可能にする: コードを少し書き換えれば、どの列に番号を振るかを自由に変えられるようになります。

プログラミングは、単なる作業の置き換えではありません。「変化に強い仕組み」を作るクリエイティブな活動です。

「マクロの記録」から一歩踏み出し、今回のような「構造的なロジック」を組み立てられるようになれば、あなたの作る自動化ツールは、まるで魔法のようにスムーズに、そして正確に動き出すはずです。

ここをクリアすれば、Word VBAの基本はバッチリですよ。
さあ、次はどんな仕組みを作ってみましょうか?応援しています!

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