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

【VBA】オートフィルタで抽出した一部データをコピーする方法|必要な情報だけを効率的に転記する

Excelを使った業務で、特定の条件を満たすデータだけをコピーしたい場面は多くあります。
たとえば「売上が100万円以上のデータだけを別シートにまとめたい」や「在庫ありの商品のみを担当者用リストに転記したい」などです。

このような処理を手作業で行うと時間がかかり、ミスも増えてしまいます。しかし、VBAのオートフィルタ機能とコピー処理を組み合わせることで、数秒で必要なデータだけを転記できるようになります。

この記事では、「オートフィルタで抽出した一部データだけをコピーする方法」を基本から応用まで徹底解説します。実務の自動化や集計作業の効率化に役立つ内容です。

✅ オートフィルタで抽出したデータをコピーする基本構文

まずは最も基本的な「抽出 → コピー → 貼り付け」の流れを紹介します。
以下のサンプルでは、「売上金額が100000以上のデータ」だけを別シートにコピーします。

・基本構文の例

Sub FilterAndCopyData()
    Dim wsSrc As Worksheet
    Dim wsDst As Worksheet
    Dim rng As Range
    
    '元データシートと出力先シートを指定
    Set wsSrc = Worksheets("売上データ")
    Set wsDst = Worksheets("抽出結果")
    
    '既存のフィルタを解除
    wsSrc.AutoFilterMode = False
    
    'フィルタ適用(売上金額が10万円以上)
    wsSrc.Range("A1").CurrentRegion.AutoFilter Field:=3, Criteria1:=">=100000"
    
    '可視セル(抽出結果)をコピー
    On Error Resume Next
    Set rng = wsSrc.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    If Not rng Is Nothing Then
        wsDst.Cells.Clear
        rng.Copy Destination:=wsDst.Range("A1")
    Else
        MsgBox "該当データがありません。", vbInformation
    End If
    
    'フィルタ解除
    wsSrc.AutoFilterMode = False
End Sub

・構文のポイント

  1. AutoFilterMode = False で既存フィルタを解除してから新規設定
  2. Field:=3 は3列目(C列)を対象にしている
    参考:【VBA】オートフィルターを「設定のみ」行う方法を徹底解説|解除しないで条件だけ変更・適用
  3. Criteria1:=">=100000" で条件を指定
  4. SpecialCells(xlCellTypeVisible) で「抽出されたセルだけ」を取得
    参考:【VBA】条件に一致するセルを取得する方法|Find・For Each・SpecialCells

このコードを実行すると、条件に合致する行だけが抽出され、それらを「抽出結果」シートに自動転記します。


✅ 一部の列だけをコピーする方法

業務でよくある要望として、「抽出した行の中から、特定の列だけをコピーしたい」というものがあります。
たとえば「商品名と売上金額だけを報告書に貼り付けたい」といったケースです。

・一部列のみをコピーするVBA

Sub FilterAndCopyPartColumns()
    Dim wsSrc As Worksheet
    Dim wsDst As Worksheet
    Dim rngVisible As Range
    Dim rngCopy As Range
    
    Set wsSrc = Worksheets("売上データ")
    Set wsDst = Worksheets("抽出結果")
    
    '既存フィルタを解除
    wsSrc.AutoFilterMode = False
    
    '売上金額が10万円以上のデータを抽出
    wsSrc.Range("A1").CurrentRegion.AutoFilter Field:=3, Criteria1:=">=100000"
    
    '抽出結果のうち、B列(商品名)とC列(売上金額)だけをコピー対象にする
    On Error Resume Next
    Set rngVisible = wsSrc.Range("B1:C" & wsSrc.Cells(wsSrc.Rows.Count, "B").End(xlUp).Row).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    '結果がある場合のみ処理
    If Not rngVisible Is Nothing Then
        wsDst.Cells.Clear
        rngVisible.Copy Destination:=wsDst.Range("A1")
    Else
        MsgBox "該当データがありません。", vbInformation
    End If
    
    wsSrc.AutoFilterMode = False
End Sub

・ポイント

  • Range("B1:C" & ...) で「コピー対象の列範囲」を指定
    参考:【VBA】データのある範囲をコピーする方法
  • フィルタ結果に基づいて「可視セルのみ」コピーされる
  • 不要な列を省くことで、報告書やメール添付用データを効率化

この方法は、複数の報告書を自動生成するような業務にも応用可能です。


✅ 見出し(ヘッダー)を除いてコピーする方法

通常、オートフィルタのコピーではヘッダー行も含まれてしまうため、貼り付け先で重複行ができる場合があります。
見出しを除いてコピーするには、OffsetResizeを使うのがポイントです。

・ヘッダーを除くコピーのVBA

Sub FilterAndCopyWithoutHeader()
    Dim wsSrc As Worksheet
    Dim wsDst As Worksheet
    Dim rng As Range
    
    Set wsSrc = Worksheets("売上データ")
    Set wsDst = Worksheets("抽出結果")
    
    wsSrc.AutoFilterMode = False
    wsSrc.Range("A1").CurrentRegion.AutoFilter Field:=3, Criteria1:=">=100000"
    
    '可視セルを取得
    On Error Resume Next
    Set rng = wsSrc.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    If Not rng Is Nothing Then
        'ヘッダーを除外(1行目をスキップ)
        rng.Offset(1, 0).Resize(rng.Rows.Count - 1).Copy Destination:=wsDst.Range("A1")
    Else
        MsgBox "該当データがありません。", vbInformation
    End If
    
    wsSrc.AutoFilterMode = False
