配列にCOUNTIFを使ってみる
なぜか、ずっと思い込んでいた。WorkSheetFunction.Sumで足し算できるのは、一次元配列だけだと。しかし実際に、そんなことはない。
Sub Test() Dim arr As Variant arr = Selection MsgBox WorksheetFunction.Sum(arr) End Sub
二次元配列であっても、このようにちゃんと答えが返ってくる。
今となっては、なぜそう思い込んでいたか、定かでない。
思い込みとは、概してそういうものだ。
いい機会だ、他にも試してみよう。
Match関数
説明には、以下のように記されている。
指定された照合の種類に従って検査範囲内を検索し、検査値と一致する要素の、配列内での相対的な位置を表す数値を返す
早速試してみよう。以下の範囲で、数字の9を検索してみる。
Sub Test() Dim arr As Variant arr = Selection MsgBox WorksheetFunction.Match(9, arr, 0) End Sub
9は上から三番目で、メッセージボックスにも「3」と表示されている。
使えるようだ。
Count関数,CountA関数,CountBlank関数,CountIf関数
先程と同じ範囲で、以下の関数を試してみた。
- Count関数 範囲内の、数値が含まれるセルの個数を返す
- CountA関数 範囲内の、空白でないセルの個数を返す
- CountBlank関数 範囲内の、空白なセルの個数を返す
- CountIf関数 指定範囲のうち、検索条件に一致するセルの個数を返す
結果は、1勝2敗1引き分け(?)。
Sub Test() Dim arr As Variant arr = Selection Debug.Print WorksheetFunction.Count(arr) Debug.Print WorksheetFunction.CountA(arr) End Sub
先程と同じ範囲で実行すると、以下の結果が返った。
Count関数は正しい結果が返ったが、CountA関数が怪しい。範囲内のすべての要素数を返してしまっている。思わぬエラーに繋がりかねないので、事実が判明するまで、個人的に使用禁止にしよう(引き分け?)
(※もちろん、Worksheet上では正常に動作する)。
CountBlank関数とCountIf関数は、エラーが発生した。
ぬぬぬ残念。ちょっと期待してたのに。
でも、使う機会もありそうだから、ユーザー定義関数で作ってみた。
Function ArrayCountIF(source_array As Variant, _ search_criteria As Variant) As Long Dim Counter As Long Dim a As Variant On Error Resume Next For Each a In source_array If a = search_criteria Then Counter = Counter + 1 End If Next On Error GoTo 0 ArrayCountIF = Counter End Function
テスト結果はこちら。
何かと使えそうです。
参考まで。