Словарь VBA не добавляет значения

#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 !,