В словарях фактически используются варианты ключей, а не только строки или числа, поэтому при циклическом переключении ключей необходимо определить k как вариант.Ключ на самом деле может быть любым.
Кроме того, словари самопроизвольно добавляют новые ключи, если вы ссылаетесь на ключ, который еще не определен, поэтому вы должны использовать безопасную функцию Exists, чтобы проверить, имеет ли ключбыл определен.
VBA, будучи недисциплинированным зверьком, пытается определить, что вам нужно, когда вы ссылаетесь на объект Range () в коде.Если можно использовать объект диапазона, тогда он будет использовать объект диапазона.Если ожидается строка / число, то вместо этого будет использоваться значение объекта Range () (являющееся свойством по умолчанию).
Поскольку словари могут принимать любой объект в качестве ключа, а не использовать значение вЯчейки (i, 4), он использует реальный объект диапазона ячеек (i, 4) и создает новый ключ без значения.Это можно увидеть в окнах Locals, в которых показаны подтипы вариантов словарных ключей:
![enter image description here](https://i.stack.imgur.com/UWbeI.png)
Когда вы отлаживаете ключи в print.printНаконец, функция печати ожидает строку / число.Поэтому, когда он достигает «дублирующих» ключей, которые на самом деле являются объектами диапазона, он вместо этого печатает значение объекта диапазона.
При пошаговом выполнении кода вы можете фактически получить любые свойства диапазона этих ключей внемедленное окно вместо!Например: ?k.Address
Чтобы исправить ваш код, вам просто нужно явно сослаться на значение ячейки:
Cells(i, 5) = myDict(Cells(i, 4).Value)
Вот почему лучшая практика кодирования - всегда явноссылаться на свойства объектов, а не полагаться на свойства по умолчанию.