Excelでフィルター機能を使って特定のデータを絞り込んだあと、その結果だけをコピーしたいことがあります。
見えているデータだけを別シートにコピーしたいのに、「非表示の行までコピーされてしまう…」というトラブルはよくある話です。
今回は、VBAを使って抽出結果だけを正確にコピーする方法を紹介します。
フィルター結果だけをコピーするには?
通常のコピーでは、見た目では非表示の行も対象に含まれてしまいます。
そこで、「可視セルだけをコピーする」という考え方が必要になります。
そのために使うのが、次のようなコードです。
Sub CopyFilteredData()
Dim src As Worksheet
Dim dst As Worksheet
Set src = Worksheets("元データ")
Set dst = Worksheets("コピー先")
' フィルター済みのデータ範囲を指定(例:A1:D100)
With src.Range("A1").CurrentRegion
' 可視セルのみをコピー
.SpecialCells(xlCellTypeVisible).Copy
' コピー先の先頭セルに貼り付け
dst.Range("A1").PasteSpecial xlPasteValues
End With
Application.CutCopyMode = False
MsgBox "フィルター結果をコピーしました"
End Sub
コードの解説
このマクロは次のような流れで処理をしています。※フィルターがかかっている前提で設定しています。
- コピー元と貼り付け先のシートを指定
CurrentRegionでフィルター対象の表範囲を取得.SpecialCells(xlCellTypeVisible)で表示されているセルだけを抽出PasteSpecial xlPasteValuesで値だけを貼り付け
実装するメリット
この方法を使うことで、次のような効果があります。
- 非表示データを誤ってコピーするミスを防げる
- 自動処理で作業スピードが格段に上がる
- 表の整形や出力処理の精度が上がる
とくにレポート作成や、条件付きのデータ出力において非常に有効です。
注意点と応用例
注意すべき点
SpecialCells(xlCellTypeVisible)は、フィルターがかかっていないとエラーになることがあります- フィルターを事前に適用しておく必要があります(自動でかけたい場合は
AutoFilterを組み合わせてください)
応用:フィルターもVBAで設定する
フィルターの設定からコピーまで一気に行いたい場合は、次のような書き方も可能です。
Sub FilterAndCopy()
Dim src As Worksheet
Dim dst As Worksheet
Set src = Worksheets("元データ")
Set dst = Worksheets("コピー先")
' フィルターの設定(例:C列に「OK」のデータだけを表示)
With src
.Range("A1").CurrentRegion.AutoFilter Field:=3, Criteria1:="OK"
.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
End With
dst.Range("A1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
MsgBox "フィルター結果をコピーしました"
End Sub
このようにすることで、「フィルター条件を指定 → 抽出されたデータのみをコピー」という流れを完全に自動化できます。
まとめ
「抽出したデータだけをコピーしたい」というのは、Excel業務でよくあるニーズです。
マクロを使えば、次のようなメリットがあります。
- フィルター結果だけを正確に抽出できる
- 作業スピードとミス防止の両立が可能
- 応用すれば抽出からコピーまでワンステップにできる
VBAでコピー処理を組む際は、「可視セルだけを扱う」という考え方がとても重要です。
業務の一手間を減らす一歩として、ぜひこのマクロを活用してみてください。
