重複しないリストを作る|Excel VBA

データベース関連のテクニック

重複しないリストを作る

(Excel 97/2000/2002/2003/2007/2010)

ワークシートにたくさんのデータが入力されていたとします。たとえば会員の名前としましょう。この中から重複している名前を除いて、重複しないリストを作成するにはどうしたらいいでしょう。

Excelのメニューから操作するなら[データ]タブ→[詳細設定]または、[データ]メニュー→[フィルタ]から表示される[フィルタオプションの設定]などで実現できます。次のマクロは、セル範囲A1:A100に入力されているデータから重複しないリストを作成してC列に出力します。

●サンプル1●

Sub Sample1()
    Range("A1:A100").AdvancedFilter Action:=xlFilterCopy, _
    CopyToRange:=Range("C1"), _
    Unique:=True
End Sub

これはこれで便利ですが、重複しないリストをワークシートに出力するのではなく、直接変数に格納することもできます。これには、Collectionオブジェクトを使います。

Collectionオブジェクトとは特別なオブジェクトで、ユーザーが独自の要素を追加してコレクションを作成するときに使います。
Collectionオブジェクトに要素を追加するとき、要素自体のほかに「Key」という情報を登録できます。

次のサンプルを実行すると、「モグタン」というメッセージボックスが2回表示されます。

●サンプル2●

Sub Sample2()
    Dim MyData As New Collection
    MyData.Add Item:="モグタン", Key:="mg"
    MsgBox MyData(1)                'インデックスでアクセス
    MsgBox MyData("mg")             'Keyでアクセス
End Sub

これは、ワークシートを表すWorksheetsコレクションに似ています。1番目のワークシートが「Sheet1」だったとき、そのワークシートはWorksheets(1)またはWorksheets("Sheet1")で参照できます。

ここで重要なことは、Collectionオブジェクトには重複したKeyを設定することができないことです。この特性を利用すると、重複しないリストを作成することが可能です。
重複するKeyを設定しようとするとエラーになるので、エラーにならないデータだけをCollectionオブジェクトの要素として登録してやればいいのです。

セル範囲A1:A100に100件の名前が入力されていたとします。Collectionオブジェクトを使って重複しないリストを作成するには次のようにします。

●サンプル3●

Sub Sample3()
    Dim MyData As New Collection
    Dim i As Long
    
    On Error Resume Next    'データを登録する間、エラーを無視する
    For i = 1 To 10
        MyData.Add Cells(i, 1).Value, Cells(i, 1).Value 
    Next i
    On Error GoTo 0
        
    MsgBox "重複しないデータは" & MyData.Count & "件です" & vbCrLf & _
           "1番目のデータは「" & MyData(1) & "」です"
End Sub

●補足●

Addメソッドの引数Keyには文字列を指定しなければなりません。この例ではデータが会員名(文字列)ですが、数値のときは「型が一致しません」のエラーとなります。
その場合は、TextプロパティまたはCStr関数を使用して文字列を指定してください。