【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で大量のデータからユニークなリストを作成する際の、非常に強力で定番の手法です。

副業から独立まで「稼げる」Webスキルを習得する(PR)

ここまで読んでいただきありがとうございます。 最後に宣伝をさせてください。

「副業を始めたいが、何から手をつければいいかわからない」「独学でスキルはついたが、収益化できていない」という悩みを持つ方には、マンツーマン指導のWebスクール**「メイカラ」**が適しています。

このスクールは、単に技術を教えるだけでなく、**「副業として具体的にどう稼ぐか」**という実務直結のノウハウ提供に特化している点が特徴です。

講師陣は、実際に「副業Webライターから1年で独立して月収100万円」を達成したプロや、現役で利益を出し続けているブロガーなど、確かな実績を持つプレイヤーのみで構成されています。そのため、机上の空論ではない、現場で通用する戦術を学ぶことができます。

副業に特化した強み

  • 最短ルートの提示: 未経験からでも実績を出せるよう、マンツーマンで指導。
  • AI活用の習得: 副業の時間対効果を最大化するための、正しいAI活用スキルも網羅。
  • 案件獲得のチャンス: 運営がWebマーケティング会社であるため、実力次第で社内案件の紹介など、仕事に直結する可能性があります。

受講者の多くは、「在宅でできる仕事を探している」「副業を頑張りたい」という20代・30代・40代が中心です。

受講前には、講師による無料説明が行われます。無理な勧誘はなく、自分に合った副業スタイルやプランを相談できるため、まずは話を聞いてみることから始めてみてはいかがでしょうか。

ブログで稼ぎたいなら「メイカラ」

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

この記事を書いた人

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

目次