VBAで行を削除する方法(一行・複数行)
今回の目標
この記事では、一行のみ削除する方法や、複数行を削除する方法を解説します。
また、表のレコード(行)を削除する時の注意点も解説します。
目標リスト
- 一行を削除できるようになる
- 複数行を削除できるようになる
- セルを指定して、そのセルを含む行全体を削除できるようになる
- 表のレコードを削除できるようになる
Delete メソッドについて
Rows.Delete メソッドとは
Rows.Delete メソッドは、行を削除します。
Rows プロパティで削除する行を指定し、その行に対して削除(Delete メソッド)を実行します。
例えば、Rows("2:4").Delete では、2~4行目の3行が削除され、元の5行目以降の行が3行分上にずれます(元の5行目は2行目、元の6行目は3行目になります)。
なお、行の指定は文字列で指定しますが、1行のみ削除する場合は数値で指定可能です。
Rows.Delete メソッドの構文
3行目を削除する処理です。
Rows("3").Delete
4行目から6行目を削除する処理です。
Rows("4:6").Delete
【別解】Range.Deleteメソッドで行を削除する
Range オブジェクトでも行を削除することが出来ます。
下のプログラムは、3行目を削除します。
Range("3:3").Delete
4~6行目を削除する処理です。
Range("4:6").Delete
一行を削除する
Rows の引数に、どの行を削除するかを指定します。
サンプルコード
Sub DeleteRows1()
'2行目を削除する
Rows("2").Delete
End Sub
(下の画像のようになります)
複数行を削除する
Rows の Delete メソッドを使って複数行を削除します。
Rows("開始行:終了行")の形式で指定します。
例えば、「Rows("2:3").Delete」なら、2行目から3行目を削除します。
サンプルコード
Sub DeleteRows2()
'2行目~3行目を削除する
Rows("2:3").Delete
End Sub
(下の画像のようになります)
セルが含まれる行を削除する
Range オブジェクトの EntireRow プロパティを経由してから Delete メソッドを実行することで、「そのセルを含む行全体」に対して行の削除を行えます。 例えば「Range("B1:C2").EntireRow.Delete」はセルB1~C2を含む行(1行目と2行目)の2行を削除します。
サンプルコード
Sub DeleteRows3()
'セルB1~C2 の2行(=1~2行目)を削除する
Range("B1:C2").EntireRow.Delete
End Sub
(下の画像のようになります)
表のレコードを削除する時の注意点
表のレコードを削除する
「表のある列が特定の値ならレコードを削除するプログラム」を作る場合に注意点があります。
For文などの反復文を使用して、表の上から順に特定のデータなら削除していくとしてしまうと想定と異なる処理をします。
これは、行を削除した時に行が1つ上にずれることが原因で、上にずれたレコードに対し、削除するかの処理を行えないため発生します。
これを回避するには、For文を最終行から開始しなければなりません。つまり、最終行→表の最初の行 と処理をさせます。
下のサンプルでは、表のD列が”退会”ならレコードを削除するプログラムです。
サンプルコード
Sub DeleteRows4()
Const START_ROW As Long = 3
Dim i As Long
Dim endRows As Long
endRows = Cells(Rows.Count, 2).End(xlUp).Row
'表の最下行から処理を行うこと!
For i = endRows To START_ROW Step -1
If Cells(i, 4) = "退会" Then
Rows(i).Delete
End If
Next i
End Sub
(下の画像のようになります)
誤ったプログラムにすると…
上から削除すると、削除対象が2件連続した時に残ってしまいます。
試しに、先のプログラムを上から削除するように変更してみます。
サンプルコード(正しく動きません!)
Sub DeleteRows4_BAD()
Const START_ROW As Long = 3
Dim i As Long
Dim endRows As Long
endRows = Cells(Rows.Count, 2).End(xlUp).Row
'表の上から処理しているため正しく処理しない!
For i = START_ROW To endRows
If Cells(i, 4) = "退会" Then
Rows(i).Delete
End If
Next i
End Sub
(下の画像のよう、”退会”の会員が残ってしまいます)
【Excel関数】レコードを削除しても連番にする
先のプログラムで、レコードを削除しても表のNoが常に連番になっているのは、数式の仕組みによるものです。
【=ROW()-ROW(絶対参照で表の見出しのセルを指定)】
この数式をNo全てに設定することで、レコードを削除しても常に連番となります。
