配列の重複除去 ① 一次元配列

テーブルの指定列の値を一旦配列に格納し、重複除去してリストを作成するとき、いつも辞書(連想配列)を使っている。
完全にパターン化しているのに、そういえば関数化していなかった。
f:id:Infoment:20200714223333p:plain

みんな大好き連想配列は、

  • key
  • item

で構成されている。普通の辞書で言えば、両者の関係は

  • key リンゴ
  • item バラ科リンゴ属の落葉高木樹。またはその果実のこと。

のような感じか(keyが「見出し語」で、itemが「意味」)。
そして、keyは重複が許されないことを、いつも重複除去に利用してきた。
関数にするなら、こんな感じだ。

Function RemovalDuplicateArray(source_array As Variant) As Variant
    ' 重複除去用の辞書(連想配列)
    Dim Dict As Object
    Set Dict = CreateObject("Scripting.Dictionary")
    Dim a As Variant
        For Each a In source_array
            ' 配列内の各値を、辞書に格納する。
            ' 重複除去が目的のため、itemは不問。今回は「1」とした。
            Dict(a) = 1
        Next
        ' 辞書のkeyが、重複除去後の配列として取り出せる。
        RemovalDuplicateArray = Dict.keys
End Function

早速、確認してみよう。

Sub ArrayTest()
    Dim arr As Variant
        arr = Array(1, 2, 3, 2, 1, 4, 5)
        arr = RemovalDuplicateArray(arr)
        MsgBox Join(arr, ",")
End Sub

結果は以下のとおり、二回登場した「1」「2」が除去されている。
f:id:Infoment:20200714224336p:plain

以上が基本形。このままでも使えるが、何かと使い勝手が悪い。

ということで、次回に続きます。

参考まで。