配列にCOUNTIFを使ってみる

f:id:Infoment:20191125222030p:plain
なぜか、ずっと思い込んでいた。WorkSheetFunction.Sumで足し算できるのは、一次元配列だけだと。しかし実際に、そんなことはない。

Sub Test()
    Dim arr As Variant
        arr = Selection
                
        MsgBox WorksheetFunction.Sum(arr)
End Sub

二次元配列であっても、このようにちゃんと答えが返ってくる。
f:id:Infoment:20191125221705p:plain

今となっては、なぜそう思い込んでいたか、定かでない。
思い込みとは、概してそういうものだ。

いい機会だ、他にも試してみよう。

Match関数

説明には、以下のように記されている。

指定された照合の種類に従って検査範囲内を検索し、検査値と一致する要素の、配列内での相対的な位置を表す数値を返す

早速試してみよう。以下の範囲で、数字の9を検索してみる。
f:id:Infoment:20191125222456p:plain

Sub Test()
    Dim arr As Variant
        arr = Selection
                
        MsgBox WorksheetFunction.Match(9, arr, 0)
End Sub

9は上から三番目で、メッセージボックスにも「3」と表示されている。
使えるようだ。
f:id:Infoment:20191125222742p:plain

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

先程と同じ範囲で実行すると、以下の結果が返った。
f:id:Infoment:20191125223939p:plain

Count関数は正しい結果が返ったが、CountA関数が怪しい。範囲内のすべての要素数を返してしまっている。思わぬエラーに繋がりかねないので、事実が判明するまで、個人的に使用禁止にしよう(引き分け?)
(※もちろん、Worksheet上では正常に動作する)。

CountBlank関数とCountIf関数は、エラーが発生した。
f:id:Infoment:20191125224254p:plain

ぬぬぬ残念。ちょっと期待してたのに。
でも、使う機会もありそうだから、ユーザー定義関数で作ってみた。

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

テスト結果はこちら。
f:id:Infoment:20191125224504p:plain

何かと使えそうです。

参考まで。