【Excel VBA】UNIQUE関数で重複しないデータ(ユニークなリスト)を抽出する方法

データリストから重複する値を除いた、ユニークな(一意の)リストを作成することは、データ集計や分析の基本です。従来VBAではCollectionDictionaryオブジェクトを使うのが一般的でしたが、最新の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次元配列として返します。この戻り値を受け取るため、変数uniqueListVariant型で宣言します。

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関数が返した配列を、ワークシートに一括で書き込むための定番テクニックです。

  1. UBound(uniqueList, 1)で配列の行数を取得します。
  2. UBound(uniqueList, 2)で配列の列数を取得します。
  3. .Resizeメソッドで、書き込み先の起点セル(outputCell)を、配列とまったく同じ大きさに拡張します。
  4. 拡張したセル範囲の.Valueプロパティに配列を直接代入することで、すべてのデータが一瞬で書き込まれます。

まとめ

UNIQUE関数が利用できるモダンなExcel環境において、重複しないリストの作成は劇的に簡単になりました。

  1. WorksheetFunction.Unique(対象範囲)を使い、ユニークなリストを配列として一括で取得する。
  2. 取得した配列を、**.Resize.Value**を使ってシートに一括で書き出す。

CollectionDictionaryオブジェクトを使った複雑なロジックを組む必要がなく、たった数行のコードで高速に処理を完結できます。Excel 365や2021をお使いであれば、ぜひこのスマートな方法をご活用ください。

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

この記事を書いた人

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

目次