【Excel VBA】AutoFilterで絞り込んだ可視セルだけをコピーする方法|SpecialCellsを使用
みなさんこんにちは。
Excel VBAでAutoFilterを使ってデータを絞り込んだあと、表示されている行だけを別シートへコピーしたいことがあるかと思います。
その場合は、SpecialCells(xlCellTypeVisible)を使うと、フィルター後の可視セルだけを取得できます。
今回は、AutoFilterで絞り込んだ可視セルだけをコピーする方法をご紹介したいと思います。
この記事はこんな人におすすめ
- AutoFilterで絞り込んだ行だけをコピーしたい人
- SpecialCells(xlCellTypeVisible)の使い方を知りたい人
- 該当データがない場合のエラーも対策したい人
AutoFilterでデータを絞り込む
今回は、A列からD列までデータがあり、C列の「状態」が「完了」の行だけをコピーする例で確認します。

Dim ws As Worksheet
Dim lastRow As Long
'========================================
' 対象シートと最終行を取得する
'========================================
Set ws = Worksheets("データ")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
'========================================
' C列が「完了」の行だけを表示する
'========================================
ws.Range("A1:D" & lastRow).AutoFilter _
Field:=3, _
Criteria1:="完了"

SpecialCellsで可視セルだけを取得する
次に、フィルター後に表示されているデータ行だけを取得します。
Dim visibleRange As Range
'========================================
' 表示されているデータ行だけを取得する
'========================================
Set visibleRange = ws.Range( _
"A2:D" & lastRow _
).SpecialCells(xlCellTypeVisible)
xlCellTypeVisibleを指定すると、非表示行を除いたセルだけをRangeとして取得できます。
可視セルだけを別シートへコピーする
Dim outputWs As Worksheet
'========================================
' コピー先シートを取得する
'========================================
Set outputWs = Worksheets("出力")
'========================================
' 見出しと可視セルをコピーする
'========================================
ws.Range("A1:D1").Copy _
Destination:=outputWs.Range("A1")
visibleRange.Copy _
Destination:=outputWs.Range("A2")
これで、AutoFilterで表示されているデータだけを「出力」シートへコピーできます。

該当データがない場合のエラーを防ぐ
条件に一致する行がない場合は、SpecialCellsでエラーになることがあります。取得部分だけエラーを無視し、Rangeを取得できたか確認しておくと安全です。
Dim visibleRange As Range
'========================================
' 可視セル取得時のエラーだけ無視する
'========================================
On Error Resume Next
Set visibleRange = ws.Range( _
"A2:D" & lastRow _
).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
'========================================
' 対象データがない場合
'========================================
If visibleRange Is Nothing Then
MsgBox "条件に一致するデータがありません。"
Exit Sub
End If
On Error Resume Nextは広い範囲に設定せず、SpecialCellsを実行する部分だけに限定するのがおすすめです。
既存のAutoFilter記事について
複数条件で絞り込みたい場合は、以前の記事
も参考にしてください。
最後に
いかがでしたでしょうか。
今回は、Excel VBAでAutoFilterを使って絞り込んだあと、SpecialCellsを利用して可視セルだけをコピーする方法をご紹介しました。
フィルター後の表示行だけを転記したい場合に便利なので、該当データがない場合の対策とあわせて活用してください。
少しでも参考になれば幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
業務の流れをまるごと自動化します Excel・Web・Teams・SaaSで業務全体を自動化Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
