みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
請求書マクロを題材にエクセル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
実行すると、イミディエイトウィンドウに以下のような出力が得られます。
ちゃんとテーブルのデータ行についてだけ、各行のアドレスが出力されていますね。
上記のコードについて解説をしていきます。
テーブルのデータ行を表すListRowオブジェクト
さて、まず説明すべきはListRowオブジェクトです。
テーブルであれば使うことができるオブジェクトで、テーブルのデータ行の一行分を表すオブジェクトです。
そして、その一行一行の集合として、ListRowsコレクションがあります。
前述のプロシージャの5行目ですが、For文の最終値として「.ListRows.Count」が指定されていますね。
ListRowsプロパティですが、これはテーブルつまりListObjectからそれに含まれる行のコレクションを取得するプロパティです。
これにより取得したListRowsコレクションに対して、Countプロパティを使うことで、その数つまりテーブルのデータ行の行数を取得することができます。
ListRowsコレクションからインデックスでListRowオブジェクトを取得する
ListRowsコレクションに対して、インデックスを指定することで、各行のListRowオブジェクトを個別に取得することができます。
前述のコードの6行目では、インデックスとしてループのカウント用変数iをインデックスとして、Rangeプロパティでそのセル範囲を取得していますね。
さらに、そのセル範囲のアドレスをAddressプロパティで取得し、イミディエイトウィンドウに出力しているということになります。
For Each~Next文も使うことができますが、ループの順番が保証されていませんので、カウント用変数iを用いたFor文を使ったほうが確実な場合が多いと思います。
まとめ
以上、エクセルVBAでテーブルのデータ行についてループ処理を行う方法についてお伝えしました。
テーブル…便利ですよね!
ListRowsコレクションを使えば、行数とか開始行や最終行の行番号を気にすることなく、ループを回すことができるわけですから。
便利です…!
次回ですが、テーブルに新たなデータ行を追加する方法についてお伝えします。
どうぞお楽しみに!
連載目次:エクセルVBAでテーブルを活用した請求書マクロを作る
エクセルのとっても便利な機能「テーブル」。VBAで操作するときも、テーブルならではの便利さを味わうことができます。請求書マクロを題材にVBAによるテーブルの操作方法をお伝えしていきます。- エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得
- エクセルVBAでテーブル名を使用してテーブルを取得する方法
- エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法
- エクセルVBAでテーブルのデータ行についてループ処理を行う方法
- エクセルVBAでテーブルのデータ行を追加して値を入力をする方法
- エクセルVBAでテーブルを走査して取引先ごとのブックを作るマクロ
- エクセルVBAでテーブル上の請求データを新規ブックに転記するマクロの作り方
- エクセルVBAで請求書作成マクロをテーブルを活用して作る
- エクセルVBAでテーブルと列挙体を組み合わせると最強のコードが書ける理由