VBAで自動化 VBA一覧 フィルター結果のコピー・抽出 抽出・検索処理

【VBA】フィルター抽出結果を別シートに自動転記する方法|業務を効率化する実践マクロ

Excel業務でよくある作業のひとつが、「特定条件に合うデータを抽出して別シートにまとめる」ことです。
たとえば、営業担当別の売上リストを分けたいときや、「完了」ステータスだけを別表に出したいときなど。

これを手動で行うと、

  • フィルタを設定
  • 該当行をコピー
  • 新しいシートに貼り付け
    といった操作を何度も繰り返すことになります。

しかしVBAマクロを使えば、ボタン1つでフィルタ抽出 → 別シート転記を自動化できます。
この記事では、実務でそのまま使える「フィルタ抽出→別シート出力マクロ」を、
初級者にもわかりやすく構文付きで解説します。

✅ オートフィルタで抽出したデータを別シートに転記する流れ

まず、VBAでフィルタ抽出を別シートへ出力する処理の全体像を整理しておきましょう。

  1. 抽出元シートを指定する
  2. 抽出条件を指定してオートフィルタを実行
  3. 抽出結果(可視セル)をコピー
  4. 転記先シートを指定して貼り付け
  5. フィルタを解除して終了

この流れさえ理解しておけば、応用範囲は非常に広くなります。
次に、実際に使えるマクロコードを紹介します。

参考:【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 NextIf 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の本領発揮です。

-VBAで自動化, VBA一覧, フィルター結果のコピー・抽出, 抽出・検索処理