Sub TEST1()
'最終行から2行目までをループ
For i = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1
'C列が「0」の場合
If Cells(i, "C") = 0 Then
Rows(i).Delete '行を削除
End If
Next
End Sub
では、実行してみます。
最終行から上にループしていきます。
C列の値が「0」である行を削除できます。
上にループしていって、C列の値が「0」である行を削除できます。
さらに上にループしていって、C列の値が「0」である行を削除できます。
これで、C列が「0」である行を削除できます。
C列が「0」の行を削除できた
C列が「0」である行を削除できました。
最初の行からループすると削除できないので注意
上から下にループして削除すると、うまく削除できないので注意です。
上から下にループして削除してみます。
上から下にループして削除してみる
うまく削除ができないVBAコードになります。
Sub TEST2()
'2行目から最終行までをループ
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
'C列が「0」の場合
If Cells(i, "C") = 0 Then
Rows(i).Delete '行を削除
End If
Next
End Sub
VBAコードを実行してみます。
削除できない
C列が「0」である行をうまく削除できません。
なので、セルをループして削除したい場合は、最終行から上にループして削除するようにしましょう。
フィルタ結果を削除して条件に一致した行を削除
フィルタ結果を削除して条件に一致した行を削除する、という方法で削除してみます。
オートフィルタで削除したい値でフィルタして、フィルタ結果を削除するという感じです。
オートフィルタでフィルタして削除
オートフィルタを使って、C列が「0」である行を削除してみます。
オートフィルタを使って、C列が「0」の行を削除したい
オートフィルタを使って、C列が「0」である行を削除したいです。
こんな感じで、オートフィルタを使って、C列が「0」である行を削除したいです。
では、VBAコードをみてみます。
オートフィルタを使って、行を削除する
オートフィルタを使って、C列が「0」の行を削除するVBAコードです。
Sub TEST3()
'3列目を「0」でフィルタ
Range("A1").AutoFilter 3, 0
'フィルタした行を削除
With Range("A1").CurrentRegion
.Resize(.Rows.Count - 1).Offset(1, 0).EntireRow.Delete
End With
'フィルタを解除
Range("A1").AutoFilter
End Sub
表を用意します。
では、VBAコードを実行してみます。
C列を「0」でフィルタします。
フィルタ結果を削除します。
フィルタを解除します。
これで、オートフィルタを使って、C列が「0」である行を削除できます。
C列が「0」の行を削除できた
オートフィルタを使って、C列が「0」である行を削除できました。
フィルタ結果がある場合に削除する
オートフィルタを使う場合は、フィルタ結果がある場合に削除する必要があります。
フィルタ結果がない場合に、削除するとすべてのデータが削除されちゃいます。
フィルタ結果がない場合に削除してみる
C列に「0」がない場合で、削除してみます。
実行するとすべてのデータが削除されちゃいます。
なので、オートフィルタのフィルタ結果がある場合に実行する必要があります。
フィルタ結果がある場合に行を削除する
オートフィルタのフィルタ結果がある場合に実行する条件を追加します。
「SubTotal関数」を使って、可視セルの行数をカウントします。
Sub TEST4()
'3列目を「0」でフィルタ
Range("A1").AutoFilter 3, 0
'フィルタ結果がある場合
If WorksheetFunction.Subtotal(103, Range("A:A")) > 1 Then
'フィルタした行を削除
With Range("A1").CurrentRegion
.Resize(.Rows.Count - 1).Offset(1, 0).EntireRow.Delete
End With
End If
'フィルタを解除
Range("A1").AutoFilter
End Sub
Sub TEST5()
t = Timer
'最終行から2行目までをループ
For i = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1
'C列が「0」の場合
If Cells(i, "C") = 0 Then
Rows(i).Delete '行を削除
End If
Next
Debug.Print Timer - t & " 秒"
End Sub
Sub TEST6()
t = Timer
'3列目を「0」でフィルタ
Range("A1").AutoFilter 3, 0
'フィルタ結果がある場合
If WorksheetFunction.Subtotal(103, Range("A:A")) > 1 Then
'フィルタした行を削除
With Range("A1").CurrentRegion
.Resize(.Rows.Count - 1).Offset(1, 0).EntireRow.Delete
End With
End If
'フィルタを解除
Range("A1").AutoFilter
Debug.Print Timer - t & " 秒"
End Sub