エクセルVBAでテーブルのデータ行についてループ処理を行う方法


みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

請求書マクロを題材にエクセルVBAでテーブル操作する方法をお伝えしています。

前回の記事はコチラ。

エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法
エクセルVBAで請求書作成マクロを題材としてテーブルを操作する方法をお伝えしています。今回は、VBAから見たテーブルの構造を確認すべく、テーブルの見出し行・データ行・集計行の範囲の取得をする方法をお伝えします。

テーブルの見出し行、データ行、集計行について各セル範囲を取得する方法をお伝えしました。

さて、テーブルのデータ行ですが、追加・削除をしても可変で管理されているということですが、各行についてループ処理を行いたいときはどうすればよいでしょうか?

今回は、エクセルVBAでテーブルのデータ行についてループ処理を行う方法についてお伝えしていきます。

では、行ってみましょう!

スポンサーリンク

題材とするテーブルと今回の目標

以下のようなシートとテーブルがあったとします。

題材とするシートとテーブル
シートは「データ」シートで、そのオブジェクト名はwsDataとします。

テーブルは「請求データ」というテーブル名をつけているとします(もうひとつありますが、今回は置いておいてください汗)。

その場合、以下のようにして、テーブル「請求データ」をListObjectオブジェクトとして取得することができます。

wsData.ListObjects("請求データ")

さらに、以下のようにすることで、データ行の範囲を取得することができる、というのは前回お伝えしたとおりですね。

wsData.ListObjects("請求データ").DataBodyRange

ただ、このようにして得られるのはセル範囲、つまりRangeオブジェクトですね。

開始行と最終行の行数を調べて、For文を使って…って、ちょっと面倒な感じです。

ですが、テーブルならもっと簡単にループが回せるんです。

テーブルのデータ行についてループを回すプロシージャ

さて、テーブルのデータ行についてループを回す例として、以下のようなプロシージャを作成してみましょう。

Sub テーブルの行の操作()

With wsData.ListObjects("請求データ")
    Dim i As Long
    For i = 1 To .ListRows.Count
        Debug.Print .ListRows(i).Range.Address
    Next i
End With

End Sub

実行すると、イミディエイトウィンドウに以下のような出力が得られます。

VBAでテーブルのデータ行のアドレスをデバッグ出力

ちゃんとテーブルのデータ行についてだけ、各行のアドレスが出力されていますね。

上記のコードについて解説をしていきます。

テーブルのデータ行を表すListRowオブジェクト

さて、まず説明すべきはListRowオブジェクトです。

テーブルであれば使うことができるオブジェクトで、テーブルのデータ行の一行分を表すオブジェクトです。

そして、その一行一行の集合として、ListRowsコレクションがあります。

前述のプロシージャの5行目ですが、For文の最終値として「.ListRows.Count」が指定されていますね。

ListRowsプロパティですが、これはテーブルつまりListObjectからそれに含まれる行のコレクションを取得するプロパティです。

ListObjectオブジェクト.ListRows

これにより取得したListRowsコレクションに対して、Countプロパティを使うことで、その数つまりテーブルのデータ行の行数を取得することができます。

ListRowsコレクション.Count

ListRowsコレクションからインデックスでListRowオブジェクトを取得する

ListRowsコレクションに対して、インデックスを指定することで、各行のListRowオブジェクトを個別に取得することができます。

ListRowsコレクション(インデックス)

前述のコードの6行目では、インデックスとしてループのカウント用変数iをインデックスとして、Rangeプロパティでそのセル範囲を取得していますね。

ListRowオブジェクト.Range

さらに、そのセル範囲のアドレスをAddressプロパティで取得し、イミディエイトウィンドウに出力しているということになります。

For Each~Next文も使うことができますが、ループの順番が保証されていませんので、カウント用変数iを用いたFor文を使ったほうが確実な場合が多いと思います。

まとめ

以上、エクセルVBAでテーブルのデータ行についてループ処理を行う方法についてお伝えしました。

テーブル…便利ですよね!

ListRowsコレクションを使えば、行数とか開始行や最終行の行番号を気にすることなく、ループを回すことができるわけですから。

便利です…!

次回ですが、テーブルに新たなデータ行を追加する方法についてお伝えします。

エクセルVBAでテーブルのデータ行を追加して値を入力をする方法
請求書作成マクロを題材としてエクセルVBAでテーブルを操作する方法についてお伝えするシリーズです。今回は、テーブルのデータ行を追加して値を入力をする、Addメソッドの使い方をお伝えしていきますね。

どうぞお楽しみに!

連載目次:エクセルVBAでテーブルを活用した請求書マクロを作る

エクセルのとっても便利な機能「テーブル」。VBAで操作するときも、テーブルならではの便利さを味わうことができます。請求書マクロを題材にVBAによるテーブルの操作方法をお伝えしていきます。
  1. エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得
  2. エクセルVBAでテーブル名を使用してテーブルを取得する方法
  3. エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法
  4. エクセルVBAでテーブルのデータ行についてループ処理を行う方法
  5. エクセルVBAでテーブルのデータ行を追加して値を入力をする方法
  6. エクセルVBAでテーブルを走査して取引先ごとのブックを作るマクロ
  7. エクセルVBAでテーブル上の請求データを新規ブックに転記するマクロの作り方
  8. エクセルVBAで請求書作成マクロをテーブルを活用して作る
  9. エクセルVBAでテーブルと列挙体を組み合わせると最強のコードが書ける理由

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