VBAでフィルターをかけた後に見えているデータだけをコピーするには、SpecialCells(xlCellTypeVisible) を使います。
これを使わないと、非表示になっている行までコピーされてしまうので注意が必要です。
この記事では、次の内容を順番に解説します。
- 見えているデータだけをコピーする基本のコード
- SpecialCellsとは何か
- フィルターをかけてからコピーまで一気に行う方法
見えているデータだけをコピーするには?
フィルターをかけた状態で通常のコピーをすると、非表示になっている行も含めてコピーされてしまいます。見えているデータだけをコピーするには、SpecialCells(xlCellTypeVisible) を使います。
Sub CopyFilteredData()
Dim src As Worksheet
Dim dst As Worksheet
Set src = Worksheets("元データ")
Set dst = Worksheets("コピー先")
' 見えているセルだけをコピーする
src.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
' 値だけを貼り付ける
dst.Range("A1").PasteSpecial xlPasteValues
Application.CutCopyMode = False
MsgBox "フィルター結果をコピーしました"
End Sub
コードの流れ
- コピー元(元データシート)とコピー先(コピー先シート)を設定します。
CurrentRegionでデータが入っている表の範囲をまとめて取得します。SpecialCells(xlCellTypeVisible)で、その中の「今見えているセルだけ」を対象にします。PasteSpecial xlPasteValuesで値だけを貼り付けます。書式や数式は貼り付けません。Application.CutCopyMode = Falseでコピーモードを解除します(セルの点線が消えます)。
このコードはフィルターがすでにかかっている前提で動きます。フィルターがかかっていない状態で実行すると、全データがコピーされます。
SpecialCellsとは?
SpecialCells は「特定の条件に合うセルだけを選ぶ」機能です。xlCellTypeVisible を指定すると「今画面に見えているセルだけ」を選べます。
手動で操作する場合は、Ctrl+Shift+Endで範囲を選んだ後にF5→「セル選択」→「可視セル」で同じことができますが、VBAでは SpecialCells(xlCellTypeVisible) と書くだけで済みます。
フィルターをかけてからコピーまで一気に行うには?
フィルターをかける操作からコピーまでをまとめて自動化したい場合は、AutoFilter と組み合わせます。
Sub FilterAndCopy()
Dim src As Worksheet
Dim dst As Worksheet
Set src = Worksheets("元データ")
Set dst = Worksheets("コピー先")
' C列が「OK」のデータだけを表示するフィルターをかける
src.Range("A1").CurrentRegion.AutoFilter Field:=3, Criteria1:="OK"
' 見えているデータだけをコピーする
src.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
' 値だけを貼り付ける
dst.Range("A1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
MsgBox "フィルター結果をコピーしました"
End Sub
コードの解説
AutoFilter Field:=3, Criteria1:="OK"はC列(3列目)で「OK」に一致する行だけを表示するフィルターをかけます。Fieldの数字は列番号です。A列なら1、B列なら2、C列なら3です。Criteria1は絞り込む条件です。文字列の場合は"OK"のようにダブルクォーテーションで囲みます。
まとめ
フィルター結果だけをコピーするには SpecialCells(xlCellTypeVisible) が必須です。これを使わないと非表示の行も一緒にコピーされてしまいます。
- 見えているデータだけをコピー:
SpecialCells(xlCellTypeVisible).Copyを使う。 - 値だけを貼り付け:
PasteSpecial xlPasteValuesで書式や数式を除いた値だけを貼り付ける。 - フィルターと組み合わせる:
AutoFilterでフィルターをかけてからSpecialCellsでコピーすると一気に自動化できる。 - フィルターがない状態では全データがコピーされる:フィルターがかかっていることを確認してから実行する。
よくある質問
フィルターがかかっていないときにSpecialCellsを使うとどうなる?
フィルターがかかっていない場合、非表示の行がないため全データが「見えているセル」として扱われます。結果として全データがコピーされます。エラーにはなりませんが、意図した動きにならないので、フィルターがかかっているかどうかを確認してから実行しましょう。
コピー後にフィルターを解除したい場合は?
コードの最後に src.AutoFilterMode = False を追加するとフィルターが解除されます。コピーが終わった後に元のシートをきれいな状態に戻したい場合に使います。
コピー先のシートを毎回空にしてから貼り付けたい場合は?
貼り付けの前に dst.Cells.Clear を入れると、コピー先のシートの内容をすべて消してから貼り付けられます。毎回新しい結果だけが入った状態にしたい場合に便利です。
複数の条件でフィルターをかけるには?
AutoFilter の Criteria1 と Criteria2 を使うと2つの条件を組み合わせられます。たとえば「OK」または「済」を絞り込みたい場合は Criteria1:="OK", Operator:=xlOr, Criteria2:="済" と書きます。
値だけでなく書式もそのままコピーしたい場合は?
PasteSpecial xlPasteValues の代わりに PasteSpecial xlPasteAll を使うと、値・書式・数式をすべて含めて貼り付けられます。ただし数式も一緒に貼り付けられるため、値だけ貼り付けたい場合は xlPasteValues を使いましょう。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



