Excelでオートフィルターを使ってデータを抽出したあと、次のように思ったことはありませんか?
- 抽出した結果だけを別シートにまとめたい
- 毎回コピー&貼り付けするのが面倒
- 条件に合うデータだけ一覧にしたい
このような場合は、VBAで抽出結果を別シートへ自動コピーすると便利です。
ワンクリックで必要なデータだけを別シートへまとめられるので、集計・報告・印刷前の整理にとても役立ちます。
この記事でできること
- オートフィルターで条件抽出できる
- 抽出結果だけを別シートへコピーできる
- 見出しごと転記できる
- 実務で使える安全な書き方が分かる
完成コード(コピペOK)
まずは基本コードです。
このコードは、A1から始まる表を対象に、B列が「完了」の行だけ抽出し、別シートへコピーします。
Option Explicit
Sub CopyFilteredDataToAnotherSheet()
Dim wsSrc As Worksheet
Dim wsDst As Worksheet
Dim lastRow As Long
Dim lastCol As Long
Dim copyRange As Range
Set wsSrc = ActiveSheet
Set wsDst = Worksheets("抽出結果")
' 元データの最終行・最終列
lastRow = wsSrc.Cells(wsSrc.Rows.Count, 1).End(xlUp).Row
lastCol = wsSrc.Cells(1, wsSrc.Columns.Count).End(xlToLeft).Column
' 抽出結果シートを初期化
wsDst.Cells.Clear
' フィルター設定(B列 = 完了)
wsSrc.Range(wsSrc.Cells(1, 1), wsSrc.Cells(lastRow, lastCol)).AutoFilter _
Field:=2, Criteria1:="完了"
On Error Resume Next
Set copyRange = wsSrc.Range(wsSrc.Cells(1, 1), wsSrc.Cells(lastRow, lastCol)).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If copyRange Is Nothing Then
MsgBox "条件に合うデータがありません。", vbExclamation
Exit Sub
End If
' 抽出結果を別シートへコピー
copyRange.Copy Destination:=wsDst.Range("A1")
MsgBox "抽出結果を別シートへコピーしました。", vbInformation
End Sub
このコードでやっていること
① 元データの範囲を取得する
lastRow = wsSrc.Cells(wsSrc.Rows.Count, 1).End(xlUp).Row
lastCol = wsSrc.Cells(1, wsSrc.Columns.Count).End(xlToLeft).Column
データの件数や列数が変わっても対応できるように、最終行・最終列を自動取得しています。
② オートフィルターで条件抽出する
Field:=2, Criteria1:="完了"
B列(2列目)が「完了」の行だけを表示します。
③ 表示されている行だけ取得する
SpecialCells(xlCellTypeVisible)
これがポイントです。
フィルター後に表示されている行だけをコピー対象にできます。
事前準備:転記先シートを作っておく
このコードでは、転記先として 「抽出結果」 という名前のシートを使っています。
Set wsDst = Worksheets("抽出結果")
あらかじめこの名前のシートを作っておくか、あとで紹介する「無ければ自動作成する版」を使ってください。
転記先シートが無ければ自動作成する版
毎回シートを作るのが面倒な場合はこちらがおすすめです。
Option Explicit
Sub CopyFilteredDataToNewSheet()
Dim wsSrc As Worksheet
Dim wsDst As Worksheet
Dim lastRow As Long
Dim lastCol As Long
Dim copyRange As Range
Set wsSrc = ActiveSheet
On Error Resume Next
Set wsDst = Worksheets("抽出結果")
On Error GoTo 0
If wsDst Is Nothing Then
Set wsDst = Worksheets.Add
wsDst.Name = "抽出結果"
Else
wsDst.Cells.Clear
End If
lastRow = wsSrc.Cells(wsSrc.Rows.Count, 1).End(xlUp).Row
lastCol = wsSrc.Cells(1, wsSrc.Columns.Count).End(xlToLeft).Column
wsSrc.Range(wsSrc.Cells(1, 1), wsSrc.Cells(lastRow, lastCol)).AutoFilter _
Field:=2, Criteria1:="完了"
On Error Resume Next
Set copyRange = wsSrc.Range(wsSrc.Cells(1, 1), wsSrc.Cells(lastRow, lastCol)).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If copyRange Is Nothing Then
MsgBox "条件に合うデータがありません。", vbExclamation
Exit Sub
End If
copyRange.Copy Destination:=wsDst.Range("A1")
MsgBox "抽出結果を別シートへコピーしました。", vbInformation
End Sub
応用①:抽出条件を変える
例えば「未処理」を抽出したい場合は、ここを書き換えます。
Field:=2, Criteria1:="未処理"
数値条件にも対応できます。
Field:=3, Criteria1:=">=100"
応用②:複数条件で抽出する
「完了」または「進行中」のように複数条件で抽出したい場合はこちらです。
wsSrc.Range(wsSrc.Cells(1, 1), wsSrc.Cells(lastRow, lastCol)).AutoFilter _
Field:=2, _
Criteria1:=Array("完了", "進行中"), _
Operator:=xlFilterValues
応用③:値だけ貼り付けたい場合
書式や罫線は不要で、値だけ転記したい場合は次の方法が便利です。
copyRange.Copy
wsDst.Range("A1").PasteSpecial xlPasteValues
Application.CutCopyMode = False
これなら転記先シートの見た目を自由に整えやすくなります。
実行手順(初心者向け)
- 元データがあるシートを開く
- Alt + F11 でVBAエディタを開く
- 「挿入」→「標準モジュール」
- コードを貼り付ける
- 必要に応じて条件や転記先シート名を変更する
- F5キーで実行する
実務での活用例
- 完了案件だけを別シートに一覧化する
- 未処理データだけを報告用に抜き出す
- 部署別・担当者別に抽出結果をまとめる
- 印刷前に必要なデータだけ別シートへ整理する
特に、元データが大きい表ほど「抽出結果だけ別シートにしたい」場面が増えるので、このマクロは実務向きです。
よくあるエラーと対処法
① 抽出結果シートが見つからない
Worksheets("抽出結果") の名前が実際のシート名と一致しているか確認してください。
不安なら「自動作成版」を使うと安全です。
② 条件に合うデータがないとエラーになる
SpecialCells(xlCellTypeVisible) は、対象が無いとエラーになることがあります。
この記事のコードでは copyRange Is Nothing を使って防いでいます。
③ フィルター範囲がずれる
見出し行が1行目にあることを前提にしています。
表の開始位置が違う場合は、範囲指定を調整してください。
④ コードは正しいのにエラーになる
Webからコピーしたコードでは、全角記号や見えない特殊文字が混ざることがあります。
その場合は、エラーの出ている行を削除して手入力し直すと解決することがあります。
まとめ
- オートフィルター後の表示行だけを別シートへコピーできる
SpecialCells(xlCellTypeVisible)がポイント- 条件や転記先は自由に変更できる
- 実務では報告・集計・整理用に非常に便利
抽出結果を別シートへ自動転記できるようになると、Excel業務の効率はかなり上がります。
特に、毎回同じ条件でデータを抜き出している方には非常におすすめです。
ぜひ実務のExcelでも活用してみてください。


コメント