皆様こんにちは、ノグチです。
VBAでツールを作るにあたって、リストの重複を除く処理って、悩ましいことの一つですよね。
ループを使って、一つ一つ重複チェックをする方法もありますが、リストのデータ件数が多ければ多いほど処理時間が長くなってしまうのが悩ましいところです。
しかも、ループで重複排除を行おうと思うと、ループに次ぐループで、ソースコードもなんだかゴチャゴチャとしてしまいます。
もっとスッキリしたコードで、かつ処理速度も速くなるような方法は無いものか…
そんな時に使えるのが、Dictionaryオブジェクトを使った処理。
今回はDictionaryオブジェクトを使ったリストの重複処理方法紹介の第一歩として、Dictionaryオブジェクトをご紹介していきます。
連想配列とは?
まず、Dictionaryオブジェクトは、連想配列をVBAで作るためのオブジェクトです。
連想配列とはなんぞや?
普段の生活ではあまり聞かない言葉ですよね。
連想配列は、簡単に言うと数値以外の型のキーと要素がセットになった配列のことです。
表で示すとこんな感じです。
キー | 要素 |
---|---|
東京 | 東京 |
神奈川 | 横浜 |
埼玉 | さいたま |
千葉 | 千葉 |
群馬 | 前橋 |
茨城 | 水戸 |
栃木 | 宇都宮 |
VBAにおける連想配列と配列の違い
連想配列と、Array関数で作る配列とは何が違うの?とお考えでしょうか。
配列の場合、コンピューターが各要素に対して0,1,2,3…とインデックス(数値)を振ってくれますよね。
つまり、インデックスが配列におけるキーになっています。
一方、連想配列は文字列もキーにすることができます。
配列におけるインデックスにあたるモノを、連想配列では任意の文字列や数値でキーとして表現するのです。
エクセルVBAのDictionaryオブジェクトとは?
先にも述べた通り、Dictionaryオブジェクトは、エクセルVBAで連想配列を作るためのオブジェクトです。
Array関数作った配列でインデックスが重複することがないのと同じく、Dictionaryのキーは重複することはできません。
キーに指定する文字列または数値は、Dicitonaryオブジェクトの中で必ず一意である必要があります。
そしてこの、キーは一意でなければならない、という特性を生かすことで、リストの重複を排除する処理が複雑なループ処理を使うことなくできるのです。
その方法については、次回以降の記事でご紹介していく予定です。
VBAでDictionaryオブジェクトを使う準備
VBAの参照設定
VBAでDictionaryオブジェクトを使うためには、Microsoft Scripting Runtimeを参照設定しておきましょう。
まず、VBEのメニューバーにある「ツール」>「参照設定」をクリックして、参照設定の画面を開きます。
参照設定の画面で、参照可能なライブラリ ファイルのリストの中からMicrosoft Scripting Runtimeを探して、左側にあるチェックをONにします。
OKボタンを押せば、参照設定は完了です。
これで、VBAでDictionaryオブジェクトを使えるようになりました。
Dictionary型を宣言する
Dim Dic As Dictionary Set Dic = New Dictionary
参照設定せずにDictionaryオブジェクトを使う場合
Dictionaryオブジェクトは、Microsoft Scripting Runtimeの参照設定をしなくても使うことができます。
その場合は、以下のような宣言とオブジェクト変数への格納が必要になります。
実際のコードに置き換えると、こんな感じになります。
Dim Dic As Object Set Dic = CreateObject("Scripting.Dictionary")
ただ、参照設定を使うとコーディングの時にクイックヒントが出てきてくれたりするので便利ということもあって、個人的には参照設定をする方法をとることが多いです。
さいごに
今回は、Dictionaryオブジェクトと、コードで使うための準備をご紹介しました。
次回からは、このDictionaryオブジェクトを使った、リストから重複を除く処理の方法をご紹介していきます。
それでは、最後までお読みいただきありがとうございました!
連載目次:エクセルVBAのDictionaryオブジェクトでリストの重複を排除する
エクセルVBAでリストの重複を排除する方法として、Dictionaryオブジェクトを使った重複排除の方法をご紹介しています。