Excelの表を使って何かを管理していれば、行を追加、挿入、あるいは削除することは多々あるものです。
場合によっては、そういった操作が面倒に感じることもあるでしょう。
そんな面倒な操作をマクロにやってもらうことで、効率を上げることができます。
今回は、Excel VBA、下のメソッドに焦点を当てていきます。
- Rows.Deleteメソッド
- Range.Deleteメソッド
この2つのメソッドは行を削除する時に使います。
それではExcel VBAで行を削除する方法について解説していきます。
指定した1行を削除する
ある特定の行を指定して行を削除する場合は、Rows.Deleteメソッドを使います。
以下の例をご覧ください。
ActiveSheet.Rows(2).Delete
今選択しているアクティブなシートの2行目を削除している処理になります。
Rowsの後のカッコの中に処理対象「行」を指定してあげましょう。
Range.Deleteメソッドでも処理できます。
以下の例は、Rangeを使った場合です。
ActiveSheet.Range("A2").EntireRow.Delete
Rangeを使う場合は、ちょっと書き方が変わります。
こちらは、Range(“A2”)と指定して、そのセルA2を含む全体行を削除するという意味になります。
先ほどのRows.Deleteメソッドの例と全く同じ処理ですが、Range(“A2”)の後にEntireRow.Deleteと書いてあげないといけません。
同じ処理で2パターンを紹介しましたが、Rows.Deleteメソッドの方が簡単ですし、他の人が見てもわかりやすいコードになると思います。
範囲指定して複数行を削除する
範囲を指定して複数行を削除する場合は、Rows.Deleteメソッド、Range.Deleteメソッド、両方とも同じような書き方ができます。
とは言っても、先ほどの1行を削除する処理とは書き方がちょっと違いますので注意が必要です。
以下の例をご覧ください。
ActiveSheet.Rows("2:5").Delete
Rows.Deleteメソッドを使って、2行目から5行目までを一気に削除しています。
注意したいのはカッコの中、ダブルクォーテーション(”)で囲っているところと行をコロン(:)でつないでいるところです。
1行だけを指定して削除する場合は、ダブルクォーテーション(”)は不要でした。
複数行を指定する場合は、ダブルクォーテーション(”)が必要なんですね。
以下はRange.Deleteメソッドの例になります。
ActiveSheet.Range("2:5").Delete
こちらも、2行目から5行目までを一気に削除する処理です。
カッコの中の書き方はRows.Deleteメソッドと同じです。
複数行を指定して削除する場合は、どちらのメソッドも書き方は同じですので、どちらを使ってもいいと思います。
1行だけ削除する解説で出てきたEntireRow.Deleteを使った例を、念のため挙げておきます。
ActiveSheet.Range("A2:A5").EntireRow.Delete
上の例のようにすれば、2行目から5行目までを一気に削除できます。
【実践編】指定した行を削除
今まで、行を削除する方法について見てきましたが、ここでは実践に近い例を挙げながら解説していきたいと思います。
まず、以下のようなシート(シート名は「Sheet」)を作ったとします。

セルB1(オレンジ色のセル)には、削除したい行を入力することができ、このセルに入力した数値(行)に基づいて、表中の行を削除することができるようにします。
「標準モジュール」に以下のようなマクロを作成してみました。
Public Sub Macro()
Dim TargetRow As Long
With ThisWorkbook.Sheets("Sheet")
TargetRow = .Range("B1").Value
.Rows(TargetRow + 2).Delete
End With
End Sub
Long型の「TargetRow」という変数を用意。
セルB1の値を「TargetRow」という変数に入れています。
実際はセルB1の値に対し、「空白かどうかのチェック」や「数値かどうかのチェック」などの処理を追加した方がよいのでしょうが、今回は割愛させていただきます。
セルB1に必ず数値が入力されていることを前提として説明を進めていきます。
行の削除は、Rows.Deleteメソッドを使います。
ここで、Rowsのカッコ内に注意してください。
実際に削除する行は表中の行になりますので、この例の場合、2行追加してあげないと表中の行となりません。
例えば、B1に「3」が入力された場合、表中の「ID」3の行を削除したいわけですから、実際に削除するのは5行目ということになります。
ですから、「TargetRow + 2」行目を削除するということになるのです。
以下はこのマクロを実行した後の表になります。

表中「ID」3の行が削除されています。
今回は、セルに削除する行を入力させる形を取りましたが、フォームに入力させる形にしても面白いでしょう。
【実践編】まとめて行を削除
以下のようなシート(シート名は「Sheet」)を作ったとします。

マクロでこのシートの表の行をすべて削除してみましょう。
表の最初の行が2行目ですので、そこから最終行までを削除します。
「標準モジュール」に以下のようなマクロを作成してみました。
Public Sub Macro()
Dim LastRow As Long
With ThisWorkbook.Sheets("Sheet2")
LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
.Rows("2:" & TargetRow).Delete
End With
End Sub
変数「LastRow」には最終行が入っています。
最終行を取得する方法については、以下のリンクをご参照ください。

作成したシートの表は8行ですが、追加したり削除したりして、行数が変動することを前提としています。
そういった理由から以下のような書き方をしているのです。
LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
そして、「Rows(“2:” & TargetRow).Delete」で行を削除しています。
Rowsのカッコ内は、文字列を連結する形で行の範囲を指定しています。
このRowsのカッコ内の書き方さえ、注意できればそれほど難しくはないでしょう。
マクロ実行後の表は以下のようになります。

もちろん、Range.Deleteメソッドでも処理できますので、Range.Deleteメソッドに書き換えて、理解を深めてください。
こういった処理を組み込んで、「ボタンをクリックした時にすべての行を削除して表をクリアにする」なんていう機能を作ってみるといいかもしれませんね。
まとめ
今回は、Rows.Deleteメソッド、Range.Deleteメソッドを使って行を削除する方法について解説しました。
さほど難しくはありませんので、早速、ご自身で工夫しながら使ってみてください。
面倒な操作はマクロでどんどん自動化して、仕事を効率化させてしまいましょう。
最後まで、お付き合いいただき、ありがとうございました。