配列の重複する要素を削除

配列の重複する要素を削除する。

配列にある重複する要素を削除し、ユニークなデータしか持たない配列を作成します。

重複する要素の確認には連想配列(Dictionaryオブジェクト)を利用しています。
 ※この連想配列は要素の検索のためだけに利用します。
ループ処理で連想配列内に処理対象の配列要素があるかをExistsメソッドで確認し、連想配列に対象の要素が無ければ連想配列と編集用の配列に値を設定してユニークなデータを持つ配列を作成しています。

'******************************************************************
' 配列の重複データ削除
'******************************************************************
Sub Main_DelSameAryData()

    '配列データの設定
    Dim vAry() As Variant
    vAry = Array("青森", "岩手", "宮城", "青森", "秋田", "山形", "山形", "青森", "岩手", "宮城", "福島")
    
    '重複データの削除
    Dim vRtnAry() As Variant
    vRtnAry = delSameAryData(vAry)
    
    Dim i As Long
    '削除前の配列
    Debug.Print "(削除前)"
    For i = 0 To UBound(vAry)
        Debug.Print vAry(i)
    Next
    
    Debug.Print "----------------"
    Debug.Print "(削除後)"
    For i = 0 To UBound(vRtnAry)
        Debug.Print vRtnAry(i)
    Next

End Sub

'******************************************************************
' 配列内の重複データ削除
'------------------------------------------------------------------
' 第1引数:対象の配列
'------------------------------------------------------------------
' 戻り値 :重複削除後の配列
'******************************************************************
Function delSameAryData(aryDat As Variant) As Variant

    'Dictionaryオブジェクトの作成
    Dim oDICT As Object
    Set oDICT = CreateObject("Scripting.Dictionary")
    
    
    '引数の配列データの重複データ削除
    Dim vTempAry() As Variant
    Dim lAryCnt As Long
    Dim i As Long
    
    For i = 0 To UBound(aryDat)
        'Existsメソッドで重複データの確認
        If (oDICT.Exists(aryDat(i)) = False) Then
            
            '重複が無ければ連想配列に追加(検索用、項目とキーは同値)
            Call oDICT.Add(aryDat(i), aryDat(i))
            
            '重複がない値のみを編集用の配列に格納
            ReDim Preserve vTempAry(lAryCnt)
            vTempAry(lAryCnt) = aryDat(i)
            lAryCnt = lAryCnt + 1
        
        End If
    Next
    
    '編集後の配列を戻り値に設定
    delSameAryData = vTempAry
    
End Function

 ■実行結果