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

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

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

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

Ответы [ 20 ]

53 голосов
/ 17 сентября 2009

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

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

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

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

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

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

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

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

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

  1. Открыть новую электронную таблицу
  2. В a1: a6 введите пример, приведенный в исходном вопросе («красный», «синий», «красный», «зеленый», «синий», «черный»)
  3. Сортировка списка: поместите выбор в список и выберите команду сортировки.
  4. В столбце B рассчитайте дубликаты:
    1. В B1 введите «= ЕСЛИ (СЧЕТЧИК ($ A $ 1: А1, А1) = 1,0, СЧЕТЧИК (А1: $ A $ 6, А1))». Обратите внимание, что «$» в ссылках на ячейки очень важен, так как это сделает следующий шаг (заполнение остальной части столбца) намного проще. «$» Обозначает абсолютную ссылку, поэтому при копировании / вставке содержимого ячейки ссылка не будет обновляться (в отличие от относительной ссылки, которая будет обновляться).
    2. Используйте смарт-копию для заполнения оставшейся части столбца 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. Используйте смарт-копию для заполнения C3: C6.
    4. Значение C1: C6 должно быть «1,2,4,5,7,8»
  6. В столбце D создайте новый уникальный список:
    1. В D1 введите "= IF (C1
    2. Используйте смарт-копию для заполнения D2: D6.
    3. Значения D1: D6 теперь должны быть «черными», «синими», «зелеными», «красными», «», «».

Надеюсь, это поможет ....

28 голосов
/ 11 мая 2015

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

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

=IFERROR(INDEX(Colors,MATCH(SUM(COUNTIF(C$1: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$1: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-й , подсчитывая все вхождения меньших значений, которые уже присутствуют (сумма массива # 2).
  4. MATCH находит первый индекс k-го значения сортировки (индекс в массиве # 1).
  5. IFERROR только для того, чтобы скрыть ошибку #N/A в нижних ячейках, когда отсортированный уникальный список завершен.

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

=SUM(IF(FREQUENCY(COUNTIF(Colors,"<"&Colors),COUNTIF(Colors,"<"&Colors)),1))
22 голосов
/ 27 июня 2013

Решение

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

  1. Нажмите Alt + F11
  2. Нажмите, чтобы Module in Insert.
  3. Вставить код.
  4. Если в Excel указано, что формат файла не поддерживает макросы, сохраните его как Excel Macro-Enabled в 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$1:A$28 или H$8:H$30.

Условия

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

Пример

Обычный случай

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

Пустой кейс

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

Empty cell case

17 голосов
/ 12 июня 2013

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

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

3 голосов
/ 26 октября 2014

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

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

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

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

3 голосов
/ 08 сентября 2015

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

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

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

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

Это ФОРМУЛА Массива

3 голосов
/ 06 июля 2017

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

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

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

enter image description here

2 голосов
/ 22 мая 2013

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

= ЕСЛИ (СЧЕТЕСЛИ (А5: $ A $ 772, А5) = 1, А5 "")

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

2 голосов
/ 16 сентября 2009

Вы можете использовать COUNTIF, чтобы получить число вхождений значения в диапазоне. Поэтому, если значение находится в A3, диапазон равен A1: A6, тогда в следующем столбце используйте IF (EXACT (COUNTIF (A3: $ A $ 6, A3), 1), A3, ""). Для A4 это будет ЕСЛИ (ТОЧНО (СЧЕТЧИК (A4: $ A $ 6, A3), 1), A4, "")

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

1 голос
/ 08 июня 2017

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

SO1429899 example

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