Excelを使ってデータを分析していると、「特定の条件に合う行だけを別シートに抜き出したい」という場面がよくあります。
たとえば「営業担当ごとの売上を個別シートにまとめたい」「在庫ありの商品だけを一覧にしたい」「特定の支店データを抽出して報告書を作成したい」などです。
このような作業を手作業で行うと、毎回フィルターを設定してコピーペーストを繰り返す必要があります。
しかし、VBAマクロを使えば、ボタン1つで自動的にフィルター抽出と転記を実行できるようになります。
この記事では、Excel VBAで「フィルター抽出したデータを別シートに出力する方法」を、基本から応用まで詳しく解説します。
実務にすぐ使えるコード例も交えて紹介します。
目次
- ✅ フィルター抽出して別シートにコピーする基本構文
- ・基本構文
- ・処理の流れ
- ✅ フィルター抽出して「ヘッダーを除外」して転記する方法
- ・ヘッダーを除外してコピーする例
- ・Offsetを使う理由
- ✅ フィルター条件を変数で指定して汎用化する
- ・担当者名でフィルター抽出する例
- ✅ 複数条件で抽出して別シートへコピーする
- ・複数条件で抽出するVBA
- ✅ 複数シートへ自動的に振り分ける応用マクロ
- ・担当者ごとにシートを自動作成するVBA
- ・実務での活用イメージ
- ✅ トラブル防止のためのチェックポイント
- ・可視セルがないとエラーが出る
- ・フィルタ解除を忘れない
- ・同名シートの存在確認
- ✅ まとめ:マクロでフィルター抽出→別シート転記を自動化しよう
✅ フィルター抽出して別シートにコピーする基本構文
まずは最も基本的な「特定条件でフィルターをかけて、抽出結果を別シートにコピーする」マクロを紹介します。
今回は「売上金額が100000以上のデータだけを別シートに出力」する例を用います。
・基本構文
Sub FilterAndCopyToSheet()
Dim wsSrc As Worksheet
Dim wsDst As Worksheet
Dim rngVisible 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 rngVisible = wsSrc.Range("A1").CurrentRegion.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
・処理の流れ
- 元データシート(売上データ)と転記先シート(抽出結果)を設定
- 既存フィルタを解除してリセット
AutoFilter
で条件指定(Field:=3はC列)SpecialCells(xlCellTypeVisible)
で「表示中セル(抽出結果)」を取得- 別シートへコピー
この基本構文を覚えるだけで、さまざまな条件抽出に応用可能です。
✅ フィルター抽出して「ヘッダーを除外」して転記する方法
多くの場合、抽出結果を別シートに貼り付けるとき、ヘッダー(項目名)を除きたいことがあります。
見出しを省いた状態で別シートに転記するには、Offset
とResize
を利用します。
・ヘッダーを除外してコピーする例
Sub FilterAndCopyWithoutHeader()
Dim wsSrc As Worksheet
Dim wsDst As Worksheet
Dim rngVisible 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 rngVisible = wsSrc.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not rngVisible Is Nothing Then
'1行目をスキップ(ヘッダー除外)
rngVisible.Offset(1, 0).Resize(rngVisible.Rows.Count - 1).Copy Destination:=wsDst.Range("A1")
Else
MsgBox "該当データがありません。", vbInformation
End If
wsSrc.AutoFilterMode = False
End Sub
・Offsetを使う理由
Offset(1,0)
で範囲を1行下にずらし、Resize
で1行分減らすことで、ヘッダーを除外して実データだけをコピーできます。
レポート用の出力や集計用データを作成する際に重宝します。
✅ フィルター条件を変数で指定して汎用化する
業務で同じ処理を複数条件で繰り返す場合、条件を変数化して使い回せるようにしておくと便利です。
たとえば「担当者名」や「支店名」を入力ボックスで指定して抽出するマクロです。
・担当者名でフィルター抽出する例
Sub FilterByNameAndCopy()
Dim wsSrc As Worksheet
Dim wsDst As Worksheet
Dim empName As String
Dim rngVisible As Range
Set wsSrc = Worksheets("売上データ")
Set wsDst = Worksheets("抽出結果")
'条件をユーザー入力
empName = InputBox("抽出する担当者名を入力してください。", "担当者別抽出")
If empName = "" Then Exit Sub
wsSrc.AutoFilterMode = False
wsSrc.Range("A1").CurrentRegion.AutoFilter Field:=2, Criteria1:=empName
On Error Resume Next
Set rngVisible = wsSrc.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not rngVisible Is Nothing Then
wsDst.Cells.Clear
rngVisible.Copy Destination:=wsDst.Range("A1")
MsgBox empName & " さんのデータを転記しました。", vbInformation
Else
MsgBox "該当データがありません。", vbInformation
End If
wsSrc.AutoFilterMode = False
End Sub
・この方法の利点
- 入力に応じてフィルター条件を動的に変更できる
- 同じコードで複数の抽出パターンに対応可能
- UI要素(InputBox)で初心者でも使いやすい
参考:【VBA】InputBoxの活用方法
✅ 複数条件で抽出して別シートへコピーする
Excelでは1つの列だけでなく、「複数条件を組み合わせて抽出」することもよくあります。
たとえば「支店=東京 かつ 売上金額≥100000」のような場合です。
・複数条件で抽出するVBA
Sub FilterByMultipleConditions()
Dim wsSrc As Worksheet
Dim wsDst As Worksheet
Dim rngVisible As Range
Set wsSrc = Worksheets("売上データ")
Set wsDst = Worksheets("抽出結果")
wsSrc.AutoFilterMode = False
With wsSrc.Range("A1").CurrentRegion
.AutoFilter Field:=1, Criteria1:="東京"
.AutoFilter Field:=3, Criteria1:=">=100000"
End With
On Error Resume Next
Set rngVisible = wsSrc.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not rngVisible Is Nothing Then
wsDst.Cells.Clear
rngVisible.Copy Destination:=wsDst.Range("A1")
MsgBox "条件に一致するデータを転記しました。", vbInformation
Else
MsgBox "該当データがありません。", vbInformation
End If
wsSrc.AutoFilterMode = False
End Sub
・ポイント
With
構文で複数のAutoFilter
を連続指定
参考:【VBA】AutoFilterの複数条件を設定する方法|AND・ORを自在に操る実務向け活用術- 条件を増やす場合は
Field
を追加 xlAnd
を使えばAND条件、xlOr
でOR条件に対応可能
✅ 複数シートへ自動的に振り分ける応用マクロ
より高度な応用として、「担当者ごとにシートを自動作成して抽出データをそれぞれ貼り付ける」方法があります。
これは、営業成績や地域別リストなどの自動レポート出力に非常に便利です。
・担当者ごとにシートを自動作成するVBA
Sub SplitDataByStaff()
Dim wsSrc As Worksheet
Dim rng As Range
Dim c As Range
Dim staffName As String
Dim wsNew As Worksheet
Set wsSrc = Worksheets("売上データ")
wsSrc.AutoFilterMode = False
'担当者列のデータ範囲を取得(2列目が担当者)
Set rng = wsSrc.Range("B2:B" & wsSrc.Cells(wsSrc.Rows.Count, "B").End(xlUp).Row)
'重複なしリストを作成
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
For Each c In rng
If Not dict.exists(c.Value) And c.Value <> "" Then
dict.Add c.Value, Nothing
End If
Next c
'各担当者ごとに抽出&シート出力
For Each staffName In dict.keys
wsSrc.AutoFilterMode = False
wsSrc.Range("A1").CurrentRegion.AutoFilter Field:=2, Criteria1:=staffName
'シート作成(存在する場合はクリア)
On Error Resume Next
Set wsNew = Worksheets(staffName)
On Error GoTo 0
If wsNew Is Nothing Then
Set wsNew = Worksheets.Add
wsNew.Name = staffName
Else
wsNew.Cells.Clear
End If
'コピーして貼り付け
wsSrc.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy Destination:=wsNew.Range("A1")
Next staffName
wsSrc.AutoFilterMode = False
MsgBox "担当者ごとのシート作成が完了しました。", vbInformation
End Sub
・実務での活用イメージ
- 各営業担当ごとの成果を個別シートに分けて出力
- 部署別・支店別の月報を一括生成
- 自動レポート作成ツールの一部として活用
このような自動化により、毎月数時間かかっていた仕分け作業を数秒で終わらせることができます。
✅ トラブル防止のためのチェックポイント
オートフィルタ+コピー処理を安全に運用するには、次の注意点を押さえておくことが重要です。
・可視セルがないとエラーが出る
SpecialCells(xlCellTypeVisible)
は、データがない場合エラーを返します。
必ずOn Error Resume Next
とNothing
判定を入れましょう。
・フィルタ解除を忘れない
処理が終わった後にAutoFilterMode = False
を実行しておかないと、
次のマクロ実行時に条件が残って誤動作することがあります。
・同名シートの存在確認
シート自動作成時は、同名シートがすでに存在している可能性があるため、
On Error Resume Next
を使ってエラー回避することが大切です。
✅ まとめ:マクロでフィルター抽出→別シート転記を自動化しよう
最後に、本記事のポイントを整理します。
AutoFilter
を使うと特定条件で簡単にデータ抽出ができるSpecialCells(xlCellTypeVisible)
で抽出データのみを取得Offset
とResize
でヘッダーを除外可能- 入力ボックスや複数条件を使えば柔軟な抽出が可能
- 担当者や支店ごとにシート自動分割もできる
マクロでフィルター抽出から別シート転記まで自動化すれば、
日次・月次報告や部署別分析の効率が飛躍的に向上します。
一度マクロを作っておけば、ボタンひとつで定型処理を完了できるため、
手作業のコピーミスもなくなり、作業スピードと正確性の両方を実現できます。