同じ値は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つ使った二重ループの方法

この方法は考え方として分かりやすいのですが、コード量が多くなることと、データ量が多くなるのに比較して処理速度が遅くなるという欠点があります。

実行結果
個数=4

Dictionaryを使う方法

DictionaryのExistsメソッドを使って、既にそのデータがDictionaryに登録済みかどうかを判定し、未登録であれば登録します。

事前準備として、Dictionaryクラスを使うにはVBA画面のツールメニューで参照設定を選び、「MicrosoftScripting Runtime」にチェックを付けます。

上の配列での対応よりもかなりシンプルなつくりになっています。

実行結果
個数=4

COUNTIF関数での方法

Excel操作のためコードはありませんが、以下の方法で実現可能です。

  1. C2セルに「=COUNTIF($B$2:B2,B2)」を入力。
  2. C2セルをドラッグしてC9セルまでコピーする。
  3. 任意のセルに「=COUNTIF(C2:C9,1)」と入力すると、個数が表示される。