#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 в качестве ключа в первом случае, который не был предназначен.