VBAでフィルター後の見えているデータだけをコピーする方法|SpecialCellsの使い方

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 を入れると、コピー先のシートの内容をすべて消してから貼り付けられます。毎回新しい結果だけが入った状態にしたい場合に便利です。

複数の条件でフィルターをかけるには?

AutoFilterCriteria1Criteria2 を使うと2つの条件を組み合わせられます。たとえば「OK」または「済」を絞り込みたい場合は Criteria1:="OK", Operator:=xlOr, Criteria2:="済" と書きます。

値だけでなく書式もそのままコピーしたい場合は?

PasteSpecial xlPasteValues の代わりに PasteSpecial xlPasteAll を使うと、値・書式・数式をすべて含めて貼り付けられます。ただし数式も一緒に貼り付けられるため、値だけ貼り付けたい場合は xlPasteValues を使いましょう。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール