Интересная тема. Оценил решение с использованием 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 |