[VBA] 離れた行を削除する方法

今回は、ExcelVBAコードで「離れた行を削除する方法」を紹介します。

ExcelVBAで離れた行を削除する方法について、
実は、初心者の方によく質問されることが多い質問のひとつなんです。
理解できれば簡単ですが、意外と最初は発想に辿りつかないことがあるみたいですね。
「え、それだけですか?!」という反応をしていただけることが多いです(笑)

初めは、自分で離れた行を削除するVBAコードを書いてやってみるものの、違う行が消されていたり、その結果を見て複雑なコードを書いてしまったりする人が多くいるので、ぜひ、参考になれば嬉しいです。

離れた行とは?

離れた行とは、下記の画像のように「りんご」の行が離れているような状態の表をイメージしてください。


選択されている行(グレーになっている行)を見ると4行目、6行目、10行目と行が離れていますよね。
この表を例題に「りんごの行だけを消す方法」を、今回は2つ紹介します。

For~NextでStep-1を使う

離れた行を削除するひとつめの方法は、
行を順番に処理していく、For~Nextのループ処理を使うのですが、上から順(2行目~最終行に向かって)に処理していくのではなく、下から順(最終行~2行目に向かって)に処理を行っていきます。

Sub りんごの行を消す

Dim i As Long

  For i = 11 to 2 Step -1

    If Cells(i, 2) = "りんご" Then
      Rows(i).Delete '---対象の行を削除
       End If
  Next

End Sub


コード自体は、上記のようにかなり簡単な記述で離れた行を削除することができます。

ポイントは、「Step -1」を使って最終行から上に向かって離れた行を消していくという方法です。

この発想を頭に入れておくと、ExcelVBAの視野がもっと広がって色々な操作ができるようになるので、ぜひ試してみてください。

※Step-1の詳しい説明はこちら

Selectを使ってまとめて削除

離れた行を削除するふたつめの方法としては、
Select関数を使って、選択された行をまとめて削除する方法があります。

下記のように、離れた行を順にSelect関数で選択していき、選択された行をまとめて削除します。

ひとつめに紹介した離れた行を削除する方法の方が記述は簡単なのですが、
こちらは、大量にデータ行がある場合に使うのがポイントです。


削除対象がたくさんある場合に、一行ずつ削除をしていくと、かなりの処理時間を要するため、大量にデータがある場合は、まとめて削除して処理時間を短縮していきましょう。

Sub りんごの行を消す

Dim i As Long
Dim SelectCnt As Long

  SelectCnt = 0

  For i = 11 to 2 Step -1

    If Cells(i, 2) = "りんご" Then

      SelectCnt = SelectCnt +1

      If SelectCnt = 0 Then
        Rows(i).Select
      Else
        '---今選択されている行に追加で選択する
               Application.Union(Selection, Rows(i)).Select
      End If
       End If
  Next

  '---選択されているものがあれば選択されている行をまとめて削除
  If Selection > 0 Then
    Selection.Delete
  End If

End Sub


上記のように、条件に当てはまるものがあれば、順に選択を行って、最後でまとめて削除するという方法があります。

ポイントは、「削除対象のものがあったのかなかったのか」というところと、選択されている行が消されてしまうので、最初に選択される行は、Selectだけで選択するようにするところです。

今回紹介した2つは、データ行数で使い分けをしてみましょう。ぜひ、ご参考になれば嬉しいです。