【Excel VBA】AutoFilterで絞り込んだ可視セルだけをコピーする方法|SpecialCellsを使用

みなさんこんにちは。

Excel VBAでAutoFilterを使ってデータを絞り込んだあと、表示されている行だけを別シートへコピーしたいことがあるかと思います。

その場合は、SpecialCells(xlCellTypeVisible)を使うと、フィルター後の可視セルだけを取得できます。

今回は、AutoFilterで絞り込んだ可視セルだけをコピーする方法をご紹介したいと思います。

この記事はこんな人におすすめ

  • AutoFilterで絞り込んだ行だけをコピーしたい人
  • SpecialCells(xlCellTypeVisible)の使い方を知りたい人
  • 該当データがない場合のエラーも対策したい人

AutoFilterでデータを絞り込む

今回は、A列からD列までデータがあり、C列の「状態」が「完了」の行だけをコピーする例で確認します。

Excel VBAのAutoFilterで絞り込む前の一覧データ
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:="完了" 
Excel VBAのAutoFilterで状態が完了の行だけに絞り込んだ画面

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で表示されているデータだけを「出力」シートへコピーできます。

Excel VBAのSpecialCellsで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アプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

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

CAPTCHA