スポンサーリンク

【VBA】フィルタ結果のみを別シートにコピーする方法

オートフィルタを使ってデータを抽出したあと、
抽出結果だけを別シートにコピーしたいケースはよくあります。

手作業では「可視セルのみをコピー」しますが、VBAでも同様の処理が可能です。


スポンサーリンク

1. 基本構文

Range("範囲").SpecialCells(xlCellTypeVisible).Copy Destination:=コピー先
  • SpecialCells(xlCellTypeVisible)
    フィルタで「表示されているセルのみ」を取得します。
  • Copy Destination
    コピー先を直接指定します。

スポンサーリンク

2. 実用例:抽出結果を別シートにコピー

Sub フィルタ結果をコピー()
    Dim wsSrc As Worksheet
    Dim wsDst As Worksheet
    Dim rng As Range
    
    '元データのシートとコピー先のシートを指定
    Set wsSrc = ThisWorkbook.Sheets("Sheet1")
    Set wsDst = ThisWorkbook.Sheets("Sheet2")
    
    'フィルタ対象の範囲
    Set rng = wsSrc.Range("A1:C20")
    
    '売上列(3列目)が100以上を抽出
    rng.AutoFilter Field:=3, Criteria1:=">=100"
    
    'フィルタ結果(可視セル)をコピーして貼り付け
    rng.SpecialCells(xlCellTypeVisible).Copy Destination:=wsDst.Range("A1")
    
    'フィルタを解除
    If wsSrc.FilterMode Then wsSrc.ShowAllData
    
    MsgBox "フィルタ結果をコピーしました!"
End Sub

スポンサーリンク

3. コード解説

  1. rng.AutoFilter
    A1:C20の範囲にフィルタを設定(3列目が100以上のデータを抽出)。
  2. SpecialCells(xlCellTypeVisible)
    フィルタで表示されているセルだけをコピー。非表示セルは無視されます。
  3. Destination:=wsDst.Range("A1")
    コピー先のシート(Sheet2)のA1に貼り付けます。
  4. ShowAllData
    コピー後にフィルタを解除して元の状態に戻します。

スポンサーリンク

4. トラブル回避のポイント

  • 抽出結果が存在しない場合SpecialCells(xlCellTypeVisible) はエラーになります。
    そのため、事前に On Error Resume Next(以降のエラー無視) を入れるか、件数をチェックすると安全です。

例:

On Error Resume Next
rng.SpecialCells(xlCellTypeVisible).Copy Destination:=wsDst.Range("A1")
If Err.Number <> 0 Then
    MsgBox "抽出結果がありません。"
    Err.Clear
End If
On Error GoTo 0
  • 見出し行もコピーされるため、必要に応じてデータ部分だけに範囲を指定しましょう。

5. まとめ

  • フィルタ結果のみをコピーするには SpecialCells(xlCellTypeVisible) を使う
  • コピー先は Destination で直接指定すると便利
  • 抽出結果がゼロ件の場合はエラーになるので回避処理を入れる

これで「フィルタ → 抽出結果を別シートにコピー」の自動化が実現できます。

コメント

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