こんにちは、Ryoです。
オートフィルタが設定されている場合に「表示されているセルのみをカウント」したいケースがあるかと思います。この場合はCountプロパティに合わせてSpecialCellsメソッドを利用することで非表示部分を除外し表示部分のみをカウントすることが可能なので、今回はこの内容について書いていきます。
1.サンプル概要
下の画像の表をサンプルとして準備しています。

この表に対してオートフィルタを利用して「コード:B」のみの表示とします。

この状態でCountプロパティを利用してオートフィルタがかかっている表でのセル数を求めると、表示上は5件であっても非表示分を含んでしまうので「10件」となってしまいます。

可視セルのみを選択してカウントするにはSpecialCellsメソッドを利用することで指定条件に合致するセルを取得することが可能になり、表示通り「5件」とカウントすることができます。

以上がサンプル概要になります。
2.サンプルコード
Sub Sample1()
'セルA1を含む表の1列目を取得し可視セルをカウント
'タイトル行の分として1をカウント数からマイナスし、
'メッセージボックスで表示する
MsgBox "コードBの件数: " & _
Range("A1").CurrentRegion.Resize(, 1) _
.SpecialCells(xlCellTypeVisible).Count - 1 _
& "件"
'***引数Typeの指定値***
'xlCellTypeAllFormatConditions
' →表示形式が設定されているセル
'xlCellTypeAllValidation
' →条件の設定が含まれているセル
'xlCellTypeBlanks
' →空白セル
'xlCellTypeComments
' →コメントが含まれているセル
'xlCellTypeConstants
' →定数が含まれているセル
'xlCellTypeFormulas
' →数式が含まれているセル
'xlCellTypeLastCell
' →使われたセル範囲内の最後のセル
'xlCellTypeSameFormatConditions
' →同じ表示形式が設定されているセル
'xlCellTypeSameValidation
' →同じ条件の設定が含まれているセル
'xlCellTypeVisible
' →すべての可視セル
End Sub
構文:オブジェクト.SpecialCells(Type,Value)
SpecialCellsメソッドを利用することで指定された条件を満たすセルを取得することができます。今回のサンプルでは可視セルを選択するので、引数TypeにxlCellTypeVisibleを指定しています。(その他の指定値はサンプルコード内コメントに記述)
先ずセルA1 を含む表全体をCurrentRegionで選択し、Resizeで表の1列目を取得しています。その1列目に対して「可視セルの個数をカウント」するようにSpecialCellsメソッド(Type=xlCellTypeVisible)を利用しています。
カウント数にはタイトル行も含まれているので総カウント数から1を減算し、その結果をメッセージボックスに表示するものです。
ちなみにサンプル概要で挙げている非表示セルも含めてカウントしている記述は以下の通りSpecialCellsメソッドを利用しない処理によるものですので、ご参考までに。
Sub Sample2()
MsgBox "コードBの件数: " & _
Range("A1").CurrentRegion.Resize(, 1) _
.Count - 1 & "件"
End Sub
3.まとめ
オートフィルタが設定されている表でセル数をカウントするようなケースも用途によって発生するので、知っておくと有用かと思います。
ちなみにSpecialCellsメソッドで指定した内容に対し該当するセルがない場合はエラーとなりますので、その点にはご注意ください。
以上、可視セルのみ選択しカウントする方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo

