【VBAスタンダード対策】WorksheetFunction.CountIf による条件付きデータ件数のカウントを攻略!
指定した条件に一致するセルの個数を数えるExcel関数 COUNTIF。VBAの WorksheetFunction オブジェクト を経由して呼び出す際の正しい構文と引数の指定方法をマスターしましょう。
1. 問題:WorksheetFunction オブジェクトを用いた COUNTIF 関数の実行
【 問題 】 下記のコードは、Sheet1 のセル範囲 A2:A100 の中から、セル B1 に入力されている検索条件に一致するセルの個数をカウントし、変数 cnt に格納してメッセージボックスに表示しようとしています。空欄 ( A ) に入る正しい記述はどれでしょうか?
Dim cnt As Long
Dim rng As Range
Dim criteriaCell As Range
Set rng = Worksheets("Sheet1").Range("A2:A100")
Set criteriaCell = Worksheets("Sheet1").Range("B1")
cnt = ( A )
MsgBox "該当件数: " & cnt & " 件"
End Sub
① WorksheetFunction.CountIf(rng, criteriaCell)
② Application.WorksheetFunction.CountIf(rng, criteriaCell)
③ Application.WorksheetFunction.CountIf(rng.Address, criteriaCell.Value)
④ WorksheetFunction.Count(rng, criteriaCell)
2. 正解:WorksheetFunction.CountIf の呼び出しに関する正解
正解: ② Application.WorksheetFunction.CountIf(rng, criteriaCell)
3. 解説:WorksheetFunction.CountIf の構文と引数指定のルール
VBAで条件付きカウントを行う際は、Application.WorksheetFunction.CountIf(範囲, 検索条件) の形式で呼び出します。
1. 階層構造の完全指定(Application.WorksheetFunction)
VBAの標準的な記法として、最上位の
Application オブジェクトから明示的に指定した Application.WorksheetFunction.CountIf(...) が最も厳密かつ推奨される呼び出し方法です。2. 検索対象の範囲は Range オブジェクトで渡す!
第1引数(カウント対象範囲)には、文字列アドレス(
"A2:A100")ではなく、Range オブジェクト(rng)を渡す必要があります。・③の
rng.Address のように文字列を渡すと型が一致せずエラーとなります。3. COUNT 関数との違い(④のひっかけ)
・
COUNT:数値が含まれるセルの個数を数える(条件指定不可)・
COUNTIF:指定した条件を満たすセルの個数を数えるそのため、条件セル(
criteriaCell)を指定して数える場合は CountIf を使う必要があります。ここが試験に出る!: スタンダード試験では、CountIf や SumIf などのワークシート関数を呼び出す際、「第1引数にセル範囲(Rangeオブジェクト)が正しくセットされているか」 や 「Application.WorksheetFunction のオブジェクト階層が正しいか」 が狙われます。
4. まとめ
「条件に一致する件数を数えるなら Application.WorksheetFunction.CountIf(範囲, 条件) 」。この構文をマスターしておけば、Forループで1行ずつ判定・カウントする重い処理を書かずに、1行のコードで高速にデータ件数を取得できるようになります。