##はじめに
タイトルがわかりにくいのですが、下のイメージのように、掃除当番表のようなテーブルがあり、月曜はグループ1の人が何人、グループ2の人が何人で、火曜は・・・ということを知りたいなと思い、VBAの関数を作成しました。
##コード
さっそくコードを書きます。
Function CountMember(member_list_rng As Range, target_rng As Range) As Long
Dim members As Variant
members = member_list_rng
Dim rng As Range
Dim i, n As Long
n = 0
For Each rng In target_rng
For i = 1 To UBound(members, 1)
If StrComp(rng.Value, members(i, 1)) = 0 Then
n = n + 1
End If
Next i
Next
CountMember = n
End Function
##処理の流れ
続いて、処理の流れを説明します。
第一引数(member_list_rng)は、グループのメンバー一覧が記載されたRangeオブジェクト、第二引数(target_rng)は、調べたい対象のRangeオブジェクトとします。
まず、Variant型の変数(members)に第一引数のRangeオブジェクトを格納すると、グループのメンバーが配列となってmembersに格納されます。
この配列は二次元の配列になり、また、インデックスは0からではなく、1から始まることに注意が必要です。
例えば、以下のようなA1〜C5のセル範囲をmembersに格納すると、members(1 To 5, 1 To 3)となります。一次元目が行数、二次元目が列数ですね。今回の関数では、第一引数のセル範囲として列数=1での処理を想定しています。
あとは、target_rng内のそれぞれのセルに対し、memmbersの全ての要素と値が一致しているか照らし合わせていきます(StrComp)。そして、値が一致している場合は、nに1を加えます。
最後にnを返しておしまいです。