データリストから重複する値を除いた、ユニークな(一意の)リストを作成することは、データ集計や分析の基本です。従来VBAではCollection
やDictionary
オブジェクトを使うのが一般的でしたが、最新のExcelでは、この処理を一行で実現できる強力な関数が登場しました。
それが、UNIQUE
関数です。Excel for Microsoft 365およびExcel 2021以降では、このUNIQUE
関数をVBAから直接呼び出すことで、重複排除の処理を驚くほどシンプルに記述できます。
【重要】UNIQUE関数が使える環境
このテクニックを利用するには、お使いのExcelが**UNIQUE
関数をサポートしているバージョン(Microsoft 365 または Excel 2021以降)**である必要があります。旧バージョンのExcelではこのコードは実行できませんのでご注意ください。
完成したVBAコード
以下は、「SalesData」シートのB列(商品名リスト)から、重複しない商品リストを抽出し、「Summary」シートのD列に書き出すVBAコードです。
Sub GetUniqueListWithUniqueFunction()
' 変数を宣言します
Dim sourceRange As Range
Dim uniqueList As Variant
Dim outputCell As Range
'--- 設定 ---
' 重複を削除したい元データが入力されている範囲
Set sourceRange = ThisWorkbook.Worksheets("SalesData").Range("B2:B500")
' 結果を出力したい起点となるセル
Set outputCell = ThisWorkbook.Worksheets("Summary").Range("D2")
'--- 設定ここまで ---
' --- 1. UNIQUE関数で重複しないリストを配列として取得 ---
On Error Resume Next ' 範囲が空などのエラーを回避
uniqueList = WorksheetFunction.Unique(sourceRange)
On Error GoTo 0
' 結果が空(エラー発生)の場合は処理を終了
If IsEmpty(uniqueList) Then
MsgBox "対象範囲からユニークなリストを取得できませんでした。", vbExclamation
Exit Sub
End If
' --- 2. 抽出結果の配列を、指定したセルに一括で書き出す ---
' 出力先の既存データをクリア
outputCell.Resize(Rows.Count - outputCell.Row + 1, 1).ClearContents
' Resizeで配列の大きさに合わせて出力先のセル範囲を拡張し、一括代入
outputCell.Resize(UBound(uniqueList, 1), UBound(uniqueList, 2)).Value = uniqueList
MsgBox "ユニークなリストの抽出が完了しました。"
End Sub
コードのポイント解説
① WorksheetFunction.Unique
uniqueList = WorksheetFunction.Unique(sourceRange)
これが処理の核心部分です。VBAからUNIQUE
関数を呼び出しています。 UNIQUE
関数は、引数として与えられたセル範囲(sourceRange
)から重複する値を取り除き、結果を2次元配列として返します。この戻り値を受け取るため、変数uniqueList
はVariant
型で宣言します。
UNIQUE
関数の主な引数
UNIQUE(array, [by_col], [exactly_once])
array
(必須): 対象となるセル範囲。[by_col]
(任意):False
(既定値): 行を比較して、ユニークな行を返す。True
: 列を比較して、ユニークな列を返す。
[exactly_once]
(任意):False
(既定値): 重複している項目も1つだけは残す(通常の重複排除)。True
: 1回しか出現しない、完全にユニークな項目だけを返す。
例えば、リストに「りんご, みかん, りんご」とあった場合、
exactly_once:=False
なら、結果は「りんご, みかん」exactly_once:=True
なら、結果は「みかん」のみ
となります。
② 抽出結果の配列をシートに書き出す
outputCell.Resize(UBound(uniqueList, 1), UBound(uniqueList, 2)).Value = uniqueList
UNIQUE
関数が返した配列を、ワークシートに一括で書き込むための定番テクニックです。
UBound(uniqueList, 1)
で配列の行数を取得します。UBound(uniqueList, 2)
で配列の列数を取得します。.Resize
メソッドで、書き込み先の起点セル(outputCell
)を、配列とまったく同じ大きさに拡張します。- 拡張したセル範囲の
.Value
プロパティに配列を直接代入することで、すべてのデータが一瞬で書き込まれます。
まとめ
UNIQUE
関数が利用できるモダンなExcel環境において、重複しないリストの作成は劇的に簡単になりました。
WorksheetFunction.Unique(対象範囲)
を使い、ユニークなリストを配列として一括で取得する。- 取得した配列を、**
.Resize
と.Value
**を使ってシートに一括で書き出す。
Collection
やDictionary
オブジェクトを使った複雑なロジックを組む必要がなく、たった数行のコードで高速に処理を完結できます。Excel 365や2021をお使いであれば、ぜひこのスマートな方法をご活用ください。