【VBA】複数行削除はループではなくオートフィルタが最適!!

Excelマクロ

手動で行の削除がめんどくさい、他のツールとの連携で自動化したいなどあるかと思います。

VBA(Excelマクロ)を使用して、大量の表データから不要なデータを削除したい場合は、以前の私は1行1行削除するようにプログラムを作成していましたが、オートフィルタを使用して削除する方が処理が断然早いということに気づきましたので、オートフィルタを使用して行を削除する方法を紹介したいと思います。

もし、1行1行削除したい場合は、1行目からではなく最終行から削除することをお勧めします。
というのも、行を削除すると上に詰めるしかないのでズレていきます。

スポンサーリンク

データの準備

既に試しで使用するデータがある方は、そのデータを使用していただければ良いです。

データがないという方向けに下記のプログラムを用意しましたので、実行していただければ、私が使用するデータと同じ下記の表が作成できます。

Sub テストデータ作成()

For i = 1 To 5
    '列名作成
    Cells(1, i) = i & "列目"
    
    '行データ作成
    For j = 2 To 6
        Cells(j, i) = "データ" & i & j
    Next j
Next i

End Sub

 

オートフィルタの方法

いきなりオートフィルタで複数行を削除する前に、まずはVBAでオートフィルタをする方法を例で紹介していきます。

オートフィルタ

(例1)表データの1列目(A列)が「データ13」を対象にオートフィルタした場合

Sub オートフィルタ()

  Range("A1").AutoFilter 1, "=" & "データ13"

End Sub
Range(“A1”).AutoFilter 1, “=” & “データ13”
1:1列目
“=”:条件の不等号
“データ13″:オートフィルタ条件(データ13のみを表示する)

 

(例2)表データの2列目(B列)が「データ22以外」を対象にオートフィルタした場合

Sub オートフィルタ()

  Range("A1").AutoFilter 2, "<>" & "データ22"
  
End Sub
Range(“A1”).AutoFilter 2, “<>” & “データ22”
2:2列目
“<>”:条件の不等号
“データ22″:オートフィルタ条件(データ22以外を表示する)

 

オートフィルタの解除

オートフィルタを解除したい場合は、下記のプログラムで解除出来ます。

先ほどのRange(“A1”)と同じ場所を指定してください。

Sub オートフィルタ解除()

  Range("A1").AutoFilter

End Sub

オートフィルタの解除は、オートフィルタを再度実行することで出来ます!!

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

VBAでオートフィルタを実装する方法まで理解できたかと思いますので、オートフィルタで削除するやり方を紹介していきます。

今回紹介するのは、オートフィルタ後の表示されているデータが削除対象となります。

(例)表データの2列目(B列)が「データ22以外」を対象に削除した場合

Sub オートフィルタ削除()

Dim FRng
Dim FRngRow
  
'オートフィルタ
Range("A1").AutoFilter 2, "<>" & "データ22"

'表示されているデータの削除
Set FRng = ActiveSheet.AutoFilter.Range                      '範囲取得
FRngRow = FRng.Rows.Count                                    '行数を取得
Rows("2:" & FRngRow).SpecialCells(xlCellTypeVisible).Delete  '表示データを削除

'オートフィルタの解除
Range("A1").AutoFilter

End Sub
①.Set FRng = ActiveSheet.AutoFilter.Range
オートフィルタ後に表示されているデータの範囲を取得しています。②.FRngRow = FRng.Rows.Count①で取得したデータの範囲の行数を取得しています。③.Rows(“2:” & FRngRow).SpecialCells(xlCellTypeVisible).Delete
2行目から②で取得した行数まで削除しています。

Rows(“2:” & FRngRow).SpecialCells(xlCellTypeVisible).Deleteの「2」を「3」に変更したら、3行目から削除できます。

なので、オートフィルタをした状態で下記を追加すると表示されているデータを削除することが出来ます。
'表示されているデータの削除
Set FRng = ActiveSheet.AutoFilter.Range                      '範囲取得
FRngRow = FRng.Rows.Count                                    '行数を取得
Rows("2:" & FRngRow).SpecialCells(xlCellTypeVisible).Delete  '表示データを削除

 

 

オートフィルタを使用することで簡単にデータを削除することが出来ます。

データを1行1行ループして削除する方法もありますが、1行目から削除するとズレますので、最終行から削除する必要があります。
また、処理速度もループよりオートフィルタの方が早いのでオートフィルタで削除することをお勧めします。

 

コメント