重複しないリストを作る|Excel VBA |
ワークシートにたくさんのデータが入力されていたとします。たとえば会員の名前としましょう。この中から重複している名前を除いて、重複しないリストを作成するにはどうしたらいいでしょう。
Excelのメニューから操作するなら[データ]タブ→[詳細設定]または、[データ]メニュー→[フィルタ]から表示される[フィルタオプションの設定]などで実現できます。次のマクロは、セル範囲A1:A100に入力されているデータから重複しないリストを作成してC列に出力します。
Sub Sample1()
Range("A1:A100").AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=Range("C1"), _
Unique:=True
End Sub
これはこれで便利ですが、重複しないリストをワークシートに出力するのではなく、直接変数に格納することもできます。これには、Collectionオブジェクトを使います。
Collectionオブジェクトとは特別なオブジェクトで、ユーザーが独自の要素を追加してコレクションを作成するときに使います。
Collectionオブジェクトに要素を追加するとき、要素自体のほかに「Key」という情報を登録できます。
次のサンプルを実行すると、「モグタン」というメッセージボックスが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オブジェクトを使って重複しないリストを作成するには次のようにします。
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関数を使用して文字列を指定してください。