【ExcelVBA・マクロ】オートフィルターの抽出結果を別シートへコピーする方法|条件に合うデータだけ転記【コピペOK】

オートフィルターの抽出結果を別シートへコピー ExcelVBA

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

これなら転記先シートの見た目を自由に整えやすくなります。


実行手順(初心者向け)

  1. 元データがあるシートを開く
  2. Alt + F11 でVBAエディタを開く
  3. 「挿入」→「標準モジュール」
  4. コードを貼り付ける
  5. 必要に応じて条件や転記先シート名を変更する
  6. F5キーで実行する

実務での活用例

  • 完了案件だけを別シートに一覧化する
  • 未処理データだけを報告用に抜き出す
  • 部署別・担当者別に抽出結果をまとめる
  • 印刷前に必要なデータだけ別シートへ整理する

特に、元データが大きい表ほど「抽出結果だけ別シートにしたい」場面が増えるので、このマクロは実務向きです。


よくあるエラーと対処法

① 抽出結果シートが見つからない

Worksheets("抽出結果") の名前が実際のシート名と一致しているか確認してください。
不安なら「自動作成版」を使うと安全です。

② 条件に合うデータがないとエラーになる

SpecialCells(xlCellTypeVisible) は、対象が無いとエラーになることがあります。
この記事のコードでは copyRange Is Nothing を使って防いでいます。

③ フィルター範囲がずれる

見出し行が1行目にあることを前提にしています。
表の開始位置が違う場合は、範囲指定を調整してください。

④ コードは正しいのにエラーになる

Webからコピーしたコードでは、全角記号や見えない特殊文字が混ざることがあります。
その場合は、エラーの出ている行を削除して手入力し直すと解決することがあります。


まとめ

  • オートフィルター後の表示行だけを別シートへコピーできる
  • SpecialCells(xlCellTypeVisible) がポイント
  • 条件や転記先は自由に変更できる
  • 実務では報告・集計・整理用に非常に便利

抽出結果を別シートへ自動転記できるようになると、Excel業務の効率はかなり上がります。
特に、毎回同じ条件でデータを抜き出している方には非常におすすめです。
ぜひ実務のExcelでも活用してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました