У меня есть следующий код:Странное поведение диапазона при использовании в качестве ключа в словаре
Dim dicMyHash As Dictionary
Dim rngMyRange As Range
' A1 is empty - although the outcome is the same in any case
Set rngMyRange = Range("A1")
Set dicMyHash = New Dictionary
dicMyHash.Add Key:=rngMyRange(1), Item:=0
Debug.Print dicMyHash.Exists(rngMyRange(1).Value) ' returns False
Debug.Print rngMyRange(1) = rngMyRange(1).Value ' returns True
Такое поведение является несколько неожиданным. Есть ли какой-то тип кастинга в фоновом режиме? rngMyRange(1).Value
возвращает имущество variant
, тогда как rngMyRange(1)
составляет rngMyRange.item(1)
, что составляет range
. Однако, отбрасывая rngMyRange(1)
к Variant
дает те же результаты ..
Кроме того, добавление ключей является значением (так копия rngMyRange(1)
передается в качестве ключа). Но все же я не могу понять, почему .Exists
не находит ключа.
Заранее благодарю вас!
rdhs thanks - Поскольку 'Dictionary.Exists' работает так, как вы описываете выше, остальное имеет смысл (а также устанавливает в вашем ответе' r = d.Keys (0) '). – Ioannis
Тем не менее, я использовал бы нечто более разумное как ключ, например 'r.Address'. – Chel
Абсолютно. В моем контексте я храню пользовательские объекты в этом словаре и использую их имена (строки) в качестве ключей, которые я получаю из динамического диапазона с помощью 'range.value' (проверка с помощью' .exists' для дубликатов). В какой-то момент я упомянул ключ без «.value» и столкнулся с проблемой. Спасибо за подробное объяснение - очень полезно! – Ioannis