同じ値は1つとカウントしたい場合
選択セル範囲などの一定の範囲内に複数のデータがある場合、重複している同じ値は1つとしてカウントしたい場合があります。
例えば、A,A,B,B,B,C,C,C、の8つのデータがある場合、重複を除くと値の個数はA,B,Cの3個になります。
このように、データ数ではなくデータの種類の数をカウントしたい場合ですが、方法は色々考えられます。
ここでは、配列を2つ使った二重ループでの方法、Dictionaryを使う方法、ワークシート関数のCOUNTIF関数を使う方法、の3つを紹介します。
ちなみに、私自身はこういう重複を除いた個数さえ分かればいい場合はVBAは使わず、そのデータをサクラエディタに全部貼って、Ctrl + Aで全選択して、Alt + Aでソートして、Alt + Mで重複の除去して数えます。
なお、それぞれ以下のデータのB列の日付の個数を数えるプログラムとします。
配列を2つ使った二重ループの方法
この方法は考え方として分かりやすいのですが、コード量が多くなることと、データ量が多くなるのに比較して処理速度が遅くなるという欠点があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
Sub DuplicateArrayMethod() Dim r As Range '// 単一セルオブジェクト Dim rSelection As Range '// セル選択範囲 Dim aryDate() '// 日付配列 Dim i '// ループカウンタ Dim bExistFlg As Boolean '// 同一値存在フラグ(true:存在する、false:存在しない) Set rSelection = Range("B2:B9") ReDim aryDate(0) '// セル選択範囲をループ For Each r In rSelection '// 存在フラグ=存在しない bExistFlg = False '// 日付配列をループ For i = 0 To UBound(aryDate) - 1 '// 同じ日付が配列に登録済みの場合 If aryDate(i) = r.text Then '// 存在フラグ=存在する bExistFlg = True '// これ以上検索不要のためループを抜ける Exit For End If Next '// 日付配列に存在しなかった場合 If bExistFlg = False Then '// 日付配列を拡張 ReDim Preserve aryDate(UBound(aryDate) + 1) '// 日付配列に現セルの日付を登録 aryDate(UBound(aryDate) - 1) = r.text End If Next ReDim Preserve aryDate(UBound(aryDate) - 1) Debug.Print "個数=" & UBound(aryDate) + 1 End Sub |
実行結果
個数=4
Dictionaryを使う方法
DictionaryのExistsメソッドを使って、既にそのデータがDictionaryに登録済みかどうかを判定し、未登録であれば登録します。
事前準備として、Dictionaryクラスを使うにはVBA画面のツールメニューで参照設定を選び、「MicrosoftScripting Runtime」にチェックを付けます。
上の配列での対応よりもかなりシンプルなつくりになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub DuplicateDictionaryMethod() Dim r As Range '// 単一セルオブジェクト Dim rSelection As Range '// セル選択範囲 Dim dic As New Dictionary '// 同一値格納 Set rSelection = Range("B2:B9") ReDim aryDate(0) '// セル選択範囲をループ For Each r In rSelection '// Dictionaryに未登録の場合 If dic.Exists(r.Text) = False Then '// Dictionaryに登録 dic.Add r.Text, 1 End If Next Debug.Print "個数=" & dic.Count End Sub |
実行結果
個数=4
COUNTIF関数での方法
Excel操作のためコードはありませんが、以下の方法で実現可能です。
- C2セルに「=COUNTIF($B$2:B2,B2)」を入力。
- C2セルをドラッグしてC9セルまでコピーする。
- 任意のセルに「=COUNTIF(C2:C9,1)」と入力すると、個数が表示される。