Дублировать словарь скриптов VBA - PullRequest
0 голосов
/ 11 октября 2018

У меня есть три поля со списком в книге, которые я хочу объединить в цепочку.Списки элементов для каждого поля со списком обновляются, когда вы нажимаете стрелку вниз на клавиатуре после нажатия кнопки раскрывающегося списка в поле со списком.Список второго поля со списком зависит от выбора, сделанного в первом поле со списком.Я построил их с использованием словарей сценариев.

strCustComboBox - это значение в предыдущем поле со списком, от которого должно зависеть текущее поле со списком.

rngProject просматривает диапазон с множеством идентификаторов котировок.Я переместился из этого столбца в столбец, в котором содержатся значения для предыдущего поля со списком, и если это значение равно strCustComboBox, то добавьте значение rngCompany в словарь сценариев

Я работаю впроблема в цикле, где я пытаюсь дедуплицировать значения rngCompany, записанные в словарь сценариев, который используется для построения списка, который будет отображаться в поле со списком.Мой код ниже.

Sub UpdateComboBox1FromDashData()
Dim strCustComboBox As MSForms.ComboBox
Dim strComboBox As MSForms.ComboBox
Dim rngCompany As Range
Dim rngProject As Range
Dim d As Object, c As Variant, i As Long

Worksheets("QuoteEditor").Unprotect "xxxx"

Application.ScreenUpdating = False

Set strCustComboBox = ThisWorkbook.Worksheets("QuoteEditor").ComboBox4
Set strComboBox = ThisWorkbook.Worksheets("QuoteEditor").ComboBox1

If strCustComboBox = "" Then

      MsgBox "Please select a project first", vbOKCancel

Else
End If

ThisWorkbook.Worksheets("DashboardData").Select

Call FindLastRow("A", "10")

Set d = CreateObject("Scripting.Dictionary")
c = Range("A10:A" & strLastRow)


Set rngProject = ThisWorkbook.Worksheets("DashboardData").Range("A10:A" & strLastRow)

i = 1

For Each rngCompany In rngProject

    If UCase(rngCompany.Offset(, 7).Value) = UCase(strCustComboBox) Then

         If d.exists(rngCompany) = True Then

         Else
             d.Add rngCompany, i
             i = i + 1

         End If

     Else

     End If

Next rngCompany

For Each Item In d

     strComboBox.AddItem (Item)

Next Item

Я думаю, где я использую d.exists(rngCompany) неправильно, но я не уверен.Когда подпрограмма заканчивается, я все еще получаю повторяющиеся данные, возвращаемые в список со списком.

Я также попробовал приведенный ниже код в соответствии с предлагаемым дублирующим потоком:

With d

    For Each rngCompany In rngProject

        If UCase(rngCompany.Offset(, 7).Value) = UCase(strCustComboBox) Then

            If Not .exists(rngCompany) Then

                d.Add rngCompany, Nothing

            Else
            End If
        End If
    Next rngCompany
End With

Может кто-нибудь увидеть, гдечто-нибудь из этого идет не так?

1 Ответ

0 голосов
/ 11 октября 2018

Вы спрятали ответ на этот вопрос в своем собственном вопросе (выделено мной):

, где я пытаюсь лишить дубликатов rngCompany значения

У d.Exists(rngCompany) нет способа вернуть true так, как вы это написали, потому что вы набираете Dictionary в диапазоне , а не его содержимое.Поскольку элементы, которые вы тестируете, являются частью итерации For Each rngCompany In rngProject, вы гарантированно будете иметь только различные диапазоны.

Решение тривиально - вам нужно явно вызвать элемент по умолчанию rngCompany:

If Not d.Exists(rngCompany.Value) Then
   d.Add rngCompany.Value, i
   i = i + 1   
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...