Excel業務でよくある作業のひとつが、「特定条件に合うデータを抽出して別シートにまとめる」ことです。
たとえば、営業担当別の売上リストを分けたいときや、「完了」ステータスだけを別表に出したいときなど。
これを手動で行うと、
- フィルタを設定
- 該当行をコピー
- 新しいシートに貼り付け
といった操作を何度も繰り返すことになります。
しかしVBAマクロを使えば、ボタン1つでフィルタ抽出 → 別シート転記を自動化できます。
この記事では、実務でそのまま使える「フィルタ抽出→別シート出力マクロ」を、
初級者にもわかりやすく構文付きで解説します。
目次
- ✅ オートフィルタで抽出したデータを別シートに転記する流れ
- ✅ 基本マクロ:フィルタ抽出結果を別シートに転記
- ✅ コードの動作をわかりやすく解説
- ・① AutoFilterで条件抽出
- ・② SpecialCells(xlCellTypeVisible)で可視セルを取得
- ・③ データが0件の場合のスキップ処理
- ・④ 転記先にヘッダーも出力
- ・⑤ フィルタ解除で元データを元に戻す
- ✅ 応用①:条件をセルから動的に指定して抽出
- ✅ 応用②:複数条件で抽出して別シートに転記
- ✅ 応用③:抽出結果を新しいブックに保存する
- ✅ 注意点と安定化のポイント
- ・① 該当データが0件のときはスキップ処理を入れる
- ・② フィルタ解除を忘れない
- ・③ 転記先をクリアしてから貼り付け
- ・④ 高速化のための設定
- ✅ まとめ:マクロでフィルタ抽出と別シート転記を自動化しよう
✅ オートフィルタで抽出したデータを別シートに転記する流れ
まず、VBAでフィルタ抽出を別シートへ出力する処理の全体像を整理しておきましょう。
- 抽出元シートを指定する
- 抽出条件を指定してオートフィルタを実行
- 抽出結果(可視セル)をコピー
- 転記先シートを指定して貼り付け
- フィルタを解除して終了
この流れさえ理解しておけば、応用範囲は非常に広くなります。
次に、実際に使えるマクロコードを紹介します。
✅ 基本マクロ:フィルタ抽出結果を別シートに転記
以下は、最も基本的な「A列で条件を指定して抽出し、別シートに転記する」コードです。
Sub FilterAndCopyToAnotherSheet()
Dim wsSrc As Worksheet
Dim wsDst As Worksheet
Dim rng As Range
Dim visibleRange As Range
' シート設定
Set wsSrc = ThisWorkbook.Sheets("データ")
Set wsDst = ThisWorkbook.Sheets("抽出結果")
' 転記先初期化
wsDst.Cells.ClearContents
' A列で「完了」を抽出
wsSrc.Range("A1").AutoFilter Field:=1, Criteria1:="完了"
' フィルタ範囲を取得(ヘッダー含む)
Set rng = wsSrc.AutoFilter.Range
' 可視セルのみ取得(ヘッダー除外)
On Error Resume Next
Set visibleRange = rng.Offset(1, 0).Resize(rng.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
' 該当データがない場合の処理
If visibleRange Is Nothing Then
MsgBox "「完了」に該当するデータはありません。", vbInformation
wsSrc.AutoFilterMode = False
Exit Sub
End If
' 可視セルをコピーして別シートに転記
rng.Rows(1).Copy Destination:=wsDst.Range("A1") ' ヘッダー行
visibleRange.Copy Destination:=wsDst.Range("A2")
' フィルタ解除
wsSrc.AutoFilterMode = False
MsgBox "フィルタ抽出結果を「抽出結果」シートに転記しました。", vbInformation
End Sub
参考:【VBA】特定の文字を含む列の処理:検索・削除・別シートにコピー
✅ コードの動作をわかりやすく解説
・① AutoFilterで条件抽出
wsSrc.Range("A1").AutoFilter Field:=1, Criteria1:="完了"
ここで「A列(1列目)」の中から "完了"
に一致する行を抽出します。
Field:=1
は列番号を表しており、2列目なら Field:=2
に変更します。
・② SpecialCells(xlCellTypeVisible)で可視セルを取得
抽出後の可視セル(見えているデータ部分)のみを取得します。
非表示行は自動的に除外されるため、コピー処理がスムーズになります。
参考:【VBA】条件に一致するセルを取得する方法|Find・For Each・SpecialCells
・③ データが0件の場合のスキップ処理
If visibleRange Is Nothing Then
該当データが1件もない場合は Nothing
となるため、
ここでエラーを防ぎ「0件ならスキップ」できます。
この一文を入れておくと実務でマクロが止まることを防げます。
参考:【VBA】フィルター結果が0件のときに安全に処理する方法|エラーを出さずにスキップする
・④ 転記先にヘッダーも出力
rng.Rows(1).Copy Destination:=wsDst.Range("A1")
ヘッダー(見出し行)も一緒に出力しておくと、
転記先シートでの再利用や印刷がスムーズになります。
参考:【VBA】コピーデータを貼り付ける場所を指定:Destinationパラメータ
・⑤ フィルタ解除で元データを元に戻す
最後に wsSrc.AutoFilterMode = False
でフィルタを解除。
マクロを繰り返し実行しても問題が起こらないようにします。
✅ 応用①:条件をセルから動的に指定して抽出
毎回コードを編集せず、セルの内容を基に条件を切り替えたい場合は、次のように記述します。
Sub FilterByCellCondition()
Dim wsSrc As Worksheet
Dim wsDst As Worksheet
Dim condition As String
Dim visibleRange As Range
Set wsSrc = ThisWorkbook.Sheets("データ")
Set wsDst = ThisWorkbook.Sheets("抽出結果")
' 抽出条件をセルB1から取得
condition = wsSrc.Range("B1").Value
' フィルタ設定
wsSrc.Range("A1").AutoFilter Field:=1, Criteria1:=condition
' 可視セル取得
On Error Resume Next
Set visibleRange = wsSrc.AutoFilter.Range.Offset(1, 0).Resize(wsSrc.AutoFilter.Range.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If visibleRange Is Nothing Then
MsgBox "条件「" & condition & "」に該当するデータはありません。", vbInformation
wsSrc.AutoFilterMode = False
Exit Sub
End If
' 転記処理
wsDst.Cells.ClearContents
wsSrc.AutoFilter.Range.Rows(1).Copy wsDst.Range("A1")
visibleRange.Copy wsDst.Range("A2")
wsSrc.AutoFilterMode = False
MsgBox "条件「" & condition & "」のデータを転記しました。", vbInformation
End Sub
ポイント
セルに「東京」「大阪」「完了」などを入力すれば、
その値を抽出条件として動的にマクロが動作します。
営業担当者別や支店別の抽出などに最適です。
参考:【VBA】可視セルのみを処理する方法|非表示セルを除外して安全に自動化する
✅ 応用②:複数条件で抽出して別シートに転記
2つ以上の条件を同時に抽出する場合は、
Operator:=xlOr
を使うことで対応できます。
Sub FilterMultiCondition()
Dim wsSrc As Worksheet
Dim wsDst As Worksheet
Dim visibleRange As Range
Set wsSrc = ThisWorkbook.Sheets("データ")
Set wsDst = ThisWorkbook.Sheets("抽出結果")
' フィルタ設定(A列で「東京」または「大阪」)
wsSrc.Range("A1").AutoFilter Field:=1, Criteria1:="東京", Operator:=xlOr, Criteria2:="大阪"
On Error Resume Next
Set visibleRange = wsSrc.AutoFilter.Range.Offset(1, 0).Resize(wsSrc.AutoFilter.Range.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If visibleRange Is Nothing Then
MsgBox "該当データがありません。", vbInformation
wsSrc.AutoFilterMode = False
Exit Sub
End If
' 転記
wsDst.Cells.ClearContents
wsSrc.AutoFilter.Range.Rows(1).Copy wsDst.Range("A1")
visibleRange.Copy wsDst.Range("A2")
wsSrc.AutoFilterMode = False
MsgBox "複数条件で抽出したデータを転記しました。", vbInformation
End Sub
複数支店や複数担当者を抽出したい場合に非常に便利な構文です。
参考:【VBA】If文の複数条件をリストで判定する方法|効率的な条件分岐の書き方と応用
✅ 応用③:抽出結果を新しいブックに保存する
別シートではなく、新規Excelファイルに抽出結果を出力したい場合もあります。
次のようにすれば、抽出データを新しいブックとして自動保存できます。
Sub ExportFilteredDataToNewFile()
Dim wsSrc As Worksheet
Dim visibleRange As Range
Dim newWb As Workbook
Set wsSrc = ThisWorkbook.Sheets("データ")
wsSrc.Range("A1").AutoFilter Field:=1, Criteria1:="完了"
On Error Resume Next
Set visibleRange = wsSrc.AutoFilter.Range.Offset(1, 0).Resize(wsSrc.AutoFilter.Range.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If visibleRange Is Nothing Then
MsgBox "該当データがありません。", vbInformation
wsSrc.AutoFilterMode = False
Exit Sub
End If
' 新しいブックを作成
Set newWb = Workbooks.Add
' 転記
wsSrc.AutoFilter.Range.Rows(1).Copy newWb.Sheets(1).Range("A1")
visibleRange.Copy newWb.Sheets(1).Range("A2")
' 保存
newWb.SaveAs Filename:=ThisWorkbook.Path & "\抽出結果_" & Format(Now, "yyyymmdd_hhmmss") & ".xlsx"
newWb.Close False
wsSrc.AutoFilterMode = False
MsgBox "抽出データを新しいファイルに保存しました。", vbInformation
End Sub
日次報告書や部門別ファイルの自動出力など、現場レベルで重宝する実践マクロです。
✅ 注意点と安定化のポイント
・① 該当データが0件のときはスキップ処理を入れる
SpecialCells
は0件時にエラー1004を返すため、
必ず On Error Resume Next
と If visibleRange Is Nothing Then
を組み合わせましょう。
・② フィルタ解除を忘れない
AutoFilterMode = False
を入れないと、次回実行時に範囲がずれて不具合が出ます。
マクロの最後には必ず解除を入れてください。
・③ 転記先をクリアしてから貼り付け
同じ転記先を使い回す場合は、
毎回 wsDst.Cells.ClearContents
で内容を初期化しておくと確実です。
・④ 高速化のための設定
大量データを扱う場合は、処理前後に以下を入れて速度を向上させます。
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' --- 処理 ---
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
✅ まとめ:マクロでフィルタ抽出と別シート転記を自動化しよう
AutoFilter
で条件抽出を行い、SpecialCells(xlCellTypeVisible)
で可視セルを取得するIf visibleRange Is Nothing
で0件時のエラーを回避- 転記先をクリア&ヘッダーもコピーしておくと再利用が便利
- 複数条件・動的条件・別ファイル出力にも応用可能
AutoFilterMode = False
でフィルタ解除を忘れない
フィルタ抽出の自動転記は、Excel業務の中でも特に効率化効果が高いマクロの一つです。
一度作成しておけば、日次レポート・担当者別一覧・部門別データ出力など、あらゆる場面で再利用できます。
ぜひ今回のマクロをベースに、自社業務に合わせた自動化へ発展させてください。
「ボタン1つで抽出から転記まで完了」 ― それが、VBAの本領発揮です。