大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAで、条件に一致した行を削除するには、「シートをループ」して条件一致の行を削除する方法と、「オートフィルタ」を使って、フィルタ結果を削除する方法があります。条件一致の行を削除する方法について、マスターしていきましょう。

はじめに

この記事では、条件に一致した行を削除する方法について、ご紹介します。

やり方としては、次の2つの方法があります。

  • セルをループして条件一致の行を削除
  • オートフィルタを使ってフィルタ結果を削除

VBAコードがシンプルで汎用性があるのが、セルをループする方法になります。

高速で処理をしたい場合は、オートフィルタの方が高速になります。

条件一致の行を削除する方法について、マスターしていきましょう。

では、条件に一致した行を削除する方法について、解説していきます。

この記事を読むメリット

  • 条件一致した行を削除することができるようになります。

目次から見たい項目へ移動すると便利ですよ。

目次

セルをループして条件に一致した行を削除

セルをループして条件に一致した行を削除してみます。

最終行からループして条件一致の行を削除

セルをループして、削除する場合は、最終行からループして削除するのがポイントです。

C列が「0」の行を削除してみます。

C列が「0」の行を削除したい

C列が「0」の行を削除したいです。

C列が「0」の行を削除したいです

こんな感じで、C列が「0」の行を削除したいです。

こんな感じで、C列が「0」の行を削除したいです

では、最終行からループして、条件一致した行を削除してみます。

最終行からループして行を削除する

最終行からループして、条件一致した行を削除するVBAコードです。

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」である行を削除できます

これで、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」である行を削除したいです。

オートフィルタを使って、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」である行を削除できました

オートフィルタを使って、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

では、実行してみます。

C列を「0」でフィルタします。

C列を「0」でフィルタします

表示されている行数が1行未満の場合は、そのままにします。

表示されている行数が1行未満の場合は、そのままにします

これで、フィルタ結果がない場合は、そのままにできます。

フィルタ結果がない場合はそのままにできた

フィルタ結果がない場合は、そのままにできました

フィルタ結果がない場合は、そのままにできました。

こんな感じで、オートフィルタで特定の行を削除したい場合は、フィルタ結果がある場合に削除するといいです。

実行速度を比較してみる

では、実行速度を比較してみます。

セルをループして削除する方法と、オートフィルタを使って削除する方法で、実行する時間を計測してみます。

結果から言うと、オートフィルタを使って行を削除する方法が、高速になります。

では、実際にやってみます。

ループして削除する

ループして削除するする方法で、10,001行のデータから、C列が「0」の行を削除してみます。

10,001行のデータからC列が「0」の行を削除する

10,001行のデータから、C列が「0」の行を削除したいです

VBAコードは、先ほどと紹介したセルをループして削除するVBAコードと同じになります。

セルをループして削除する

セルをループして削除するVBAコードの実行時間を計測してみます。

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

実行すると、C列が「0」の行を削除できます。

C列が「0」の行を削除できた

C列が「0」の行を削除できました

C列が「0」の行を削除できました。

では、実行するのにかかった時間をみてみます。

かかった時間

実行にかかる時間はちょっと遅いです

実行にかかる時間はちょっと遅いです。

オートフィルタで削除する

次は、オートフィルタ使う方法で、10,001行のデータから、C列が「0」の行を削除したいです。

10,001行のデータからC列が「0」の行を削除する

10,001行のデータから、C列が「0」の行を削除したいです

VBAコードは、先ほどと紹介したオートフィルタを使って、特定行を削除するVBAコードと同じになります。

オートフィルタを使って削除する

オートフィルタを使って削除するVBAコードの実行時間を計測してみます。

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

実行すると、C列が「0」の行を削除できます。

C列が「0」の行を削除できました

C列が「0」の行を削除できました。

かかった時間をみてみます。

かかった時間

10倍以上高速になりました

かかった時間は、「約0.5秒」で、ループするより10倍以上高速になりました。

高速で行を削除したい場合は、オートフィルタを使う方法で、特定行を削除しましょう。

おわりに

この記事では、条件に一致した行を削除する方法について、ご紹介しました。

やり方としては、次の2つの方法があります。

  • セルをループして条件一致の行を削除
  • オートフィルタを使ってフィルタ結果を削除

VBAコードがシンプルで汎用性があるのが、セルをループする方法になります。

高速で処理をしたい場合は、オートフィルタの方が高速になります。

条件一致の行を削除する方法について、マスターしていきましょう。

参考になればと思います。最後までご覧くださいまして、ありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

サイト内を検索する

↓キーワードを入力する

アーカイブから探す