【入門編】【初心者向け】表の行数を動的に取得し、指定した行数に達するまで空行を追加し続けるVBA – Word VBA解析バイブル

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

帳票の美しさを守る魔法:Word VBAで「表の行数」を自在に操る技術

こんにちは。現場のコードを預かるチーフアーキテクトです。

「マクロの記録」機能を使って、一歩ずつプログラミングの世界に足を踏み入れた皆さん、素晴らしい挑戦です。記録したコードを眺めて、「なぜこう動いているんだろう?」と疑問に思うようになった時、あなたはすでに「自動化エンジニア」への階段を登り始めています。

今日扱うテーマは、実務で極めて頻繁に遭遇する「表(テーブル)の動的生成」です。

例えば、あらかじめデザインされた綺麗な請求書や報告書のフォーマットがあるとしましょう。データが10件あればいいですが、もしデータが3件しかなかったら? 表がスカスカになり、印刷した時に見た目が美しくありません。逆に、データが20件あったら、枠が足りなくなってレイアウトが崩れてしまいます。

これを手動で直すのは時間の無駄です。「必要な行数になるまで、自動で空行を足し続ける」。このロジックをマスターすれば、あなたの作る帳票はどんなデータ量でも、常に完璧な見た目を維持できるようになります。

ここをクリアすれば、Word VBAの基本はバッチリですよ。さあ、一緒に見ていきましょう。

1. コンセプト: 「今」と「理想」の差を埋める

プログラミングで複雑なことをしようとすると、頭が混乱します。しかし、この問題の本質は驚くほどシンプルです。

私たちがやりたいことは、数学の引き算と同じです。

1. 現在の行数(今、テーブルに何行あるか?)を知る。
2. 目標の行数(最終的に何行にしたいか?)を決める。
3. 「目標 - 現在」の数だけ、行を追加する。

この「差がなくなるまで繰り返す」という考え方が、動的なプログラムの核になります。

2. 実践: 行を自動追加するコード

それでは、実際に動くコードを見てみましょう。まずは、もっとも標準的で、かつ堅牢(壊れにくい)な書き方を紹介します。

Sub AdjustTableRows()
    ' ==========================================================
    ' 目的:指定した行数に達するまで、文書内の最初の表に行を追加する
    ' ==========================================================
    
    Dim targetRows As Long    ' 目標とする行数
    Dim myTable As Table      ' 操作対象のテーブルオブジェクト
    
    ' --- 設定エリア ---
    targetRows = 10           ' 【ここを変更】最終的に何行の表にしたいか?
    ' ------------------

    ' エラーハンドリング:文書内に表がない場合に備える
    If ActiveDocument.Tables.Count = 0 Then
        MsgBox "文書内に表が見つかりません。先に表を作成してください。", vbExclamation
        Exit Sub
    End If

    ' 文書内の1番目の表を変数にセット(これが「オブジェクトの参照」です)
    Set myTable = ActiveDocument.Tables(1)

    ' --- メインロジック:条件を満たすまで繰り返す ---
    ' 「現在の行数」が「目標の行数」より小さい間、ずっと繰り返す
    Do While myTable.Rows.Count < targetRows
        
        ' 表の末尾に新しい行を追加する
        myTable.Rows.Add
        
    Loop
    ' ----------------------------------------------

    MsgBox "表の調整が完了しました! 現在の行数: " & myTable.Rows.Count, vbInformation
End Sub

コードの解説:エンジニアの視点

このコードの心臓部は `Do While … Loop` という構文です。

  • `Do While [条件]`: 「もし条件が正しい(True)間は、ずっと以下の処理を繰り返せ」という命令です。
  • `myTable.Rows.Count`: これは「テーブルの現在の行数」という数値(プロパティ)を返します。
  • `myTable.Rows.Add`: これが「行を追加せよ」というアクション(メソッド)です。

このループにより、プログラムは「今何行目かな? まだ足りない? じゃあ追加! また数え直そう……」と、目標に達するまで猛スピードで繰り返してくれます。

3. 陥りやすい「落とし穴」と回避策

初学者が現場で躓きやすいポイントがいくつかあります。これを知っているだけで、デバッグ(修正)の時間は劇的に減ります。

① 「どの表か」を指定できていない

`ActiveDocument.Tables(1)` は「文書の最初にある表」を指します。もし文書内に複数の表があり、2番目の表を操作したい場合は `Tables(2)` と書かなければなりません。
プロのアドバイス: 実務では、操作したい表に「ブックマーク」を付けておき、そのブックマークを基準に表を特定する手法がよく使われます。

② 無限ループの恐怖

もし、条件式を書き間違えて `Do While myTable.Rows.Count > targetRows` (目標より多い間繰り返す)などと書いてしまうと、行は永遠に追加され続け、Wordがフリーズしてしまいます。
回避策: ループを書くときは、必ず「いつか条件が成立して、ループが終わるか?」を指差し確認してください。

③ 書式(デザイン)が崩れる

`Rows.Add` で追加された行は、直前の行の書式を引き継ぎますが、稀に意図しない挙動をすることがあります。
対策: 行を追加した直後に、改めてセルの色やフォントを指定するコードを添えると、より完璧な自動化になります。

4. ステップアップ:もっと賢いエンジニアへ

もし、あなたが「行を増やすだけでなく、中身も自動で入れたい」と思うなら、次はこのようなアプローチを考えてみてください。

' 例:追加した行の1番目のセルに「未入力」と入れる
Dim newRow As Row
Set newRow = myTable.Rows.Add
newRow.Cells(1).Range.Text = "未入力"

このように、`Rows.Add` で作成された行を変数(`newRow`)に格納することで、追加した瞬間にその行に対して「色を塗る」「文字を入れる」といった細かい制御が可能になります。

まとめ

今回の内容を振り返りましょう。

1. 動的生成の鍵は、「現在の数」と「目標の数」の差を埋めること。
2. `Do While` ループを使えば、条件を満たすまで自動で処理を繰り返せる。
3. オブジェクト(Table)をしっかり捕まえて(Setして)操作することが、正確なコードへの近道。

Word VBAは、単なる「記録の再生」ではありません。論理(ロジック)を組み込むことで、あなたの代わりに思考し、作業する「分身」を作れる強力な武器です。

一歩ずつ、確実に。コードが思い通りに動いた時のあの快感を楽しんでください。それが、一流のエンジニアへの第一歩です。

応援していますよ!

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