Excelでデータを扱うとき、「オートフィルタで抽出した結果だけ処理したい」という場面は非常に多くあります。
しかし、VBAで単純に範囲を指定しても、非表示(フィルタで隠された)セルまで含まれてしまうため、思わぬ集計ミスや不要な処理が発生することがあります。
そこで重要になるのが、「可視セルのみを取得する」という考え方です。
この記事では、オートフィルタで抽出したデータの中から「表示されているセルだけ」をVBAで正確に取得し、後続の処理に活用する方法を詳しく解説します。
目次
- ✅ 可視セルを取得する必要性とは?
- ・フィルタ後のデータだけを扱いたいときに必須
- ✅ 可視セルを取得する基本構文
- ・フィルタ後のデータを取得するシンプルな例
- ✅ コードのポイントと仕組み解説
- ・1. AutoFilter.Rangeで範囲全体を取得
- ・2. .Offset(1, 0)でヘッダーを除外
- ・3. .SpecialCells(xlCellTypeVisible)で可視セル抽出
- ・4. On Error Resume Nextでエラーを回避
- ✅ 可視セルの取得結果を別の処理に活用する
- ・例1:可視セルだけコピーして別シートへ貼り付け
- ・例2:可視セルの合計値を求める
- ✅ 注意点:可視セル取得で起こりやすいエラーと対策
- ・1. 可視セルが存在しないときのエラー
- ・2. フィルタが設定されていない場合
- ・3. 複数範囲(Areas)に分かれる場合
- ✅ 実務での応用例:フィルタ条件をVBAで設定してから可視セル取得
- ✅ 応用:可視セルをDictionaryや配列で扱う
- ✅ まとめ:可視セル取得でフィルタ処理を安全・確実に自動化しよう
✅ 可視セルを取得する必要性とは?
・フィルタ後のデータだけを扱いたいときに必須
オートフィルタを使うと、条件に一致しない行が非表示になります。
見た目上は必要なデータだけ表示されていますが、VBAの通常処理では非表示の行も含まれてしまいます。
たとえば「部門ごとの売上を集計」するマクロを作成するとき、フィルタで「営業部」だけを表示しても、
そのまま Range("A2:A100")
を指定すれば全データが対象になります。
このような誤集計を防ぐには、可視セル(表示されているセル)だけを抽出する必要があります。
VBAではこれを SpecialCells(xlCellTypeVisible)
で実現できます。
参考:【VBA】条件に一致するセルを取得する方法|Find・For Each・SpecialCells
✅ 可視セルを取得する基本構文
・フィルタ後のデータを取得するシンプルな例
以下のコードでは、オートフィルタが設定されたシートから可視セル(表示されているセル)を取得し、メッセージボックスで件数を表示します。
Sub GetVisibleCells()
Dim ws As Worksheet
Dim rng As Range
Dim visibleCells As Range
Dim countVisible As Long
' 対象シートを設定
Set ws = ThisWorkbook.Sheets("データ")
' オートフィルタが設定されていなければ終了
If ws.AutoFilterMode = False Then
MsgBox "オートフィルタが設定されていません。", vbExclamation
Exit Sub
End If
' フィルタ範囲を取得
Set rng = ws.AutoFilter.Range
' 可視セルのみ取得(ヘッダーを除外)
On Error Resume Next
Set visibleCells = rng.Offset(1, 0).Resize(rng.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
' 可視セルがある場合の処理
If Not visibleCells Is Nothing Then
countVisible = visibleCells.Areas(1).Rows.Count
MsgBox "可視セルの件数は " & countVisible & " 行です。", vbInformation
Else
MsgBox "可視セルが見つかりません。", vbExclamation
End If
End Sub
✅ コードのポイントと仕組み解説
・1. AutoFilter.Rangeで範囲全体を取得
オートフィルタが設定された表の範囲を自動的に特定します。
手動で Range("A1:D100")
のように指定するよりも柔軟です。
・2. .Offset(1, 0)でヘッダーを除外
通常、フィルタ範囲の最初の行はヘッダーです。
そのため、1行下からデータ部分だけを扱うように調整します。
・3. .SpecialCells(xlCellTypeVisible)で可視セル抽出
ここが最重要部分です。
この指定により、非表示の行は除外され、現在表示されている行(可視セル)だけが取得されます。
・4. On Error Resume Nextでエラーを回避
可視セルが存在しない(=すべて非表示)場合、VBAはエラーを返します。
そのため、エラー制御を入れておくことで実務でも安全に動作します。
参考:【VBA】On Error Resume Nextでエラーを無視してエラーの制御
✅ 可視セルの取得結果を別の処理に活用する
・例1:可視セルだけコピーして別シートへ貼り付け
Sub CopyVisibleCells()
Dim ws As Worksheet
Dim rng As Range
Dim visibleCells As Range
Set ws = ThisWorkbook.Sheets("データ")
If ws.AutoFilterMode = False Then
MsgBox "フィルタが設定されていません。", vbExclamation
Exit Sub
End If
Set rng = ws.AutoFilter.Range
On Error Resume Next
Set visibleCells = rng.Offset(1, 0).Resize(rng.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not visibleCells Is Nothing Then
visibleCells.Copy Destination:=ThisWorkbook.Sheets("結果").Range("A1")
MsgBox "可視セルのみコピーしました。", vbInformation
Else
MsgBox "コピー対象が見つかりません。", vbExclamation
End If
End Sub
このマクロを使えば、フィルタで絞り込んだデータだけを「結果」シートへ転記できます。
大量データの抽出や報告資料の作成に最適な方法です。
参考:【VBA】可視セルのみを処理する方法|非表示セルを除外して安全に自動化する
・例2:可視セルの合計値を求める
Sub SumVisibleCells()
Dim ws As Worksheet
Dim visibleRange As Range
Dim total As Double
Set ws = ThisWorkbook.Sheets("データ")
On Error Resume Next
Set visibleRange = ws.Range("C2:C100").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not visibleRange Is Nothing Then
total = WorksheetFunction.Sum(visibleRange)
MsgBox "可視セルの合計値は " & total & " です。", vbInformation
Else
MsgBox "集計対象が見つかりません。", vbExclamation
End If
End Sub
この方法では、フィルタで抽出した売上や数量データの合計値を正確に求められます。
非表示の行を無視できるため、実務上の誤集計を防げます。
✅ 注意点:可視セル取得で起こりやすいエラーと対策
・1. 可視セルが存在しないときのエラー
SpecialCells(xlCellTypeVisible)
は、該当セルがない場合にエラー(1004)を返します。
実務ではよくあるケースなので、On Error Resume Next
を必ず入れましょう。
・2. フィルタが設定されていない場合
AutoFilter.Range
は、フィルタが設定されていない状態で呼び出すとエラーになります。
そのため、最初に If ws.AutoFilterMode = False Then Exit Sub
を入れるのが安全です。
・3. 複数範囲(Areas)に分かれる場合
抽出結果が飛び飛びのセルになっているとき、visibleCells.Areas
のように複数領域になることがあります。
その場合、For Each area In visibleCells.Areas
のようにループで処理しましょう。
For Each area In visibleCells.Areas
Debug.Print area.Address
Next area
これにより、個々のブロックを正確に処理できます。
✅ 実務での応用例:フィルタ条件をVBAで設定してから可視セル取得
オートフィルタをVBAで設定し、その結果だけを可視セルとして扱う流れも実務ではよく使われます。
Sub FilterAndGetVisibleCells()
Dim ws As Worksheet
Dim visibleCells As Range
Set ws = ThisWorkbook.Sheets("データ")
' 部門列(B列)で「営業部」を抽出
ws.Range("A1").AutoFilter Field:=2, Criteria1:="営業部"
' 可視セルを取得
On Error Resume Next
Set visibleCells = ws.AutoFilter.Range.Offset(1, 0).Resize(ws.AutoFilter.Range.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
' 結果をメッセージで確認
If Not visibleCells Is Nothing Then
MsgBox "営業部のデータは " & visibleCells.Areas(1).Rows.Count & " 行あります。", vbInformation
Else
MsgBox "該当データがありません。", vbExclamation
End If
ws.AutoFilterMode = False
End Sub
この方法を使えば、条件指定からデータ抽出、結果確認までを1クリックで自動化できます。
営業・在庫・勤怠など、あらゆる業務シーンに応用できます。
✅ 応用:可視セルをDictionaryや配列で扱う
可視セルから取得したデータを配列に格納すれば、さらに高度な分析や転記が可能です。
Sub StoreVisibleCellsInArray()
Dim ws As Worksheet
Dim visibleCells As Range
Dim dataArr() As Variant
Set ws = ThisWorkbook.Sheets("データ")
On Error Resume Next
Set visibleCells = ws.Range("A2:A100").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not visibleCells Is Nothing Then
dataArr = visibleCells.Value
MsgBox "可視セルデータを配列に格納しました(要素数:" & UBound(dataArr) & ")。", vbInformation
End If
End Sub
配列に格納しておけば、重複チェックやソート、他のブックへの転記など、さらに効率的なデータ操作が可能になります。
✅ まとめ:可視セル取得でフィルタ処理を安全・確実に自動化しよう
SpecialCells(xlCellTypeVisible)
でオートフィルタ後の表示セルだけを取得できるAutoFilter.Range
と組み合わせると、表範囲を自動判定できて柔軟- 可視セルのコピー・集計・転記など、実務処理に幅広く応用可能
On Error Resume Next
によるエラー制御で安全なマクロを構築- 配列やDictionaryに格納すればさらに応用が広がる
オートフィルタと可視セル取得を組み合わせることで、Excelの「抽出→処理→集計」という一連の流れを完全自動化できます。
単純な操作の繰り返しをVBAで置き換えれば、業務時間を大幅に短縮できるでしょう。
ぜひこのテクニックを実務で活用し、「正確で無駄のないExcel処理」を実現してください。