I am having trouble with the following code:

Sub UseDictionary()

    ' Get the range of values
    Dim rg As Range
    Set rg = Range("A2:B7")
    
    ' Create the dictionary
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' Fill the dictionary
    Dim cell As Range
    For Each cell In rg
        dict(cell.Value) = cell.Offset(0, 1).Value
    Next
    
    ' Perform the Lookups
    For Each cell In rg
        Debug.Print cell.Value, dict(cell.Value)
    Next

End Sub

Masalahnya adalah ketika baris dict(cell.Value) = cell.Offset(0, 1).Value sedang memproses sel yang ada di kolom B, item kamus dibuat menggunakan nilai kolom B dan C.

Bagaimana mungkin, karena saya mengatur rg dengan hanya dua kolom A dan B?! Saya pikir Excel tidak akan membuat item itu karena cell.Offset(0, 1).Value seharusnya tidak ada ketika cell memiliki kolom B sebagai kolomnya.

Jadi, bagaimana cara mencegah kamus membuat item ketika cell.Offset(0, 1).Value merujuk ke kolom C, yang tidak ada di objek rg saya?

Terima kasih banyak atas petunjuk apa pun.

0
sergio trajano 4 Juli 2020, 19:56

1 menjawab

Jawaban Terbaik

cell.Offset() dihitung relatif terhadap objek rentang cell. Objek itu sendiri tidak bergantung pada objek rg yang telah Anda tetapkan sama dengan Range("A2:B7"). Fakta bahwa Anda mengulang rg tidak berarti bahwa variabel perulangan cell entah bagaimana atau lainnya adalah objek anak rg. Tidak ada perbedaan antara cell ketika merujuk ke B2 sebagai bagian dari loop itu dan cell ketika secara langsung disetel sama dengan sel yang sama B2 melalui Set cell = Range("B2"). Dalam kedua kasus itu hanya variabel rentang yang merujuk ke B2 (sehingga cell.Offset(0,1) secara alami merujuk ke C2).

Dalam kasus Anda, Anda sepertinya ingin kunci berada di kolom A dan nilai di kolom B. Jika demikian, ubah saja rg Anda menjadi Set rg = Range("A2:A7").

0
John Coleman 4 Juli 2020, 18:52