Цикл VBA для добавления пустых словарных статей - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь заменить некоторые значения на листе Excel, используя словарь VBA.Когда я делал это в прошлом году, это работало отлично.После повторной попытки он добавляет пустые значения в дубликаты ключей и ничего не записывает в ячейки.

Я пробовал раннее и позднее связывание, но безуспешно.

Вот код с поздним связыванием.

Sub someDict()

Dim myDict As Object
Set myDict = CreateObject("Scripting.Dictionary")
Dim n As Long
Dim i As Long

myDict.Add "A", "Amaretto Sour"
myDict.Add "B", "Bourbon"
myDict.Add "C", "Cosmopolitan"
myDict.Add "D", "Daiquiri"
myDict.Add "E", "Electric Lemonade"
myDict.Add "F", "Four Horsemen"
myDict.Add "G", "Gin and Tonic"
myDict.Add "H", "Hurricane"
myDict.Add "I", "Irish Coffee"
myDict.Add "J", "John Collins"

Debug.Print "Total: " & myDict.Count()

n = Cells(Rows.Count, 1).End(xlUp).Row
For i = n To 1 Step -1
    If Cells(i, 3) = "TEST" Then
        Debug.Print myDict.Count()
        Cells(i, 5) = myDict(Cells(i, 4))
        Debug.Print myDict.Count()
    End If
Next i

Debug.Print "Total after loop: " & myDict.Count()

Dim k As Variant
For Each k In myDict.Keys
    ' Print key and value
    Debug.Print k, myDict(k)
Next

End Sub

Вот структура таблицы:

table

Текущий вывод в ближайшем будущем:

Total: 10
 10 
 11 
 11 
 12 
 12 
 13 
 13 
 14 
 14 
 15 
 15 
 16 
 16 
 17 
Total after loop: 17
A             Amaretto Sour
B             Bourbon
C             Cosmopolitan
D             Daiquiri
E             Electric Lemonade
F             Four Horsemen
G             Gin and Tonic
H             Hurricane
I             Irish Coffee
J             John Collins
J             
H             
G             
F             
E             
C             
A     

Я бы ожидал, что это будет:

Total: 10
 10 
 10 
 10 
 10 
 10 
 10 
 10 
 10 
 10 
 10 
 10 
 10 
 10 
 10 
Total after loop: 10
A             Amaretto Sour
B             Bourbon
C             Cosmopolitan
D             Daiquiri
E             Electric Lemonade
F             Four Horsemen
G             Gin and Tonic
H             Hurricane
I             Irish Coffee
J             John Collins

Может кто-нибудь сказать мне, что я делаю неправильно (кроме использования VBAсловарь), и далее к этому, почему это ранее работало для меня?

Может ли это быть из-за обновления scrobj.dll?

Спасибо.

1 Ответ

1 голос
/ 05 апреля 2019

В словарях фактически используются варианты ключей, а не только строки или числа, поэтому при циклическом переключении ключей необходимо определить k как вариант.Ключ на самом деле может быть любым.

Кроме того, словари самопроизвольно добавляют новые ключи, если вы ссылаетесь на ключ, который еще не определен, поэтому вы должны использовать безопасную функцию Exists, чтобы проверить, имеет ли ключбыл определен.

VBA, будучи недисциплинированным зверьком, пытается определить, что вам нужно, когда вы ссылаетесь на объект Range () в коде.Если можно использовать объект диапазона, тогда он будет использовать объект диапазона.Если ожидается строка / число, то вместо этого будет использоваться значение объекта Range () (являющееся свойством по умолчанию).

Поскольку словари могут принимать любой объект в качестве ключа, а не использовать значение вЯчейки (i, 4), он использует реальный объект диапазона ячеек (i, 4) и создает новый ключ без значения.Это можно увидеть в окнах Locals, в которых показаны подтипы вариантов словарных ключей:

enter image description here

Когда вы отлаживаете ключи в print.printНаконец, функция печати ожидает строку / число.Поэтому, когда он достигает «дублирующих» ключей, которые на самом деле являются объектами диапазона, он вместо этого печатает значение объекта диапазона.

При пошаговом выполнении кода вы можете фактически получить любые свойства диапазона этих ключей внемедленное окно вместо!Например: ?k.Address

Чтобы исправить ваш код, вам просто нужно явно сослаться на значение ячейки:

    Cells(i, 5) = myDict(Cells(i, 4).Value)

Вот почему лучшая практика кодирования - всегда явноссылаться на свойства объектов, а не полагаться на свойства по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...