mail mail

Извлечение уникальных значений из диапазона ячеек или массива

Функция UniqueValuesFromArray позволяет найти в указанном столбце двумерного массива все уникальные значения, и получить новый массив, содержащий все найденные уникальные значения.
Это может пригодиться, если надо, к примеру, заполнить ComboBox на форме возможными вариантами значений из базы данных:

Private Sub UserForm_Initialize()
    On Error Resume Next: arr = PriceRange.Value
    If Err Then MsgBox "Нет строк для обработки!", vbCritical, "Ошибка": End
   
    ' заполняем комбобокс уникальными значениями из 6-го столбца таблицы
   Me.ComboBox_Source.List = UniqueValuesFromArray(arr, 6)
End Sub

Код самой функции:

Function UniqueValuesFromArray(ByVal arr, ByVal col As Long) As Variant
    ' перебирает все значения в столбце Col двумерного массива arr
   ' в поисках уникальных значений. Возвращает двумерный вертикальный массив
   ' размерностью N * 1, содержащий уникальные значения из столбца col
   If Not IsArray(arr) Then MsgBox "Это не массив!", vbCritical: Exit Function
    If col > UBound(arr, 2) Then MsgBox "Нет такого столбца в массиве!", vbCritical: Exit Function
    If col < LBound(arr, 2) Then MsgBox "Нет такого столбца в массиве!", vbCritical: Exit Function

    On Error Resume Next: Dim coll As New Collection, txt$
    For i = LBound(arr) To UBound(arr)
        txt$ = Trim(arr(i, col)): coll.Add txt$, txt$
    Next i
    ReDim newarr(1 To coll.Count, 1 To 1)
    For i = 1 To coll.Count: newarr(i, 1) = coll(i): Next i
    UniqueValuesFromArray = newarr
End Function

Во вложении - пример использования этой функции в макросе (вывод уникальных записей в другой столбец листа), и пользовательская функция Уникальные - для использования в формулах листа Excel.

Макрос и дополнительная функция из файла во вложении:

Sub ВыборкаУникальных()
    ' берем диапазон ячеек из первого столбца активного листа
   Dim ПервыйСтолбец As Range: Set ПервыйСтолбец = Range([A1], Range("A" & Rows.Count).End(xlUp))

    ' выбираем из него уникальные значения
   МассивУникальных = UniqueValuesFromArray(ПервыйСтолбец.Value, 1)

    ' и заносим их в другой столбец, начиная с ячейки D1
   Range("D1").Resize(UBound(МассивУникальных)).Value = МассивУникальных
End Sub

' пользовательская функция - для использования в качестве формулы массива
Function Уникальные(ByVal ra As Range) As Variant
    ' перебирает все значения в диапазоне ra в поисках уникальных значений.
   ' Возвращает двумерный массив, содержащий уникальные значения из диапазона ra
   On Error Resume Next: Dim cell As Range, coll As New Collection, txt$
    For Each cell In ra.Cells
        txt$ = Trim(cell): If Len(txt$) Then coll.Add txt$, txt$
    Next cell
    ReDim newarr(1 To coll.Count, 1 To 1)
    For i = 1 To coll.Count: newarr(i, 1) = coll(i): Next i
    Уникальные = newarr
End Function

ВложениеРазмер
Unique.xls41.5 КБ

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Здравствуйте EducatedFool (Игорь). Мне очень понравилась ваша функция (
Извлечение уникальных значений из диапазона ячеек или массива), но меня еще больше заинтересовал ответ #3, в котором прикреплен пример (Пример в файле: http://excelvba.ru/XL_Files/Sample__21-08-2011__17-14-22.zip).
Вопрос по данной функции, а можно сделать чтобы поиск уникальных значений ввелся с конца массива? И значение записывалось первое найденное в конце массива?
Спасибо за ответ

Да, пример Sample__21-08-2011__17-14-22.zip - самое то.

Еще раз большое спасибо!

Спасибо. Буду изучать.

Так сделать можно, но...
одно дело - выбрать уникальные значения (тут всё ясно, вариантов особо нет),
и совсем другое - выбрать строки с уникальными значениями в каком-то столбце.

К примеру, есть у нас 3 строки с одинаковыми значениями в 1-м столбце.
Какую из этих трёх строк выводить в результат? Первую, третью, вторую?

Вообще, у меня есть уже такая функция (даже с большей функциональностью, чем вам требуется):
http://excelvba.ru/code/JoinedArray

Пример её использования для вашего случая:

' отбираем уникальные строки (определяя уникальность по первому столбцу массива)
  arr = JoinedArray(Массив, 1)

Пример в файле: http://excelvba.ru/XL_Files/Sample__21-08-2011__17-14-22.zip

Извините за надоедливость ))
Возни еще один вопрос.

Сейчас выборка уникальный происходит только по столбцу "A".
Возможно ли сделать выборку уникальных по столбцу "A", но с условием, чтобы в диапазон фильтрования попадали также столбцы B и C ?

Т.е. чтобы был аналог функционалу Excel 2007: Выделяю столбцы A,B,C => Данные => Удалить дубликаты => В качестве столбца, по которому будет происходить удаление дубликатов выбираю только столбец A.

Как результат: уникальные значения будут отобраны по столбцу "А", но соответствующие записи из столбцов B и C будут также сохранены.

Вроде разобрался:
Dim ПервыйСтолбец As Range: Set ПервыйСтолбец = Range(Sheets("данные").Range("A1"), Sheets("данные").Range("A" & Rows.Count).End(xlUp))

Здравствуйте!

Подскажите, пожалуйста. Сейчас макрос срабатывает в случае если активен лист с массивом.
Как правильно добавить название листа в запись, чтобы активация листа с массивом не была обязательной?

Я пробовал вот так, но макрос выдает ошибку:

Dim ПервыйСтолбец As Range: Set ПервыйСтолбец = Sheets("данные").Range([A1], Sheets("данные").Range("A" & Rows.Count).End(xlUp))

все прекрасно, только не совсем понятно, что происходит.. вот был бы файлик с работающим примером, там хоть по результату можно было б вычислить, что-куда

Отличный пример использования коллекций для создания массива уникальных записей. Давно использую коллекции, но до этого сам не додумался. И работает быстро ))

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
7 + 8 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.