Получение уникальных значений в Excel с использованием только формул - PullRequest
73 голосов
/ 16 сентября 2009

Знаете ли вы в Excel способ «вычислить» по формуле список уникальных значений?

Например: диапазон содержит значения "red", "blue", "red", "green", "blue", "black"
и я хочу получить в результате "red, "blue", "green", "black" + в конечном итоге 2 других пустые клетки.

Я уже нашел способ получить вычисленный отсортированный список, используя SMALL или LARGE в сочетании с INDEX, но я хотел бы также иметь этот вычисленный сортировку, БЕЗ ИСПОЛЬЗОВАНИЯ VBA.

Ответы [ 20 ]

1 голос
/ 21 декабря 2013

Решение Дрю Шермана очень хорошее, но список должен быть смежным (он предлагает сортировку вручную, а это для меня неприемлемо). Решение Guitarthrower довольно медленное, если количество элементов велико и не учитывает порядок исходного списка: оно выводит отсортированный список независимо от него.

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

Мое решение - это улучшение решения Дрю Шермана. Аналогично, это решение использует 2 столбца для промежуточных вычислений:

Столбец A:

Список с дубликатами и, возможно, пробелами, которые вы хотите отфильтровать. Я приведу его в качестве примера в интервале A11: A1100, потому что у меня были проблемы с переносом решения Дрю Шермана в ситуации, когда оно не начиналось с первой строки.

Колонка B:

Эта формула выведет 0, если значение в этой строке является допустимым (содержит недублированное значение). Обратите внимание, что вы можете добавить любые другие условия исключения, которые вы хотите в первом IF, или в качестве еще одного внешнего IF.

=IF(ISBLANK(A11);1;IF(COUNTIF($A$11:A11;A11)=1;0;COUNTIF($A11:A$1100;A11)))

Используйте смарт-копию для заполнения столбца.

Колонка C:

В первой строке мы найдем первую действительную строку:

=MATCH(0;B11:B1100;0)

С этой позиции мы ищем следующее допустимое значение по следующей формуле:

=C11+MATCH(0;OFFSET($B$11:$B$1100;C11;0);0)

Поместите его во вторую строку и используйте смарт-копию, чтобы заполнить остальную часть столбца. Эта формула выдаст ошибку # N / D, когда больше нет уникальных точек для указания. Мы воспользуемся этим в следующем столбце.

Столбец D:

Теперь нам просто нужно получить значения, указанные в столбце C:

=IFERROR(INDEX($A$11:$A$1100; C11); "")

Используйте смарт-копию для заполнения столбца. Это выходной уникальный список.

1 голос
/ 11 марта 2014

Я вставил то, что я использую в моем файле Excel ниже. Это выбирает уникальные значения из диапазона L11:L300 и заполняет их в столбце V, V11 и далее. В этом случае у меня есть эта формула в v11 и перетащить ее вниз, чтобы получить все уникальные значения.

=INDEX(L$11:L$300,MATCH(0,COUNTIF(V$10:V10,L$11:L$300),0))

или

=INDEX(L$11:L$300,MATCH(,COUNTIF(V$10:V10,L$11:L$300),))

это формула массива

1 голос
/ 05 сентября 2014

Я удивлен, что это решение еще не пришло. Я думаю, что это один из самых простых

Дайте вашим данным заголовок и поместите их в динамический именованный диапазон (то есть, если ваши данные в столбце A)

=OFFSET($A$2,0,0,COUNTA($A:$A),1)

А затем создайте сводную таблицу, сделав источник вашим именованным диапазоном.

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

1 голос
/ 01 апреля 2014

Вы также можете сделать это таким образом.

Создайте следующие именованные диапазоны:

nList = the list of original values
nRow = ROW(nList)-ROW(OFFSET(nList,0,0,1,1))+1
nUnique = IF(COUNTIF(OFFSET(nList,nRow,0),nList)=0,COUNTIF(nList, "<"&nList),"")

С этими 3 именованными диапазонами вы можете создать упорядоченный список уникальных значений по формуле ниже. Будет отсортировано в порядке возрастания.

IFERROR(INDEX(nList,MATCH(SMALL(nUnique,ROW()-?),nUnique,0)),"")

Вам нужно будет заменить номер строки ячейки чуть выше первого элемента вашего уникального упорядоченного списка на '?' характер.

например. Если ваш уникальный упорядоченный список начинается в ячейке B5, тогда формула будет иметь вид:

IFERROR(INDEX(nList,MATCH(SMALL(nUnique,ROW()-4),nUnique,0)),"")
0 голосов
/ 03 июня 2014

Выберите столбец с дублирующимися значениями, затем перейдите на вкладку «Данные», затем «Инструменты данных» выберите «Удалить дубликаты». 1) «Продолжить текущий выбор» 2) Нажмите кнопку Удалить дубликат .... 3) Нажмите кнопку «Выбрать все» 4) Нажмите ОК

теперь вы получите список уникальных значений.

0 голосов
/ 13 апреля 2016

Оптимизированное решение VBScript

