Excel VBA テーブルの行を追加(挿入)/削除する

テーブル操作第7回目です。VBAでテーブルのデータ行を追加したり、削除したりする方法について解説します。

くるみこ
くるみこ

前回は「列」でしたが、今回はテーブル内の「行」を削除したり追加(挿入)したりする操作について勉強していきましょう(^^)/

わかりました! よろしくお願いしますm(_ _)m

【この記事でわかること
・テーブル内の不要なデータ行を削除する方法がわかります
・テーブル内にデータ行を追加(挿入)する方法がわかります

前回記事のおさらいは、下のカードをクリックすれば開きます(^^ゞ

くるみこ
くるみこ

前回記事は、テーブルを「列」を追加(挿入)・削除する方法の解説記事でした。覗いてみてね(^^)/

テーブルのデータ行を追加(挿入)/削除する

行は ListRowオブジェクトで、行(ListRow)の集合体ListRowsコレクションのメンバーです。ListRowsコレクションを取得するのには、ListObjectオブジェクトのListRowsプロパティやメソッドを使います。

行を追加する方法

・テーブルのデータ行に新しい行を追加するには、ListRowsコレクションオブジェクトのAddメソッドを使います。ListRowsに用意されているメソッドは「Add」だけです。

'アクティブなテーブルのデータ行に行を追加する
Sub AddRowTable01()
    ActiveSheet.ListObjects(1).ListRows.Add
End Sub

・実行結果は、テーブルの最下行に新しい行が追加されます。
・ListRows.Addメソッドの引数を指定しない場合は、データ行の最下部に追加されます。

行を挿入(追加)する

・次のコードは、アクティブシートの1番目のテーブルの、データ行の先頭に行を追加したい場合は、ListRows.Addメソッドに引数「Position:=n」をつけて行を指定することができます。

'テーブルに行を追加挿入する
Sub AddRowInsertTable01()
    ActiveSheet.ListObjects(1).ListRows.Add Position:=1
End Sub

・ListRows.Addメソッドの引数「Position:=1」は1行目に追加するという意味です。
・この引数名表記「Position:=」は「Add 1」又は「Add(1)」ように省略できます。
・行が追加されるとそれ以降の列は「下」にずれることになります。

行追加と同時にデータを代入する

・行追加と同時にデータを代入してみましょう。
・アクティブシートのテーブル(1)の、データ行1行目に行を追加してデータを入力します。

'テーブルのデータ行1行目に行を追加挿入してデータを代入
Sub AddRowInsertTable02()
    With ActiveSheet.ListObjects(1)
        .ListRows.Add (1)           '行の追加(挿入)
        With .ListRows(1)
            .Range(1) = "テスト入力"
            .Range(2) = "9999"
            .Range(3) = "8888"
        End With
    End With
End Sub

・上のGIF画像は、コードをステップ実行した様子です。
・追加した行の1列目は「Range(1)」です。2列目は「Range(2)」となっています。
・それそれのセルにデータを代入していけばOKです。

テーブル真下セルにデータ入力して行を追加する

手動でテーブルに隣接したセルにデータを入力すると、Excelが勝手(自動的)にテーブルの範囲を拡張してくれます(されてしまいます)。
VBAマクロでも、テーブルの真下のセルにデータを入れると、自動的にテーブル範囲が拡張されるのでそれを利用してみます。

'テーブルの真下にデータ入力して行を追加する
Sub AddRowTable03()
    Dim n As Long
    With ActiveSheet.ListObjects(1).ListColumns(1)
        n = .Range.Count
        .Range(n + 1).Value = "テスト入力"
    End With
End Sub

・.Range.Count で1列目の行数を取得します。
・取得した行数 +1 でテーブル真下のセルにデータを入力しています。
・入力と同時にテーブルが拡張されたのが、GIF画像で確認いただけると思います。
・「列」の解説では紹介しませんでしたが、同じように最後尾の列に隣接したセルに入力するとテーブルの範囲が拡張されて列が追加されます。

行を削除する

テーブルのデータ行は、ListRowオブジェクトの Deleteメソッドで削除できます。

テーブルの指定行を削除するサンプル

先頭列(1行目)を削除します
'テーブルのデータ行を削除する
Sub DelRowTable()
    ActiveSheet.ListObjects(1).ListRows(1).Delete
End Sub

・行番号を指定して削除する例です。サンプルは先頭行(1行目)を指定しています。
・2行目ならば ListRows(2) です。当然、無い番号を指定するとエラーになります。

消したいデータ行をフィルタで抽出して削除する
'消したいデータをフィルタで検索抽出してデータ行を削除する
Sub DelRowNameTable()
    With ActiveSheet.ListObjects(1).DataBodyRange 'データ領域
        .AutoFilter Field:=1, Criteria1:="18" '「引数名:=」は省略可能
        .EntireRow.Delete   '抽出された行を全て削除
        .AutoFilter
    End With
End Sub

・テーブルのデータ行を削除するならサンプルのように、フィルタで抽出して削除するのが効率的です。複数抽出されれば複数列を同時に削除できます。
・ただし、検索抽出を誤ると消したくないデータも削除してしまうことになるので注意が必要です。

最終行を削除する

・行の削除は、列の時とほとんど同じです。ListColumnsListRows に変えただけです。

'最終列を削除するコード3種類

'最終列削除_変数を利用する
Sub DelRowsCountTable_01()
    Dim n As Long
    With ActiveSheet.ListObjects(1)
        n = .ListRows.Count
        .ListRows(n).Delete
    End With
End Sub
'最終列削除_Countを利用する
Sub DelRowsCountTable_02()
    With ActiveSheet.ListObjects(1)
      .ListRows(.ListRows.Count).Delete
    End With
End Sub
'最終列削除_Count_Itemを利用する
Sub DelRowsCountTable_03()
    With ActiveSheet.ListObjects(1).ListRows
        .Item(.Count).Delete
    End With
End Sub

・アクティブなシートの一つ目のテーブルの最終行を削除するコードです。
・VBA実行時の最終行を削除する場合は、行数が変更されている可能性を考慮して考えます。
・「カウントした行数」=「最終行番号」なので ListRows.Count で求めて利用します。

・1つ目のサンプルは、行カウント数を変数に代入して削除行番号に利用するコードです。
・2つ目は、行指定部分で直接カウント値を代入する方法のコードです。
・3番目は、ListObjectsのプロパティItemでカウント値をインデックスで受け取るコードです。
動作は全て同じですのでどれを使っても良いでしょう

スポンサーリンク

まとめ(おわりに)

・いかがでしたでしょうか?
「いつも汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーを念頭に記事を書いています。
・今回も、記事内で使用したコードのサンプルファイルを登録していますのでご利用ください。
今までの記事のサンプルも登録していますのでよろしければお使いください(^^)

まとめと感想など

くるみこ
くるみこ

テーブルのデータ行操作について「Add」と「Delete」の解説でした。テーブル真下のセルにデータ入力して行を追加する方法も解説しました。
これで行追加と削除の方法はわかりましたか?

テーブルに隣接するセルにデータ入力して追加する方法は、列の場合にも適用できるんですね。しっかり覚えておきます!

くるみこ
くるみこ

テーブル操作8回目は、前回お預けにした「列」にデータを代入する方法について解説したいと思います(^^)

【今回分かったことは】
・テーブルのデータ行を操作する
 「テーブル内にデータ行を追加・挿入する方法」
 「テーブルのデータ行を削除する方法」
・テーブルの最終行削除は行数をカウントして実行します


ブログランキングに参加しています(^^) 応援よろしくお願いしますm(_ _)m

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にもご期待ください(^^)/

記事のサンプルファイルをダウンロードできます

今回の記事のサンプルをダウンロードできるようにしています
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください