#vba #excel #dictionary
#vba #excel #словарь
Вопрос:
Я пытаюсь написать функцию, которая выполняет поиск в определенном столбце (назовем его столбцом A) по термину «Запрос». Как только эта строка найдена, выполняется поиск уникального термина в другом столбце (назовем его столбцом B) в той же строке. Цель состоит в том, чтобы подсчитать, сколько уникальных терминов в столбце B соответствует термину «Запрос» в столбце A. Способ, которым я пытался это сделать, заключается в создании словаря и добавлении в него термина, если этот термин еще не существует в словаре. Программа подсчитывает, сколько терминов добавлено в словарь, чтобы я знал, сколько в нем уникальных терминов. Однако код, который у меня есть сейчас, просто продолжает добавлять каждый термин в словарь, независимо от того, существует ли этот термин уже или нет. Я уже некоторое время пытаюсь разобраться в этом и не могу до конца разобраться. Вот код:
j = 0
For i = 1 To LastRow
If Cells(i, 13).Value Like "Request" Then
Set dic = CreateObject("Scripting.Dictionary")
If Not dic.exists(Cells(i, 13)) Then
ucount = ucount 1
dic.Add j, Cells(i, 13)
j = j 1
End If
End If
Next i
Я думаю, что проблема может заключаться в dic.Добавьте функцию, но я не уверен. Я относительно новичок в VBA и кодировании в целом.
Комментарии:
1.
Add
параметрами являютсяkey
,value
—Exists
метод проверяет ключ, а не значение, и вы добавляетеj
в качестве ключа при добавлении элемента. Также у вас нет подстановочных знаков в вашемLike
сравнении, поэтому он найдет только точное значение «Запрос» — возможно, вы имели в виду » Запрос «?2. Хорошее предложение, но на самом деле у меня раньше было наоборот, и это тоже так не работало. Я смешал это, чтобы посмотреть, что произойдет, но, очевидно, это не помогло.
Ответ №1:
Dim dict as Object, tmp
Set dict = CreateObject("Scripting.Dictionary")
For i = 1 To LastRow
If Cells(i, "A").Value = "Request" Then
tmp = Cells(i, "B").Value
If Not dict.exists(tmp) Then
dict.Add tmp, 1
End If
End If
Next i
Debug.Print dict.Count 'no need for a separate counter
Комментарии:
1. 1 нет необходимости в отдельной переменной счетчика. Кроме того, если пользователю не нужно изменять сохраненное значение , если ключ уже существует, можно безопасно опустить
If Not dict.exists
тест в пользу простогоdict(tmp) = 1
2. Извините, я довольно новичок на этом сайте и не думал этого делать.
Ответ №2:
Ваша проблема в том, где находится эта строка:
Set dic = CreateObject("Scripting.Dictionary")
Каждый раз, когда вы нажимаете на эту строку, ваш словарь сбрасывается и повторно инициализируется.
Переместите его перед вашим циклом целиком:
j = 0
Set dic = CreateObject("Scripting.Dictionary")
For i = 1 To LastRow
If Cells(i, 13).Value Like "Request" Then
If Not dic.exists(Cells(i, 13).value) Then
ucount = ucount 1
dic.Add j, Cells(i, 13).value
j = j 1
End If
End If
Next i
Комментарии:
1. Я только что попробовал это, и, к сожалению, у меня все еще та же проблема. Код просто продолжает выполнять цикл во втором операторе if независимо от того, был ли замечен термин или нет.
2. вы
if not dic.exist
должны быть ключевым значением, т. е. J !,