End Sub

・なぜOffsetを使うのか?

Offset(1, 0)は、範囲を1行下にずらす処理です。
つまりヘッダーを飛ばして「実データのみ」を取得できます。
Resizeで行数を調整することで、正確にデータ部分だけをコピーできるようになります。
参考:【Excel】OFFSET関数で「基準を可変」にする方法をわかりやすく解説


✅ 抽出条件を変数化して柔軟に対応する

「毎回違う条件で抽出したい」という場合、変数を使って条件を動的に変更できるようにするのがおすすめです。
ユーザー入力によって抽出条件を変更することで、使い勝手の良いツールに仕上げることができます。

・変数で条件を指定する例

Sub FilterAndCopyByInput()
    Dim wsSrc As Worksheet
    Dim wsDst As Worksheet
    Dim threshold As Double
    Dim rng As Range
    
    Set wsSrc = Worksheets("売上データ")
    Set wsDst = Worksheets("抽出結果")
    
    '入力ボックスで条件を取得
    threshold = InputBox("コピーする条件を入力してください(例:100000)", "売上金額の条件")
    
    wsSrc.AutoFilterMode = False
    wsSrc.Range("A1").CurrentRegion.AutoFilter Field:=3, Criteria1:=">=" & threshold
    
    On Error Resume Next
    Set rng = wsSrc.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    If Not rng Is Nothing Then
        wsDst.Cells.Clear
        rng.Copy Destination:=wsDst.Range("A1")
    Else
        MsgBox "該当データがありません。", vbInformation
    End If
    
    wsSrc.AutoFilterMode = False
End Sub

・この方法のメリット




✅ 応用例:抽出した一部データを別ブックにコピーする

業務では「抽出結果を別ファイルに保存」するニーズも多いです。
たとえば、月次報告用に他部署へ配布する場合や、データ保管用のバックアップを作成する場合です。

・別ブックへコピーするVBA

Sub FilterAndExportToNewBook()
    Dim wsSrc As Worksheet
    Dim wbNew As Workbook
    Dim rngVisible As Range
    
    Set wsSrc = Worksheets("売上データ")
    
    wsSrc.AutoFilterMode = False
    wsSrc.Range("A1").CurrentRegion.AutoFilter Field:=3, Criteria1:=">=100000"
    
    On Error Resume Next
    Set rngVisible = wsSrc.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    If Not rngVisible Is Nothing Then
        Set wbNew = Workbooks.Add
        rngVisible.Copy Destination:=wbNew.Sheets(1).Range("A1")
        wbNew.SaveAs Filename:=ThisWorkbook.Path & "\抽出結果_" & Format(Now, "yyyymmdd_hhmmss") & ".xlsx"
        wbNew.Close
        MsgBox "抽出結果を新しいブックに保存しました。", vbInformation
    Else
        MsgBox "該当データがありません。", vbInformation
    End If
    
    wsSrc.AutoFilterMode = False
End Sub

・ポイント

この方法を応用すれば、日次・週次処理の自動レポート出力にも使えます。


✅ トラブル対策と注意点

VBAでオートフィルタ+コピーを使う際、意外と多いのが「エラー発生」や「空データコピー」の問題です。
以下の点を押さえておくと安定したマクロが作れます。

・可視セルがない場合のエラー回避

SpecialCells(xlCellTypeVisible)は該当データがないとエラーになります。
事前にエラーハンドリングを入れることで、安全に処理を継続できます。

On Error Resume Next
Set rng = wsSrc.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
 参考:【VBA】特定のセル(空白セル・数式セル・エラーセル)を見つけ出す:SpecialCells メソッド

・フィルタ解除を忘れない

他のマクロが同じシートを操作する場合、フィルタが残っていると不具合の原因になります。
処理の最後に以下を入れておくと安全です。

If wsSrc.AutoFilterMode Then wsSrc.AutoFilterMode = False

・貼り付け先シートを初期化するか確認

前回データが残っていると上書きコピーで誤解を招く可能性があります。
wsDst.Cells.Clearを使うことで毎回初期化してから貼り付けできます。

参考:【VBA】セルの内容をクリア(値を削除):Clearメソッド


✅ まとめ:VBAでオートフィルタ結果の一部コピーを自動化しよう

最後に、本記事のポイントを整理します。

  • AutoFilterSpecialCells(xlCellTypeVisible)で抽出結果だけを取得できる
  • 列を限定することで「必要な部分のみ」をコピー可能
  • Offsetを使えばヘッダーを除外して転記できる
  • 入力ボックスや変数で柔軟に条件を変更できる
  • 別ブックへの自動保存やバックアップにも応用可能

オートフィルタによる「一部データのコピー」は、単なる転記処理にとどまらず、
定型業務の自動化・報告書作成・データ管理の効率化に直結する強力な手法です。

ぜひ本記事を参考に、自分の業務に合わせたマクロをカスタマイズし、
毎日のExcel作業をよりスピーディに、正確に進めてみてください。

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