ExcelでCOUNTGを使う
表内の特定項目内のデータの種類を集計したいという要望があり、自前の関数ストックから改良版を作成したのでここにも掲載しておきます。需要あるかな?
エクセルの指定範囲内に存在するデータをカウントするCOUNT関数に似ていますが、重複データを1つと見なします。
強いて言うなら CountGroup関数 という感じで、引数範囲に含まれるデータの種類をカウントできます。
範囲内に、「a」「b」「c」「c」「d」とデータがあった場合、Count関数やCountA関数では5とカウントしますが、本関数は4(cが重複するので4種類のデータ)とカウントします。
データの数ではなく、重複を除いたデータリストそのものを取得したい場合は、COUNTG関数が内部から呼ぶLISTG関数を使うことで、該当データを配列変数として取得できます。
(※COUNTG関数の動作にはLISTG関数が必要です。それぞれスコープの通ったモジュール内に置いて下さい)
見て分かるとおり、LISTG関数(つまりCOUNTG関数も)は複数列、複数行、複数Rangeに対応しています。
ヌルや空文字はカウント対象にしていません。
範囲内のセルが全て空文字だった場合(列挙すべきデータが無かった場合)は、長さゼロの配列に空文字が入ったもの(array("")に相当)が返ります。
COUNTG関数
Public Function COUNTG(TargetArea As Range) As Variant ' 指定範囲のデータの種類を返す Dim Groups As Variant ' 要素抽出関数をコール Groups = LISTG(TargetArea) ' 返値の配列をチェック If (UBound(Groups) = 0) And _ (Groups(0) = "") Then ' 配列内にデータが無い COUNTG = 0 Else ' 要素数を返す COUNTG = UBound(Groups) - _ LBound(Groups) + 1 End If End Function
LISTG関数
Public Function LISTG(TargetArea As Range) As Variant ' 指定されたセル範囲から、同じデータをまとめて配列化 Dim Groups() As Variant Dim CT As Long Dim Rng As Range Dim ChkVal As Variant Dim ScnVal As Variant Dim FL As Boolean CT = 0 ReDim Groups(CT) Groups(CT) = "" ' 指定セル範囲を全スキャン For Each Rng In TargetArea.Areas For Each ChkVal In Rng ' プリチェック If Not IsNull(ChkVal) Then If ChkVal <> "" Then ' バッファ検索 FL = False For Each ScnVal In Groups If ScnVal = ChkVal Then FL = True Exit For End If Next ScnVal If Not (FL) Then ' 新出データを追加 CT = CT + 1 ReDim Preserve Groups(CT - 1) Groups(CT - 1) = ChkVal End If End If End If Next ChkVal Next Rng ' 結果を返す LISTG = Groups End Function