Ячейки VBA как ключи в словаре

#excel #dictionary #key #vba

#excel #словарь #Клавиша #vba

Вопрос:

Я написал функцию, которая создает словарь с парами Ключ => Значение из листа Excel. Пока это работает нормально, но я выяснил, что в моем dictinary могут быть дублированные ключи, когда ячейки имеют одинаковое значение.

Кто-нибудь может объяснить мне это поведение?

 Function CreateDictionaryBySheet( _
SheetName As String, _
Optional KeyColumn As Long = 1, _
Optional ValueColumn As Long = 2, _
Optional StartRow As Long = 2 _
) As Object

Dim MyDictionary As Object
Set MyDictionary = CreateObject("Scripting.Dictionary")
Worksheets(SheetName).Activate

Dim MaxRows As Long
MaxRows = GetNumberOfRows(SheetName, KeyColumn)

Dim Row As Long
For Row = StartRow To MaxRows

    MyDictionary.Item(Cells(Row, KeyColumn)) = Cells(Row, ValueColumn)

Next Row

Set CreateDictionaryBySheet = MyDictionary

End Function
  

Я написал этот цикл, чтобы проверить свой код:

 Sub Test()

Dim Key As Variant
Dim MyDictionary As Object
Set MyDictionary = CreateDictionaryBySheet("Config")

For Each Key In MyDictionary

MsgBox (Key amp; " => " amp; MyDictionary(Key))

Next Key

End Sub
  

Предполагая, что ячейки (2,1) и cells (3,1) обе являются «a», а cells (2,2) = 1 и cells (3,2) = 2, я увижу два сообщения: одно с «a => 1» и одно с «a => 2»

Мне это кажется странным, потому что я предполагал увидеть только одно сообщение, а именно «a => 2»

Спасибо за вашу помощь! Питер

Ответ №1:

О, я только что понял, что получаю предполагаемое поведение при обращении к значениям ячеек вместо этого:

Это позволит дублировать значения:

     MyDictionary.Item(Cells(Row, KeyColumn)) = Cells(Row, ValueColumn)
  

Это не:

     MyDictionary.Item(Cells(Row, KeyColumn).Value) = Cells(Row, ValueColumn).Value
  

Я думаю, это потому, что dictinary действительно использовал Cells-Object в качестве ключа в первом случае, который не был предназначен.