Только уникальные записи в выпадающем списке (VBA)

#excel #vba

#excel #vba

Вопрос:

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

 Private Sub MultiPage1_Change()
Dim Rand As Long
Dim ws As Worksheet
Set ws = Worksheets("BD_IR")
Dim i As Long
Rand = 3
Do While ws.Cells(Rand, 3).Value <> "" And Rand < 65536
    If Me.repereche.ListCount <> 0 Then
        For i = 0 To (Me.repereche.ListCount)
        If Me.repereche.List(i, 0) <> Mid(ws.Cells(Rand, 3).Value, 4, 10) Then
            Me.Controls("repereche").AddItem Mid(ws.Cells(Rand, 3).Value, 4, 10)
        End If
        Next i
    ElseIf Me.repereche.ListCount = 0 Then
        Me.Controls("repereche").AddItem Mid(ws.Cells(Rand, 3).Value, 4, 10)
    End If
    Rand = Rand   1
Loop
  

Проблема с этим кодом (и я не знаю, в чем проблема?) заключается в том, что всякий раз, когда я меняю страницу и возвращаюсь на страницу, где находится этот выпадающий список… он добавляет больше (не уникальных) и больше элементов. Где я ошибаюсь?

Комментарии:

1. Вам нужно очистить поле со списком, прежде чем добавлять в него элементы. Это остановит добавление «все новых и новых элементов» при каждом переключении страниц. Если вам нужны уникальные записи, считайте диапазон в массив и добавляйте каждый элемент в объект коллекции — это позволит вам добавлять только уникальные элементы, поскольку объекты коллекции отклоняют дубликаты. См . dailydoseofexcel.com/archives/2004/05/18 /… для примера кода.

2. Rand поскольку имя переменной заставляет меня думать, что это должно быть случайное число (как в RAND функции рабочего листа)

Ответ №1:

Попробуйте этот код:

 Dim ws As Worksheet
Dim rCell As Range

Set ws = Worksheets("BD_IR")

'//Clear combobox
repereche.Clear

With CreateObject("Scripting.Dictionary")
    For Each rCell In ws.Range("C3", ws.Cells(Rows.Count, "C").End(xlUp))
        If Not .exists(rCell.Value) Then
            .Add rCell.Value, Nothing
        End If
    Next rCell

    repereche.List = .keys
End With
  

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

Комментарии:

1. Хороший код и хорошая информация. Я не знал о превосходстве объекта словаря над коллекцией в этом отношении.

2. Отлично. Это первый, который работает так, как я хочу. Большое спасибо!

3. 1 словари также более эффективны по времени, чем коллекции