はじめに
Excelファイルでよく関数を使用してデータ整理したり調査したりすることが多いと思います。
その中で特に便利な関数を使用しようとした際に、最近実装された関数で今のPCのバージョンでは使用できない関数がちらほらあると思います。
その中でも特に「Unique関数」が特に代表と言ってもいいくらい便利な関数かと思います。
すごく便利なのにバージョンが古くて使用できない。
そして会社の貸与PCなどで簡単にバージョンは上げられない….
そんな悩みを解決方法を紹介していこうと思います。
Unique関数とは
そもそもUnique関数を知らない人向けに簡単に説明をします。
簡単に言うと、UNIQUE関数は重複を除いて一覧を取り出す関数です。

実装
まず、既存の関数を組み合わせるのではなく、VBAで実装していきます。
マクロ有効ファイルにしなければならないため変更方法がわからない方は以下の記事をご参考くだいさい。
以下のコードを標準モジュールに記載しましょう。
Option Explicit
Function UniqueList(rng As Range) As Variant
Dim dict As Object
Dim cell As Range
Dim arr() As Variant
Dim i As Long
Dim key As Variant
Set dict = CreateObject("Scripting.Dictionary")
' 重複しない値を追加
For Each cell In rng
If Not dict.Exists(CStr(cell.Value)) Then
dict.Add CStr(cell.Value), cell.Value
End If
Next cell
' 結果を縦配列に変換
ReDim arr(1 To dict.Count, 1 To 1)
i = 1
For Each key In dict.Keys
arr(i, 1) = dict(key)
i = i + 1
Next key
UniqueList = arr
End Functionこれで完成です。

先ほどの画像でも紹介した果物をA列に記載しました。
次にC列に標準モジュールに搭載した関数を書いていきましょう。
=UniqueList(A1:A10)
はい、そうするとあたかもunique関数が使用できているようになります。
最終行にある「0」はなんなのかというと空白セルを指します。
通常のunique関数がにも表示されますが、いらないと思う場合は以下のコードを紹介します。
Option Explicit
Function UniqueList(rng As Range) As Variant
Dim dict As Object
Dim cell As Range
Dim arr() As Variant
Dim i As Long
Dim key As Variant
Set dict = CreateObject("Scripting.Dictionary")
' 空白を除外しながら重複なしで追加
For Each cell In rng
If Trim(CStr(cell.Value)) <> "" Then
If Not dict.Exists(CStr(cell.Value)) Then
dict.Add CStr(cell.Value), cell.Value
End If
End If
Next cell
' データが1件もない場合
If dict.Count = 0 Then
UniqueList = ""
Exit Function
End If
' 縦方向の配列にして返す
ReDim arr(1 To dict.Count, 1 To 1)
i = 1
For Each key In dict.Keys
arr(i, 1) = dict(key)
i = i + 1
Next key
UniqueList = arr
End Functionまとめ
今回はunique関数が実装されていない古いバージョンで苦労している方向けに紹介した記事でした。
実際、まだまだ古いExcelを使用している企業さんや個人PCは多いため役に立つかなと思っています。
他にも便利なツールやコードを紹介しているのでもし良かったら見ていってください。

