【Excel VBA】ListObjectでExcelテーブルに新しい行を追加する方法|ListRows.Addの使い方
みなさんこんにちは。
Excel VBAで商品一覧や管理台帳にデータを追加するとき、Excelの「テーブル」を使用していて、どのように行を追加すればよいか迷った経験をしたことがある方も多いかと思います。
今回は、ListObjectとListRows.Addを使ってテーブルの末尾に行を追加し、値を設定する方法についてご紹介したいと思います。
今回使用するExcelテーブル
まずSheet1のA1~C4に次のデータを入力してください。
| 商品コード | 商品名 | 在庫数 |
|---|---|---|
| A001 | りんご | 12 |
| A002 | みかん | 8 |
| A003 | ぶどう | 5 |
A1~C4を選択してCtrl + Tを押し、「先頭行をテーブルの見出しとして使用する」にチェックを入れて作成します。その後、「テーブル デザイン」タブの「テーブル名」をtblProductsに変更してください。通常のセル範囲のままでは、今回のコードは動作しません。

ListObjectを取得して新しい行を追加する
Alt + F11から標準モジュールを追加し、以下のコードを入力してください。マクロを有効にしてブックを.xlsm形式で保存します。
Option Explicit
Sub AddProductTableRow()
Dim ws As Worksheet
Dim tbl As ListObject
Dim newRow As ListRow
' 対象のワークシートとテーブルを取得する
Set ws = ThisWorkbook.Worksheets("Sheet1")
Set tbl = ws.ListObjects("tblProducts")
' テーブル末尾に1行追加して、追加行を取得する
Set newRow = tbl.ListRows.Add
' 追加した行に商品データを設定する
With newRow.Range
.Cells(1, 1).Value = "A004"
.Cells(1, 2).Value = "いちご"
.Cells(1, 3).Value = 25
End With
MsgBox "テーブルに1行追加しました。", vbInformation
End Sub

コードのポイント
ws.ListObjects("tblProducts")は、シート内のテーブル名を指定して取得する処理です。シート名とテーブル名は異なるので、設定した名前に合わせてください。
Set newRow = tbl.ListRows.Addでテーブル末尾に1行が追加され、戻り値のListRowから追加した行を操作できます。newRow.Range.Cells(1, 1)は、追加行の1列目(商品コード)を表します。
追加した行の実行結果
AddProductTableRowを実行すると、テーブルに「A004/いちご/25」が追加されます。もとの3件に加えて4件のデータになれば成功です。

実務で使用するときの注意点
ListRows.Addは実行するたびに1行追加するため、繰り返し実行すると同じ商品コードが増えます。また、テーブルの下に別のデータがある場合は、そのセルが下へ移動することがあります。
空白行がある場合に不要なセル移動を避けたいときは、tbl.ListRows.Add(AlwaysInsert:=False)も指定できます。ただし、テーブル直下にデータがあれば下へ移動するため、事前に確認してください。
最後に
いかがでしたでしょうか。今回は、ListObjectでテーブルを取得し、ListRows.Addで新しい行にデータを設定する方法をご紹介しました。セル範囲への直接書き込みとは違い、テーブルの範囲に含めて行を追加できるのが便利ね。少しでも参考になれば幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
業務の流れをまるごと自動化します Excel・Web・Teams・SaaSで業務全体を自動化Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
