MS-Excel‎ > ‎VBA編‎ > ‎

dictionaryオブジェクトで重複の無いリスト

dictionaryオブジェクトを連想配列的に使って、雑多なリストから重複の無いリストを生成します。

Sheets("シート1").range("A1").value = "りんご"
Sheets("シート1").range("A2").value = "みかん"
Sheets("シート1").range("A3").value = "もも"
Sheets("シート1").range("A4").value = "すもも"
Sheets("シート1").range("A5").value = "みかん"
Sheets("シート1").range("A6").value = "りんご"

のデータがある時に、次の標準モジュールを定義し、”Sub hoge”を実行すると、

----------標準モジュールここから----------
Sub hoge()
Dim name_no_overlap_list As Object
Call get_no_overlap_list(name_no_overlap_list, "シート1", 1, 1)
Call output_no_overlap_list(name_no_overlap_list, "シート2", 1, 1)
End Sub

Sub get_no_overlap_list(ByRef Dic As Object, ByVal get_sheet_name As String, _
ByVal get_row_no As Long, ByVal get_column_no As Long)

    Dim i As Long
    Dim buf As String
    Dim Keys As Variant

    i = get_row_no

    Set Dic = CreateObject("Scripting.Dictionary")

    While Sheets(get_sheet_name).Cells(i, get_column_no).Value <> ""
        buf = Sheets(get_sheet_name).Cells(i, get_column_no).Value
        If Not Dic.Exists(buf) Then
            Dic.Add buf, buf
        End If
    i = i + 1
    Wend
End Sub

Sub output_no_overlap_list(ByVal Dic As Object, ByVal out_sheet_name As String, _
ByVal out_row_no As Long, ByVal out_column_no As Long)

    Dim i As Long
    Dim buf As String
    Dim Keys As Variant


    Keys = Dic.Keys
    For i = 0 To Dic.Count - 1
        Sheets(out_sheet_name).Cells(i + out_row_no, out_column_no) = Keys(i)
    Next i
End Sub
----------標準モジュールここまで----------

重複の無いリストである、
Sheets("シート2").range("A1").value = "りんご"
Sheets("シート2").range("A2").value = "みかん"
Sheets("シート2").range("A3").value = "もも"
Sheets("シート2").range("A4").value = "すもも"
の出力が得られます。

リスト自体は、
Call get_no_overlap_list(name_no_overlap_list, "シート1", 1, 1)
の時点で参照渡ししている、name_no_overlap_listに作成されています。

Call output_no_overlap_list(name_no_overlap_list, "シート2", 1, 1)
では出力を行っています。