【Excel VBA】Collectionオブジェクトで重複しないリストを高速に作成する方法

データリストから重複する項目を取り除き、ユニークな(一意の)リストを作成したい、という場面はデータ集計の基本です。Excelの「重複の削除」機能でも可能ですが、VBAを使えばこの処理をマクロに組み込めます。

Forループで1セルずつ比較する方法では、データが多いと非常に時間がかかります。しかし、VBAの**Collectionオブジェクトが持つ「キーは重複できない」**という特性を利用すると、この処理を極めて高速に行うことができます。

この記事では、その巧妙なテクニックを解説します。


目次

完成したVBAコード

以下は、B2セルから始まるデータ範囲から、重複しない項目の一覧を作成し、F列に書き出すVBAコードです。

Sub CreateUniqueListWithCollection()

    ' 変数を宣言します
    Dim sourceRange As Range
    Dim uniqueItems As Collection
    Dim cell As Range
    Dim i As Long
    
    ' --- 1. 準備 ---
    ' Collectionオブジェクトを新規作成
    Set uniqueItems = New Collection
    ' 処理対象のデータ範囲を設定
    Set sourceRange = ThisWorkbook.Worksheets("Sheet1").Range("B2", ThisWorkbook.Worksheets("Sheet1").Range("B2").End(xlDown))

    ' --- 2. Collectionにアイテムを追加して、重複を自動的に排除 ---
    ' 「キーの重複」エラーを意図的に無視する設定
    On Error Resume Next
    
    For Each cell In sourceRange
        ' アイテムの値そのものを「キー」として追加を試みる
        uniqueItems.Add Item:=cell.Value, Key:=CStr(cell.Value)
    Next cell
    
    ' エラー処理を通常モードに戻す
    On Error GoTo 0

    ' --- 3. 抽出されたユニークなリストをシートに書き出す ---
    For i = 1 To uniqueItems.Count
        ThisWorkbook.Worksheets("Sheet1").Cells(i + 1, "F").Value = uniqueItems(i)
    Next i
    
    MsgBox "重複しないリストの作成が完了しました。"

End Sub

コードのポイント解説(「キー」を利用した重複排除の仕組み)

このテクニックの核心は、Collection.AddメソッドとOn Error Resume Nextを組み合わせる点にあります。

1. On Error Resume Next

まず、この一行で「もし処理中にエラーが発生しても、マクロを停止せずに次の行へ進んでください」というモードに切り替えます。

2. uniqueItems.Add Item:=..., Key:=...

Collectionにアイテムを追加する際、.AddメソッドにはKeyという引数を指定できます。このKeyには、コレクション内で一意でなければならないという厳格なルールがあります。

uniqueItems.Add Item:=cell.Value, Key:=CStr(cell.Value)

このコードでは、Item(格納する値)とKey(その値の索引キー)の両方に、セル自身の値を指定しています。Keyは文字列である必要があるため、CStr関数で安全に文字列に変換しています。

このコードがループで実行されると、以下のようになります。

  1. 最初の「りんご」: Key=”りんご”はまだ存在しないので、正常に追加されます。
  2. 最初の「みかん」: Key=”みかん”はまだ存在しないので、正常に追加されます。
  3. 2回目の「りんご」: Key=”りんご”でアイテムを追加しようとします。しかし、このKeyは既にコレクション内に存在するため、VBAは**「キーが重複しています」というエラーを発生させます。**
  4. ここで、最初に設定したOn Error Resume Nextが機能し、このエラーは無視され、何も追加されずに次のループに進みます。

この仕組みを繰り返すことで、結果的にuniqueItemsコレクションには重複のないリストだけが残る、というわけです。


【応用】さらに高速なDictionaryオブジェクト

同様の処理は、Scripting.Dictionaryオブジェクトを使うと、より高速でコードも分かりやすくなる場合があります。Dictionaryには.Existsというメソッドがあり、「キーが既に存在するか?」をエラーに頼らずに直接判定できるためです。

'参照設定: Microsoft Scripting Runtime
Dim dict As New Scripting.Dictionary
For Each cell In sourceRange
    If Not dict.Exists(cell.Value) Then
        dict.Add cell.Value, ""
    End If
Next cell

パフォーマンスを極限まで追求する場合は、Dictionaryの利用も検討してみてください。


まとめ

Collectionオブジェクトの「キーは重複できない」という性質と、On Error Resume Nextを組み合わせることで、高速な重複排除ロジックを簡単に実装できます。

  1. On Error Resume Next を宣言する。
  2. For Eachループで元データを巡回する。
  3. myCollection.Add Item:=値, Key:=値 で、値自身をキーにして追加を試みる。
  4. 処理が終わったら、On Error GoTo 0 でエラー処理を元に戻す。

このテクニックは、VBAで大量のデータからユニークなリストを作成する際の、非常に強力で定番の手法です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次