一意リスト作成(ユニーク化)
Excel VBAで「重複を除いた一意リストを作りたい」場面はよくあります。
例えば「顧客コード一覧」「商品名一覧」「カテゴリ一覧」など。初心者向けに、コード例やテンプレートをかみ砕いて説明します。
基本の考え方
- Dictionaryを使う → キーは重複不可なので、ユニーク化に最適。
- Collectionでも可能 → ただし重複チェックが少し面倒。
- Rangeを配列に読み込んで処理 → 大量データでも高速。
テンプレ1:配列から一意リストを作成(Dictionary)
Sub UniqueList_Array()
Dim fruits As Variant
fruits = Array("りんご", "みかん", "バナナ", "りんご", "ぶどう")
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim f As Variant
For Each f In fruits
dict(f) = True ' キーだけ使う
Next f
' 一意リストを出力
Dim k As Variant
For Each k In dict.Keys
Debug.Print k
Next k
End Sub
VB- 結果:
りんご みかん バナナ ぶどう
テンプレ2:シートの列から一意リストを作成
Sub UniqueList_Sheet()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Dim rg As Range: Set rg = ws.Range("A2:A" & lastRow)
Dim v As Variant: v = rg.Value
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim r As Long
For r = 1 To UBound(v, 1)
dict(v(r, 1)) = True
Next r
' 一意リストをB列に出力
Dim i As Long: i = 2
Dim k As Variant
For Each k In dict.Keys
ws.Cells(i, 2).Value = k
i = i + 1
Next k
End Sub
VB- ポイント:
- A列のデータをユニーク化してB列に出力。
- 顧客コードや商品名の一覧作成に便利。
テンプレ3:一意リストを配列として取得
Function GetUniqueArray(rg As Range) As Variant
Dim v As Variant: v = rg.Value
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim r As Long
For r = 1 To UBound(v, 1)
dict(v(r, 1)) = True
Next r
GetUniqueArray = dict.Keys
End Function
Sub Example_UniqueArray()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim arr As Variant
arr = GetUniqueArray(ws.Range("A2:A20"))
Dim i As Long
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
VB- ポイント: 関数化しておけば再利用できる。
テンプレ4:一意リストをソートして出力
Sub UniqueList_Sorted()
Dim fruits As Variant
fruits = Array("りんご", "みかん", "バナナ", "りんご", "ぶどう")
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim f As Variant
For Each f In fruits
dict(f) = True
Next f
Dim arr As Variant: arr = dict.Keys
' ソート
Dim i As Long, j As Long, tmp As String
For i = LBound(arr) To UBound(arr) - 1
For j = i + 1 To UBound(arr)
If arr(i) > arr(j) Then
tmp = arr(i)
arr(i) = arr(j)
arr(j) = tmp
End If
Next j
Next i
' 出力
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
VB- ポイント: ユニーク化した後にソートも可能。
例題で練習
'例1:配列からユニーク化
Sub Example1()
UniqueList_Array
End Sub
'例2:シートの列からユニーク化
Sub Example2()
UniqueList_Sheet
End Sub
'例3:関数でユニーク配列を取得
Sub Example3()
Example_UniqueArray
End Sub
'例4:ユニーク化+ソート
Sub Example4()
UniqueList_Sorted
End Sub
VB初心者向けポイント
- Dictionaryは重複不可 → キーを使えば自動的にユニーク化できる。
- Keysで一覧取得 → 一意リストを配列として扱える。
- シートの列も高速処理 → Rangeを配列に読み込んでユニーク化。
- ソートも組み合わせ可能 → ユニーク化+並べ替えでさらに便利。
👉 この「一意リスト作成テンプレ」を覚えておけば、顧客コードや商品名の 重複除去・一覧作成 を高速に実務へ応用できます。
