ループ処理で、1番下の行から1行ずつ判定し削除する
条件に一致する行だけを削除したい時は、ループ処理で1行ずつ判定し削除します
この時の大事なポイントは、先頭の行からではなく、最後の行から順番に処理をすることです。
先頭行から行削除がダメな理由
先頭行からループ処理で行削除を行うのがダメな理由は、先頭から行削除を行うと、行削除された行の分だけ行が上に詰まり、処理が何もされない行が発生してしまうからです。
わかりやすいように具体例で説明すると、先頭行から行の判定・削除を行っている時に5行目を削除したとします。
次にプログラムは6行目を判定・削除しようとするのですが、その時6行目にあるのは、プログラム開始時には7行目にあったデータです。(5行目が削除されたので、6行目以降は1行上に詰まってます)
そして、プログラム開始時に6行目にあったデータは5行目に移動してしまっているので、開始時に6行目にあったデータは行削除の判定・削除が行われません。
行が削除された分だけ行が上に詰まって、判定されない行が発生するってことです。
コード
サンプルコードでは、1~100行で1列目(A列)の値が×だったら、その行を削除します。
1 2 3 4 5 6 7 8 9 10 |
Dim i As Long '1~100行目を順番に判定し、1列目(A列)のセル値が×の場合に行削除する For i = 100 To 1 Step -1 If Cells(i, 1).Value = "×" Then Rows(i).Delete End If Next i |
解説
繰り返し処理のForでは、カウンタ変数iの初期値を100としStep -1としているので、処理を繰り返すごとにカウンタ変数iがマイナス1されていきます。
このカウンタ変数iを使って処理する行を指定しているので、実際の動きとしては100行目、99行目、98行目…1行目と最後の行から順番に判定・削除処理が行われます。
行削除の基本や、その他の応用テクニックは下の記事を見てください。