【VBA】オートフィルタで抽出した行以外の行を削除する

例えば以下の表の
 ・列「名前」の
 ・値「佐藤」ではない
を…

列「名前」が「佐藤」ではない行は6行ある
列「名前」が「佐藤」ではない行は6行ある


削除できます!

列「名前」が「佐藤」ではない行が削除された
列「名前」が「佐藤」ではない行が削除された

オートフィルタを利用することで
削除できます!

PR

VBAコード

ここでは例として、
 ・シート「sample」のセル「B2」から続く一連の範囲の表の
 ・列「名前」の値が「佐藤」ではない行のみを
 ・削除
します。
※「佐藤」の行のみしか無い場合は何もしません。

実行前
実行前
Sub sample()

    Dim ws As Worksheet
    Dim startRange  As Range
    Dim filterColumnName As String
    Dim filterStr As String
    Dim table As ListObject
    Dim rowCount As Long

    '対象シート
    Set ws = Worksheets("sample")
    'テーブル化する表の一番左上のセル
    Set startRange = ws.Range("B2")
    'フィルタ対象の列名
    filterColumnName = "名前"
    '対象文字列
    filterStr = "佐藤"
    
    '表をテーブル化してListObjectを取得
    Set table = ws.listObjects.Add(Source:=startRange.CurrentRegion, XlListObjectHasHeaders:=xlYes)
    
    '「フィルタ対象の列名」に「対象文字列以外」の行(削除対象の行)の行数を取得
    rowCount = WorksheetFunction.CountIf(table.ListColumns(filterColumnName).DataBodyRange, "<>" & filterStr)
    
    '0行でない場合のみ後続の処理を実施
    If (rowCount <> 0) Then
        '「フィルタ対象の列」にて「対象文字列」で絞り込み
        startRange.AutoFilter field:=table.ListColumns(filterColumnName).Index, Criteria1:="<>" & filterStr
        '絞り込んだ行(=表示させた行)のみを削除
        Application.DisplayAlerts = False
        table.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
        Application.DisplayAlerts = True
    End If
     
    'テーブル化を解除
    With table
        .TableStyle = ""
        .Unlist
    End With
    
End Sub

以下を指定します(11~17行目)。
※状況に応じて任意の値を指定してください。

・対象シート
・オートフィルタを設定する表の一番左上のセル
・フィルタ対象の列名
・対象文字列

シンプルなコードとするために、一時的にテーブル化します(20行目)。

「フィルタ対象の列名」にて「<>対象文字列」の行(削除対象の行)の行数を取得します(23行目)。
※「<>対象文字列」とすることで「対象文字列以外」としています。

0行でない場合のみ、後続の削除処理へ進めます(26行目)。

「フィルタ対象の列」にて「<>対象文字列」で絞り込みをします(28行目)。
※「<>対象文字列」とすることで「対象文字列以外」としています。

絞り込んだ行(=表示させた行)のみを削除します(30~32行目)。
※メッセージ「シート行全体を削除しますか?」を表示させないようにするために「Application.DisplayAlerts」を使用しています。

メッセージ「シート行全体を削除しますか?」
メッセージ「シート行全体を削除しますか?」

その後、テーブル化を解除します(36~39行目)。

結果として、条件に一致した行のみが削除され、一致しない行が残ります。

PR

実行結果

オートフィルタを利用して、条件に一致した行ではない行を削除できました。
※列「名前」の値が「佐藤」ではない行のみを削除できました。

実行結果
実行結果
PR

参考①

オートフィルタを利用して、条件に一致した行のみを削除することもできます。

詳細は以下の記事をご確認ください。

PR

参考②

重複行を削除することもできます。

詳細は以下の記事をご確認ください。

PR

参考③

オートフィルタを使用せずに、特定の行以外の行を削除することもできます。

詳細は以下の記事をご確認ください。

オートフィルタを使用しない場合、対象となる行(データ)が多いと処理時間が長くなります。

PR

参考④

オートフィルタ関連の記事は他にもあります。

詳細は以下の記事をご確認ください。

【VBA】表の指定した列で各データにて絞り込んで、絞り込まれたデータ別の合計値を取得する
【VBA】表の指定した列でデータを絞り込んで、絞り込まれたデータの合計値を取得する
【VBA】オートフィルタで抽出したデータを、別シートへコピーする
【VBA】オートフィルタで抽出した行以外の行を削除する
【VBA】オートフィルタで抽出した行を削除する
【VBA】オートフィルタを設定し、複数の列で絞り込む
【VBA】オートフィルタを設定し、日付で絞り込む
【VBA】オートフィルタを設定し、文字色で絞り込む
【VBA】オートフィルタを設定し、ワイルドカードを使用して条件を絞り込む
【VBA】オートフィルタを設定し、セルの背景色で絞り込む
【VBA】オートフィルタの条件をクリアして、全てのデータを表示する
【VBA】オートフィルタを設定し、1つの列に複数の条件で絞り込む
【VBA】オートフィルタを設定し空白で絞り込む
【VBA】オートフィルタを設定し絞り込み(数値)をして、絞り込んだ結果の件数を取得する
【VBA】オートフィルタを設定し絞り込み(文字列)をして、絞り込んだ結果の数値の合計を取得する
【VBA】オートフィルタの設定/解除をする