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全てに設定することで、レコードを削除しても常に連番となります。

関連リンク

ページの先頭へ