#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 словари также более эффективны по времени, чем коллекции