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
・構文のポイント
AutoFilterMode = False
で既存フィルタを解除してから新規設定Field:=3
は3列目(C列)を対象にしている
参考:【VBA】オートフィルターを「設定のみ」行う方法を徹底解説|解除しないで条件だけ変更・適用Criteria1:=">=100000"
で条件を指定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】データのある範囲をコピーする方法- フィルタ結果に基づいて「可視セルのみ」コピーされる
- 不要な列を省くことで、報告書やメール添付用データを効率化
この方法は、複数の報告書を自動生成するような業務にも応用可能です。
✅ 見出し(ヘッダー)を除いてコピーする方法
通常、オートフィルタのコピーではヘッダー行も含まれてしまうため、貼り付け先で重複行ができる場合があります。
見出しを除いてコピーするには、Offset
とResize
を使うのがポイントです。
・ヘッダーを除くコピーの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
・この方法のメリット
- 抽出条件を都度変更可能(ユーザー入力対応)
- 同じコードで複数用途に使い回せる
- RPAやマクロ連携にも応用しやすい参考:【VBA】On Error Resume Nextでエラーを無視してエラーの制御
✅ 応用例:抽出した一部データを別ブックにコピーする
業務では「抽出結果を別ファイルに保存」するニーズも多いです。
たとえば、月次報告用に他部署へ配布する場合や、データ保管用のバックアップを作成する場合です。
・別ブックへコピーする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
・ポイント
Workbooks.Add
で新規ブックを作成
参考:【VBA】フィルター結果を別ブックにコピーする方法|自動転記で効率化する実践テクニックSaveAs
で日時付きのファイル名を自動生成
参考:【VBA】Application.GetSaveAsFilenameメソッドを使用する方法- 繰り返し実行しても上書きされないよう安全設計
この方法を応用すれば、日次・週次処理の自動レポート出力にも使えます。
✅ トラブル対策と注意点
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でオートフィルタ結果の一部コピーを自動化しよう
最後に、本記事のポイントを整理します。
AutoFilter
+SpecialCells(xlCellTypeVisible)
で抽出結果だけを取得できる- 列を限定することで「必要な部分のみ」をコピー可能
Offset
を使えばヘッダーを除外して転記できる- 入力ボックスや変数で柔軟に条件を変更できる
- 別ブックへの自動保存やバックアップにも応用可能
オートフィルタによる「一部データのコピー」は、単なる転記処理にとどまらず、
定型業務の自動化・報告書作成・データ管理の効率化に直結する強力な手法です。
ぜひ本記事を参考に、自分の業務に合わせたマクロをカスタマイズし、
毎日のExcel作業をよりスピーディに、正確に進めてみてください。