条件に合う行だけを別シートに抽出する(オートフィルターの使い方)
オートフィルターで条件に合う行を絞り込み、見えている行だけを別シートにコピーする方法です。複数条件、日付の範囲、該当なしのときの扱いまで解説します。
どんな場面で使うか
全社の受注明細から自分の担当分だけを抜き出す、未入金のデータだけを別シートにまとめる、といった作業です。ループで1行ずつ判定して書き出す方法もありますが、Excel のオートフィルター機能をマクロから使うと、少ないコードで速く処理できます。
基本の流れ
抽出は次の4つの手順で行います。最後にフィルターを解除し忘れると、元のシートが絞り込まれたまま残るので注意します。
- 表の範囲にオートフィルターをかけ、条件を指定する
- 見えているセル(SpecialCells(xlCellTypeVisible))だけをコピーする
- 貼り付け先のシートに貼る
- フィルターを解除する
コード(担当者と金額の2条件)
C列の担当者が「佐藤」で、E列の金額が10万円以上の行を「抽出結果」シートに書き出します。該当する行が1件もないとき、SpecialCells はエラーになるため、先に件数を確認しています。
Sub ExtractRows()
Dim ws As Worksheet, outWs As Worksheet, rng As Range
Dim lastRow As Long, hit As Long
Set ws = ThisWorkbook.Worksheets("受注明細")
Set outWs = ThisWorkbook.Worksheets("抽出結果")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set rng = ws.Range("A1:F" & lastRow) ' 1行目は見出し
If ws.AutoFilterMode Then ws.AutoFilterMode = False
rng.AutoFilter Field:=3, Criteria1:="佐藤"
rng.AutoFilter Field:=5, Criteria1:=">=100000"
hit = rng.Columns(1).SpecialCells(xlCellTypeVisible).Count - 1 ' 見出しを除く
outWs.Cells.Clear
If hit > 0 Then
rng.SpecialCells(xlCellTypeVisible).Copy outWs.Range("A1")
End If
ws.AutoFilterMode = False
MsgBox hit & " 件を抽出しました"
End Sub日付の範囲で絞り込む
日付の条件は、文字列ではなく日付のシリアル値で指定すると確実です。次の例は、B列の受注日が今月の行を抽出します。Criteria1 と Criteria2 を Operator:=xlAnd で組み合わせます。
Dim d1 As Date, d2 As Date
d1 = DateSerial(Year(Date), Month(Date), 1)
d2 = DateSerial(Year(Date), Month(Date) + 1, 0)
rng.AutoFilter Field:=2, Criteria1:=">=" & CLng(d1), Operator:=xlAnd, Criteria2:="<=" & CLng(d2)注意点
表の途中に空白行があると、オートフィルターの範囲がそこで切れてしまうことがあります。この記事のように範囲を最終行まで明示して指定すると安全です。
また、シートの保護がかかっているとフィルターを操作できません。保護を解除してから実行するか、フィルターの使用を許可した状態で保護してください。条件が複雑になる場合(3つ以上の値のいずれか、など)は、Criteria1 に配列を渡して Operator:=xlFilterValues を指定する方法もあります。
- 範囲は最終行まで明示して指定する
- 該当0件のときの SpecialCells エラーに備える
- 最後に AutoFilterMode = False で解除する
※シート名・列番号は実際の表に合わせて変更してください。
ほかの記事
基本・高速化最終行を正しく取得する方法(End(xlUp)・UsedRange・CurrentRegion の違い)データの最終行を取得する代表的な3つの方法と、空白行や書式だけ残ったセルで結果がずれる原因、実務で安全な書き方を解説します。基本・高速化マクロを速くする基本(画面更新の停止・計算の手動化・配列での一括処理)セルを1つずつ読み書きする遅いマクロを、画面更新の停止・計算方法の切り替え・配列での一括処理で速くする方法を、元に戻し忘れを防ぐ書き方とあわせて解説します。基本・高速化日付の扱い方(文字列の日付の変換・月末日・締め日の計算)CSV から取り込んだ文字列の日付を日付型に変換する方法、DateSerial を使った月末日や締め日の計算、和暦の表示など、日付で間違えやすい点をまとめます。データ集計・抽出複数シートのデータを1枚のシートに集約する支店別・月別など同じ形式の複数シートを、1枚の集計用シートにまとめるマクロです。見出しの扱い、元シート名の記録、集計シートの作り直しまで解説します。