オートフィルタを使ってデータを抽出したあと、
抽出結果だけを別シートにコピーしたいケースはよくあります。
手作業では「可視セルのみをコピー」しますが、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. コード解説
rng.AutoFilter
A1:C20の範囲にフィルタを設定(3列目が100以上のデータを抽出)。SpecialCells(xlCellTypeVisible)
フィルタで表示されているセルだけをコピー。非表示セルは無視されます。Destination:=wsDst.Range("A1")
コピー先のシート(Sheet2)のA1に貼り付けます。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
で直接指定すると便利 - 抽出結果がゼロ件の場合はエラーになるので回避処理を入れる
これで「フィルタ → 抽出結果を別シートにコピー」の自動化が実現できます。
コメント