Получение уникальных значений в Excel с помощью формул только

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

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

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

20 ответов


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

я назвал список цветов Colors (A2:A7), и формула массива в камеру C2 это (основные):

=IFERROR(INDEX(Colors,MATCH(SUM(COUNTIF(C:C1,Colors)),COUNTIF(Colors,"<"&Colors),0)),"")

использовать Ctrl+Shift+Enter ввести формулу в C2, и скопируйте C2 вниз к C3: C7.

объяснение с образцами данных {"красный"; "синий"; "красный"; "зеленый"; "синий"; "черный"}:

  1. COUNTIF(Colors,"<"&Colors) возвращает массив (#1) с учетом значений, которые меньше, чем каждый элемент в данных {4;1;4;3;1;0} (черный=0 пунктов меньше, синий=1 шт, Красный=4 элемента). Это можно перевести на значение для каждого элемента.
  2. COUNTIF(C:C...,Colors) возвращает массив (#2) с 1 для каждого элемента данных, который уже в отсортированном результат. В C2 он возвращается {0;0;0;0;0;0} и в C3 {0;0;0;0;0;1} потому что "черный" является первым в сортировке и последним в данных. В C4 {0;1;0;0;1;1} он указывает на "черный", и все вхождения" синего " уже присутствуют.
  3. на SUM возвращает k-th сортировать значение, подсчитывая все вхождения меньших значений, которые уже присутствуют (сумма массива #2).
  4. MATCH находит первый индекс k-го значения сортировки (индекс в массиве #1).
  5. на IFERROR только скрыть #N/A ошибка в нижних ячейках, когда сортированный уникальный список завершен.

чтобы узнать, сколько уникальных предметов у вас есть, вы можете использовать это обычная формула:

=SUM(IF(FREQUENCY(COUNTIF(Colors,"<"&Colors),COUNTIF(Colors,"<"&Colors)),1))

Ок, у меня есть две идеи для вас. Надеюсь, один из них доставит вас туда, куда вам нужно. Обратите внимание, что первый игнорирует просьбу сделать это как формулу, так как это решение не очень. Я решил, что удостоверюсь, что простой способ действительно не сработает для вас;^).

используйте команду Расширенный фильтр

  1. выберите список (или поместите свой выбор в любом месте списка и нажмите ok, если появится диалоговое окно с жалобой на то, что Excel не знает, если ваш список содержит заголовки или нет)
  2. Выберите Данные / Расширенный Фильтр
  3. выберите "фильтровать список, на месте" или " копировать в другое место"
  4. выберите "только уникальные записи"
  5. нажмите ok
  6. вы сделали. Уникальный список создается либо на месте, либо в новом месте. Обратите внимание, что вы можете записать это действие, чтобы создать однострочный скрипт VBA для этого, который затем может быть обобщен для работы в других ситуациях для вас (например без ручных шагов, перечисленных выше).

использование формул (обратите внимание, что я строю на решении Locksfree, чтобы получить список без отверстий)

Это решение будет работать со следующими оговорками:

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

    вот краткое изложение решения:

    1. для каждого элемента в списке, подсчитать количество повторений выше.
    2. для каждого места в уникальном списке вычислите индекс следующего уникального элемента.
    3. наконец, используйте индексы для создания нового списка только с уникальными предметами.

    и вот пошаговый пример:

    1. открыть новую таблицу
    2. В a1: a6 введите пример, приведенный в исходном вопросе ("красный", "синий", "красный", "зеленый", "синий", " черный")
    3. сортировка списка: поместите выделение в список и выберите команду сортировки.
    4. в столбце B вычислите дубликаты:
      1. В B1 введите " =IF (COUNTIF ($A$1: A1,A1) = 1,0,COUNTIF(A1:$A$6,A1))". Обратите внимание, что " $ " в ссылках на ячейки очень важны, так как это сделает следующий шаг (заполнение остальной части столбца) намного проще. "$"Указывает на абсолютную ссылку, чтобы при копировании/вставке содержимого ячейки ссылка не обновлялась (в отличие от относительной ссылки, которая будет обновляться).
      2. используйте smart copy для заполнения остальной части столбца B: выберите B1. Наведите курсор мыши на черный квадрат в правом нижнем углу выделения. Щелкните и перетащите вниз в нижней части списка (B6). После выпуска формула будет скопирована в B2: B6 с обновленными относительными ссылками.
      3. значение B1: B6 теперь должно быть "0,0,1,0,0,1". Обратите внимание, что записи" 1 " указывают на дубликаты.
    5. в столбце C создайте индекс уникальных элементов:
      1. в C1 введите " =Row ()". Вы действительно просто хотите C1 = 1, но использование Row () означает, что это решение будет работать, даже если список не запускается в строке 1.
      2. В C2 введите "=IF (C1+1
      3. используйте smart copy для заполнения C3: C6.
      4. значение C1:C6 должно быть " 1,2,4,5,7,8"
    6. в столбце D, создайте новый уникальный список:
      1. в D1 введите " =IF (C1
      2. используйте smart copy для заполнения D2: D6.
      3. значения D1: D6 теперь должны быть "черный","синий","зеленый","красный","","".

    надеюсь, что это помогает....


  • решение

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

    1. пресс Alt+F11
    2. клик Module на Insert.
    3. вставляем код.
    4. если Excel говорит, что ваш формат файла не является макросом, чем сохранить его как Excel Macro-Enabled in Save As.

    исходный код

    Function listUnique(rng As Range) As Variant
        Dim row As Range
        Dim elements() As String
        Dim elementSize As Integer
        Dim newElement As Boolean
        Dim i As Integer
        Dim distance As Integer
        Dim result As String
    
        elementSize = 0
        newElement = True
    
        For Each row In rng.Rows
            If row.Value <> "" Then
                newElement = True
                For i = 1 To elementSize Step 1
                    If elements(i - 1) = row.Value Then
                        newElement = False
                    End If
                Next i
                If newElement Then
                    elementSize = elementSize + 1
                    ReDim Preserve elements(elementSize - 1)
                    elements(elementSize - 1) = row.Value
                End If
            End If
        Next
    
        distance = Range(Application.Caller.Address).row - rng.row
    
        If distance < elementSize Then
            result = elements(distance)
            listUnique = result
        Else
            listUnique = ""
        End If
    End Function
    

    использование

    просто введите =listUnique(range) в клетку. Единственный параметр range это обычный диапазон Excel. Например: A:A или H:H.

    условия

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

    пример

    регулярные дело

    1. введите данные и вызовите функцию.
      Enter data and call function
    2. вырастить его.
      Grow it
    3. вуаля.
      Voilà

    пустой корпус ячейки

    он работает в Столбцах, в которых есть пустые ячейки. Также функция ничего не выводит (не ошибки), если вы перематываете ячейки (вызывая функцию) в места, где не должно быть вывода, Как я это сделал в предыдущем примере "2. Вырастить его" часть.

    Empty cell case


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

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


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

    допустим, у вас есть "красный", "синий", "красный", "зеленый", "синий", "черный" в столбце A2:A7

    затем поместите это в B2 как формулу массива и скопируйте =IFERROR(INDEX(A:A;SMALL(IF(FREQUENCY(MATCH(A:A;A:A;0);ROW(INDIRECT("1:"&COUNTA(A:A))));ROW(INDIRECT("1:"&COUNTA(A:A)));"");ROW(A1)));"")

    то это должно выглядеть примерно так; enter image description here


    попробуйте эту формулу в B2 ячейка

    =IFERROR(INDEX($A:$A,MATCH(0,COUNTIF(B:$B1,$A:$A),0),1),"")
    

    после нажатия F2 и нажать Ctrl + Shift + Enter

    enter image description here


    вы можете использовать COUNTIF для получения числа появления значения в диапазоне . Поэтому, если значение находится в A3, диапазон A1: A6, то в следующем столбце используйте IF(EXACT(COUNTIF(A3:$A$6, A3),1), A3, ""). Для A4 это было бы если (точный (COUNTIF(A4:$A$6, A3), 1), A4,"")

    Это даст вам столбец, где все уникальные значения без каких-либо дубликатов


    предполагая, что столбец A содержит значения, которые вы хотите найти один уникальный экземпляр, и имеет строку заголовка, я использовал следующую формулу. Если вы хотите, чтобы он масштабировался с непредсказуемым количеством строк, вы можете заменить A772 (где заканчивались мои данные) на =АДРЕС (COUNTA (A:A), 1).

    =IF (COUNTIF(A5:$A $ 772, A5)=1,A5,"")

    Это отобразит уникальное значение в последнем экземпляре каждого значения в столбце и не предполагает никакой сортировки. Это занимает преимущество отсутствия абсолютов, по существу, имеет уменьшающееся "скользящее окно" данных для подсчета. Если значение countif в уменьшенном окне равно 1, то эта строка является последним экземпляром этого значения в столбце.


    даже чтобы получить отсортированное уникальное значение, это можно сделать с помощью формулы. Это опция, которую вы можете использовать:

    =INDEX($A:$A,MATCH(SUM(COUNTIF($A:$A,C:C1)),COUNTIF($A:$A,"<" &$A:$A),0))
    

    диапазон данных: A2:A18

    формула в ячейке C2

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


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

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

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

    Столбец A:

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

    Столбец B:

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

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

    используйте smart copy для заполнения столбца.

    Столбец C:

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

    =MATCH(0;B11:B1100;0)
    

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

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

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

    Столбец D:

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

    =IFERROR(INDEX($A:$A00; C11); "")
    

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


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

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

    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)),"")
    

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

    дайте вашим данным заголовок и поместите его в динамический именованный диапазон (т. е. если ваши данные находятся в col A)

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

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

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


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

    =INDEX(L:L0,MATCH(0,COUNTIF(V:V10,L:L0),0))
    

    или

    =INDEX(L:L0,MATCH(,COUNTIF(V:V10,L:L0),))
    

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


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

    SO1429899 example


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

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

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

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

    используя свой список ("красный", "синий", "красный", "зеленый", "синий", "черный"); вот результат: (у меня нет достаточно высокого уровня, чтобы опубликовать изображение, поэтому надеюсь, что эта версия txt имеет смысл)

    • [Столбец A: Исходный Список]
    • [Столбец B: Уникальный Результат Списка]
    • [Столбец C: Уникальная Формула Списка]

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

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

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


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

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

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

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

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


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

    шаги

    1. сортировка данных
    2. добавить столбец для Формулы
    3. проверяет, равна ли ячейка ячейке над ней
    4. фильтр Not a Duplicate
    5. необязательно: скопируйте данные, вычисленные столбцом формулы, и вставьте только как значения (таким образом, если вы начнете удалять данные, вы не начнете получать ошибки
    6. Примечание / предупреждение: это работает, только если вы сначала отсортируете данные

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


    Оптимизированное Решение 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
    

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

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