Я использовал код totymedli, но обнаружил, что он застопорился при использовании больших диапазонов (как указано другими), поэтому я немного оптимизировал его код. Если кто-то заинтересован в получении уникальных значений с помощью VBScript, но при обновлении обнаруживает, что код totymedli медленный, попробуйте следующее:

    Function listUnique(rng As Range) As Variant
        Dim val As String
        Dim elements() As String
        Dim elementSize As Integer
        Dim newElement As Boolean
        Dim i As Integer
        Dim distance As Integer
        Dim allocationChunk As Integer
        Dim uniqueSize As Integer
        Dim r As Long
        Dim lLastRow  As Long

        lLastRow = rng.End(xlDown).row

        elementSize = 1
        unqueSize = 0

        distance = Range(Application.Caller.Address).row - rng.row

        If distance <> 0 Then
            If Cells(Range(Application.Caller.Address).row - 1, Range(Application.Caller.Address).Column).Value = "" Then
                listUnique = ""
                Exit Function
            End If
        End If

        For r = 1 To lLastRow
            val = rng.Cells(r)
            If val <> "" Then
                newElement = True
                For i = 1 To elementSize - 1 Step 1
                    If elements(i - 1) = val Then
                        newElement = False
                        Exit For
                    End If
                Next i
                If newElement Then
                    uniqueSize = uniqueSize + 1
                    If uniqueSize >= elementSize Then
                        elementSize = elementSize * 2
                        ReDim Preserve elements(elementSize - 1)
                    End If
                    elements(uniqueSize - 1) = val
                End If
            End If
        Next


        If distance < uniqueSize Then
            listUnique = elements(distance)
        Else
            listUnique = ""
        End If
    End Function
0 голосов
/ 03 марта 2016

Если поместить все данные в одни и те же столбцы и использовать следующую формулу Пример формулы: =IF(C105=C104,"Duplicate","Not a Duplicate")

Steps

  1. Сортировка данных
  2. Добавить столбец для формулы
  3. Проверяет, равна ли ячейка над ней
  4. Затем фильтр Not a Duplicate
  5. Необязательно: Скопируйте данные, рассчитанные по столбцу формулы, и вставьте только как значения (таким образом, если вы начнете удалять данные, вы не начнете получать ошибки
  6. ПРИМЕЧАНИЕ / ВНИМАНИЕ: Это работает, только если вы сначала отсортировали данные

Пример формулы: =IF(C105=C104,"Duplicate","Not a Duplicate")

0 голосов
/ 23 января 2016

Для решения, которое работает для значений в нескольких строках и столбцах, я нашел следующую формулу очень полезной: http://www.get -digital-help.com / 2009/03/16 / unique-values-from-множественные столбцы с использованием массива-формул / Оскар на get-digital.help.com даже проходит его поэтапно и наглядно.

1) Дайте диапазон значенийметка tbl_text

2) Примените следующую формулу массива с помощью комбинации клавиш CTRL + SHIFT + ENTER к ячейке B13 в этом случае.Измените $ B $ 12: B12, чтобы сослаться на ячейку над ячейкой, в которую вы вводите эту формулу.

    =INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), MATCH(0, COUNTIF($B$12:B12, INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1)), 0), 1)

3) Скопируйте / перетащите вниз, пока не получите N / A.

0 голосов
/ 03 января 2013

Недавно я столкнулся с той же проблемой и наконец понял ее.

Используя ваш список, вот паста из моего Excel с формулой.

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

Единственная ячейка с уникальной формулой находится в первом ряду.

Использование вашего списка («красный», «синий», «красный», «зеленый», «синий», «черный»); вот результат: ( У меня недостаточно высокий уровень для публикации изображения, поэтому надеюсь, что эта текстовая версия имеет смысл )

  • [Столбец A: Список оригиналов]
  • [столбец B: уникальный список результатов]
  • [Столбец C: Формула уникального списка]

    1. красный, красный, =A3
    2. синий, синий =IF(ISERROR(MATCH(A4,A$3:A3,0)),A4,"")
    3. красный,, =IF(ISERROR(MATCH(A5,A$3:A4,0)),A5,"")
    4. зеленый, зеленый, =IF(ISERROR(MATCH(A6,A$3:A5,0)),A6,"")
    5. синий, =IF(ISERROR(MATCH(A7,A$3:A6,0)),A7,"")
    6. черный, черный, =IF(ISERROR(MATCH(A8,A$3:A7,0)),A8,"")
0 голосов
/ 09 мая 2014

Это работает, только если значения в порядке, т.е. все «красные» вместе и все «синие» вместе и т. Д. предположим, что ваши данные находятся в столбце A, начиная с A2 - (не начинайте со строки 1) В типе B2 в 1 В b3 введите = if (A2 = A3, B2, B2 + 1) Перетащите формулу до конца ваших данных Все "красные" будут 1, все "синие" будут 2, все "зеленые" будут 3 и т. Д.

В C2 введите 1, 2, 3 и т. Д., Спускаясь вниз по столбцу В D2 = OFFSET ($ A $ 1, MATCH (c2, $ B $ 2: $ B $ x, 0), 0) - где x - последняя ячейка Перетащите вниз, появятся только уникальные значения. - поставить некоторую проверку ошибок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...