こんにちは、Ryoです。
Excelの便利な機能「テーブル」は、データをまとめてくれるので扱いやすく、表の管理も楽になるので使用する頻度も高いと思います。今回はそのテーブルの行を取得したり、新たな行追加や削除などをVBAで行う方法について書いていこうと思います。
1.リストの行を取得
◆サンプル概要
シート名「Sample」上に以下画像のテーブルがあるとします。そのテーブルの3行目のデータを取得してメッセージボックスに表示します。
サンプルコードを実行すると、リスト3行目のデータを取得して以下の通りメッセージボックスで表示します。
◆サンプルコード
Sub Sample1() 'リストの行を取得する Dim DtA, Tx As Variant Dim a, b As Long '「テーブル1」の3行目を2次元配列データとして取得する DtA = Worksheets("Sample").ListObjects("テーブル1") _ .ListRows(3).Range 'または、DtA = Range("A4").ListObject.ListRows(3).Rangeでも可 '取得した2次元配列データを変数Txにまとめるので '先ず配列DtA1次元側の最小値(LBound)/最大値(UBound)を取得 For a = LBound(DtA, 1) To UBound(DtA, 1) '次に配列DtA2次元側の最小値/最大値を取得し 'それぞれFor~Nextループ処理を行う For b = LBound(DtA, 2) To UBound(DtA, 2) '取得したデータを都度改行して変数Txに上書き Tx = Tx & DtA(a, b) & vbCrLf Next b Next a 'メッセージボックスで表示 MsgBox Tx End Sub
このようにテーブルリストの行を取得するにはListRowsプロパティを使用します。
構文:オブジェクト.ListRows(index)
ListRowsプロパティは、テーブル内の行を表すListRowsコレクションを取得するもので、index番号を指定すると単独のListRowオブジェクトを取得することができます。
このサンプルでは「Sample」シートに作成してある「テーブル1」の中にある3行目のデータを取得し、そのデータをメッセージボックスで表示させるものです。
データをまとめて取得するので、DtA = Worksheets(“Sample”).ListObjects(“テーブル1”) _
.ListRows(3).Rangeとすることで2次元配列データとして変数に格納されます。
取得した2次元配列データ全てに対して処理を行う場合の一例として、LBound/UBoundを用いたループ処理を行っており、このように記述しておけばデータ数増減に対して柔軟に対応することができます。
後は取得したデータを変数Txに開業しながら上書きしていくことで、メッセージボックスで一覧表示のような形にしています。
For a = LBound(DtA, 1) To UBound(DtA, 1)
For b = LBound(DtA, 2) To UBound(DtA, 2)
Tx = Tx & DtA(a, b) & vbCrLf
Next b
Next a
MsgBox Tx
◆参考:リストの行(データ)を入れ替え
上のサンプルでリストの行データを2次元配列で取得しましたが、指定した行のデータを入れ替えたい場合は以下のような記述で対応することもできます。
では、テーブル1の3行目と4行目について入れ替えを行ってみます。
≪実行前≫
≪実行後≫
≪サンプルコード≫
Sub データ入れ替え() Dim DtA, DtB As Variant With Worksheets("Sample").ListObjects("テーブル1") DtA = .ListRows(3).Range DtB = .ListRows(4).Range '配列データとして取り込んだら、逆の手順で 'それぞれのデータを上書きしていく .ListRows(3).Range = DtB .ListRows(4).Range = DtA End With End Sub
このサンプルは一例ですが取り込んだデータを逆の手順で上書きするだけなので、入れ替えたい各行が明確であれば、簡単にデータを入れ替えることができます。
2.リストの行を削除
◆サンプル概要
次にリストの行削除を行いますので、同様のテーブル1から3行目を削除してみます。
≪実行前≫
≪実行後≫
◆サンプルコード
Sub 行削除1() With Worksheets("Sample").ListObjects("テーブル1") .ListRows(3).Delete '3行目を削除 End With End Sub
上に書いた「行を取得する」構文と同じで、最後にDeleteメソッドをしようして行削除を行うものです。
また、他にも以下のようにオートフィルター機能を使用して削除する方法もあります。
Sub 行削除2() With Worksheets("Sample").ListObjects("テーブル1").DataBodyRange .AutoFilter 2, "Cさん" .EntireRow.Delete .AutoFilter 2 End With End Sub
これはテーブルらしくオートフィルター機能を使って、削除したい項目をテーブル2列目の氏名欄(サンプルではCさん=3行目)を抽出し、その抽データを.EntireRow.Deleteで削除、その後AutoFilter 2再度指定することでフィルター解除=元に戻すという方法なので、用途に応じて使い勝手の良い処理を選択すれば良いと思います。
3.リストの行を追加(挿入)
◆サンプル概要
これまで使用してきたサンプルのリスト最終行に「項番:1027」「氏名:AAさん」を追加(挿入)してみます。
≪実行前≫
≪実行後≫
このように最終行に追加(挿入)されています。画像の黄色の塗りつぶしは処理で行挿入されたことを視覚的に表現しているものです。
◆サンプルコード
Sub 最終行に追加() Dim n As Long With Worksheets("Sample").ListObjects("テーブル1") .ListRows.Add '行の追加(挿入) n = .ListColumns(1).Range.Count .ListColumns(1).Range(n) = "1027" .ListColumns(2).Range(n) = "AAさん" End With End Sub
テーブルに新しい行を追加(挿入)する場合はAddメソッドを使用します。この場合はListRows.Addとすることで最終行に追加されます。
次にテーブル1列目のセル数をカウントするには.ListColumns(1).Range.countでCountプロパティを使用することで数えることができます。
そのカウントした数が一番したのセルで、先程Addメソッドを使用して追加した場所なので、その1列目(項番)に”1027″(.ListColumns(1).Range(n) = “1027”)、2列目(氏名)にAAさん( .ListColumns(2).Range(n) = “AAさん”)を指定して書込んでいる内容になります。
このサンプルはAddを使用しているので行の追加時に新たな行として挿入されますが、ただ末尾に追加していきたいだけの場合は次のようにAddメソッドを使用せず、カウントデータに+1すればOKです。
Sub 最終行に追加2() Dim n As Long With Worksheets("Sample").ListObjects("テーブル1") n = .ListColumns(1).Range.Count .ListColumns(1).Range(n + 1) = "1027" .ListColumns(2).Range(n + 1) = "AAさん" End With End Sub
4.まとめ
テーブル機能は便利なので利用することも多いですから、そのテーブルを維持・管理していく上で人の手間を出来る限り省く為にVBAで処理を追加していきたいことも多々あるかと思います。
今回問合せなどもあり、その中で扱うことが多いと思われる「データ取得」「行追加」「行削除」について書いてみましたので、本記事が何かの参考になれば幸いです。
Ryo