エクセルVBAで行を自動削除する方法!大量の空欄もラクラク処理

エクセルで不要な行を削除したいケースは多々あると思います。

例えば、webでコピーした情報をもとに自分でグラフを作りたいなんてとき、いざシートにペーストしてみると空欄の行がたくさん含まれていて、グラフが作成しづらい!と困る!というケース。

こんなときはVBA(マクロ)を使って不要な行を削除しちゃいましょう。

ループ処理と組み合わせると大量の行もラクラクに処理できちゃいますよ。

本記事では「エクセルVBAで行を自動削除する方法」を、いくつかの例を交えながら解説します。

1.こんなケースに役立ちます

こんにちは。エクセルマン・ブリーダーのしもむぎ(@re_znd13)です。

今回の記事は上の画像のようなケースに役立ちます。

このケースでは、10行までのデータのうち、3行目、4行目など空欄の行がありますね。

この空欄の行を削除するVBAを見ていきましょう。

2.単独の行を削除する方法

VBAでを削除する方法はいくつかあります。

以下の記述例では、いずれのケースでも3行目を削除することができます。

Sub 行削除1()

Rows(3).Delete  '3行目を削除

End Sub
Sub 行削除2()

Range("C3").EntireRow.Delete    'C3セルを含む行を削除

End Sub
Sub 行削除3()

Cells(3, 3).EntireRow.Delete    'C3セルを含む行を削除

End Sub

一方で、アクティブなセルを含む行を削除するという方法もあります。

以下の2ケースは、現在選択されているアクティブセルを含む行を削除します。ループ処理で役立ちますね。

Sub アクティブな行の削除1()

Rows(ActiveCell.Row).Delete     '現在のセルを含む行を削除

End Sub
Sub アクティブな行の削除2()

ActiveCell.EntireRow.Delete    '現在のセルを含む行を削除

End Sub

3.複数行を削除する方法

複数の行を削除する方法も見てみましょう。

いずれのケースでも、3、4行目を削除することができます。

Sub 複数行削除1()

Rows("3:4").Delete  '3、4行目を削除

End Sub
Sub 複数行削除2()

Range("C3:C4").EntireRow.Delete    'C3、C4セルを含む行を削除

End Sub

4.ループ処理との組合せ

いよいよループ処理との組合せです。

ループ処理をする際には

  1. 最終行に移動
  2. 条件に合えば行を削除
  3. 1行目でなければひとつ上の行に移動

という手順で、2と3をループさせます。

「最終行に移動」が肝になります。

例えば3行目を削除したらもともとの4行目が繰り上がって3行目になりますよね。

上から下へ行を見ていくよりも、まず最も下の行に移動し下から上へ処理をしていきます。

以下のコードを見てください。

A列の最終行へ移動するには、「Rows.Count」でそのシートの最終行数(1048576行)を取得し、A列最終セル(A1048576セル)からデータの入っている終端セルまで「End(xlUp)」で移動することで実現できます。

A列終端セルへ移動したら、そのセルの行番号をiとして取得し、1行目へ向かって上へ移動しながらループ処理を行ないます。

ここではA列の該当行が空欄の場合に行削除を行なっています。

Sub ループで行削除1()
Dim i As Integer

Cells(Rows.Count, 1).End(xlUp).Select   'A列の最終行へ移動
i = ActiveCell.Row                      '行番号を取得

Do Until i = 1                          '1行目に到達するまでループ
    If Cells(i, 1) = "" Then            'A列の該当行が空欄であれば
        Rows(i).Delete                  '該当行を削除
    End If
    i = i - 1                           '行番号をマイナス1して上へ移動
Loop

End Sub

以下のコードでも、上記コードと同じ処理を行えます。

この例では、アクティブセルをオフセット関数で上へ移動しながら、A列の該当行が空欄であれば行削除をさせています。

Sub ループで行削除2()
Dim i As Integer

Cells(Rows.Count, 1).End(xlUp).Select   'A列の最終行へ移動

Do Until ActiveCell.Row = 1             '1行目に到達するまでループ
    If ActiveCell = "" Then             'A列の該当行が空欄であれば
        ActiveCell.EntireRow.Delete     '該当行を削除
    End If
    ActiveCell.Offset(-1, 0).Select     '行方向にマイナス1オフセットして上へ移動
Loop

End Sub

実行結果は次のようになります。空欄の行がすべて削除されました。

5.こんなこともできます(派生アイデア)

第4章の結果のあとに、代表者が田中さんの行を削除したり、人数が20人未満の行を削除したりということもできます。

代表者が田中さんの行を削除するコードは以下です。

B列に「田中」という文字列を含む場合に行を削除します。

文字列を含むかどうかはLike演算子とワイルドカード(*)を用いて実現しました。

Sub ループで行削除_田中さんの行を削除()
Dim i As Integer

Cells(Rows.Count, 1).End(xlUp).Select       'A列の最終行へ移動
i = ActiveCell.Row                          '行番号を取得

Do Until i = 1                              '1行目に到達するまでループ
    If Cells(i, 2).Value Like "*田中*" Then 'B列に田中という文字列を含めば
        Rows(i).Delete                      '該当行を削除
    End If
    i = i - 1                               '行番号をマイナス1して上へ移動
Loop

End Sub

この結果は次のようになります。

代表者が佐藤さんと鈴木さんの行だけ残すことができました。

人数が20人未満の行を削除するコードは以下です。

C列の該当行が20未満の場合に行を削除します。

Sub ループで行削除_20人未満の行を削除()
Dim i As Integer

Cells(Rows.Count, 1).End(xlUp).Select   'A列の最終行へ移動
i = ActiveCell.Row                      '行番号を取得

Do Until i = 1                          '1行目に到達するまでループ
    If Cells(i, 3).Value < 20 Then      'C列の該当行が20未満であれば
        Rows(i).Delete                  '該当行を削除
    End If
    i = i - 1                           '行番号をマイナス1して上へ移動
Loop

End Sub

この結果は次のようになります。

人数が20人以上の行だけ残すことができました。

本章では第4章のコードのあとに続けて実行するコードを紹介しましたが、if文の条件をANDなどで工夫してひとつのコードで実現することもできます。

6.まとめ

この記事では「エクセルVBAで行を自動削除する方法」を解説しましたが、いかがでしたか?

数百行、数千行というデータの中にあるはずの任意の行を削除したいという場合に大活躍すると思いますよ。

ぜひ活用してくださいね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です