Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Combobox с поиском, VBA
 
Интересная тема. Оценил решение с использованием recordset от Андрея. Изящно. Несколько не согласен с использованием UsedRange, изменил.
Сортировку с килом дублей реализовал так, для начинающих с пояснениями, вдруг кому поможет.
Код
Private Sub UserForm_Initialize()
        
With Worksheets("sheet1")
Dim Lastrow As Long
Lastrow = .Cells(Rows.Count, 3).End(xlUp).Row 'находим последнюю задействованную ячейку в интересующем столбце
End With

Dim i As Long, strName As String, tekName As String 'добавляем пару переменных
cmbSource.CursorLocation = adUseClient              'тут все, как в оригинале
cmbSource.Fields.Append "names", adVarWChar, 128
cmbSource.Open
       
For i = 2 To Lastrow                    'задаем необходимый диапазон выборки
cmbSource.AddNew
cmbSource(0).Value = Trim$(Worksheets("sheet1").Cells(i, 3)) 'заполняем массив значениями из указанного диапазона, удаляем лишние пробелы
Next
If cmbSource.EOF = True Then Exit Sub   'предотвращаем ошибку, если диапазон пуст
        
With cmbSource                          'начинаем работу со сформированным массивом
.Sort = "names"                         'сортируем массив по алфавиту, все пустые строки переместились в начало, повторяющиеся значения сгруппировались
cmbSource.MoveFirst                     'переходим к первой строке сформированного массива
    
Do Until cmbSource(0).Value <> ""       'задаем условия выполнения до тех пор, пока значения пусты
cmbSource.Delete                        'удаляем текущую строку массива
cmbSource.MoveNext                      'переходим к следующей строке
If cmbSource.EOF = True Then Exit Sub   'предотвращаем ошибку, если в массиве были только пустые строки
Loop                                    'зацикливаем

strName = cmbSource(0).Value            'присваеваем первой переменной значение первой строки, в которой есть данные
cmbSource.MoveNext                      'переходим к следующей строке

Do Until cmbSource.EOF                  'задаем условия выполнения до тех пор, пока массив не закончится
tekName = cmbSource(0).Value            'присваем второй переменной значение текущей строки
If tekName = strName Then               'сравниваем значения первой и второй переменных
cmbSource.Delete                        'если они совпадают, удаляем текущую строку массива
cmbSource.MoveNext                      'переходим к следующей строке
Else: 
strName = cmbSource.Fields("names").Value 'в противном случае заменяем значение первой переменной на текущее
cmbSource.MoveNext                      'переходим к следующей строке
End If
Loop                                    'зацикливаем

cmbSource.MoveFirst                     'переходим к первой строке отредактированного массива
cmbNames.Column = cmbSource.GetRows()   'заполняем комбобокс значениями из массива
End With
End Sub
Страницы: 1
Наверх