Получение уникальных значений в 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.
объяснение с образцами данных {"красный"; "синий"; "красный"; "зеленый"; "синий"; "черный"}:
-
COUNTIF(Colors,"<"&Colors)
возвращает массив (#1) с учетом значений, которые меньше, чем каждый элемент в данных {4;1;4;3;1;0} (черный=0 пунктов меньше, синий=1 шт, Красный=4 элемента). Это можно перевести на значение для каждого элемента. -
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} он указывает на "черный", и все вхождения" синего " уже присутствуют. - на
SUM
возвращает k-th сортировать значение, подсчитывая все вхождения меньших значений, которые уже присутствуют (сумма массива #2). -
MATCH
находит первый индекс k-го значения сортировки (индекс в массиве #1). - на
IFERROR
только скрыть#N/A
ошибка в нижних ячейках, когда сортированный уникальный список завершен.
чтобы узнать, сколько уникальных предметов у вас есть, вы можете использовать это обычная формула:
=SUM(IF(FREQUENCY(COUNTIF(Colors,"<"&Colors),COUNTIF(Colors,"<"&Colors)),1))
Ок, у меня есть две идеи для вас. Надеюсь, один из них доставит вас туда, куда вам нужно. Обратите внимание, что первый игнорирует просьбу сделать это как формулу, так как это решение не очень. Я решил, что удостоверюсь, что простой способ действительно не сработает для вас;^).
используйте команду Расширенный фильтр
- выберите список (или поместите свой выбор в любом месте списка и нажмите ok, если появится диалоговое окно с жалобой на то, что Excel не знает, если ваш список содержит заголовки или нет)
- Выберите Данные / Расширенный Фильтр
- выберите "фильтровать список, на месте" или " копировать в другое место"
- выберите "только уникальные записи"
- нажмите ok
- вы сделали. Уникальный список создается либо на месте, либо в новом месте. Обратите внимание, что вы можете записать это действие, чтобы создать однострочный скрипт VBA для этого, который затем может быть обобщен для работы в других ситуациях для вас (например без ручных шагов, перечисленных выше).
использование формул (обратите внимание, что я строю на решении Locksfree, чтобы получить список без отверстий)
Это решение будет работать со следующими оговорками:
вот краткое изложение решения:
- для каждого элемента в списке, подсчитать количество повторений выше.
- для каждого места в уникальном списке вычислите индекс следующего уникального элемента.
- наконец, используйте индексы для создания нового списка только с уникальными предметами.
и вот пошаговый пример:
- открыть новую таблицу
- В a1: a6 введите пример, приведенный в исходном вопросе ("красный", "синий", "красный", "зеленый", "синий", " черный")
- сортировка списка: поместите выделение в список и выберите команду сортировки.
- в столбце B вычислите дубликаты:
- В B1 введите " =IF (COUNTIF ($A$1: A1,A1) = 1,0,COUNTIF(A1:$A$6,A1))". Обратите внимание, что " $ " в ссылках на ячейки очень важны, так как это сделает следующий шаг (заполнение остальной части столбца) намного проще. "$"Указывает на абсолютную ссылку, чтобы при копировании/вставке содержимого ячейки ссылка не обновлялась (в отличие от относительной ссылки, которая будет обновляться).
- используйте smart copy для заполнения остальной части столбца B: выберите B1. Наведите курсор мыши на черный квадрат в правом нижнем углу выделения. Щелкните и перетащите вниз в нижней части списка (B6). После выпуска формула будет скопирована в B2: B6 с обновленными относительными ссылками.
- значение B1: B6 теперь должно быть "0,0,1,0,0,1". Обратите внимание, что записи" 1 " указывают на дубликаты.
- в столбце C создайте индекс уникальных элементов:
- в C1 введите " =Row ()". Вы действительно просто хотите C1 = 1, но использование Row () означает, что это решение будет работать, даже если список не запускается в строке 1.
- В C2 введите "=IF (C1+1
- используйте smart copy для заполнения C3: C6.
- значение C1:C6 должно быть " 1,2,4,5,7,8"
- в столбце D, создайте новый уникальный список:
- в D1 введите " =IF (C1
- используйте smart copy для заполнения D2: D6.
- значения D1: D6 теперь должны быть "черный","синий","зеленый","красный","","".
надеюсь, что это помогает....
решение
Я создал функцию в VBA для вас, поэтому вы можете сделать это сейчас простым способом.
Создайте модуль кода VBA (макрос), как вы можете видеть в в этом уроке.
- пресс Alt+F11
- клик
Module
наInsert
. - вставляем код.
- если Excel говорит, что ваш формат файла не является макросом, чем сохранить его как
Excel Macro-Enabled
inSave 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
начинается.
пример
регулярные дело
- введите данные и вызовите функцию.
- вырастить его.
- вуаля.
пустой корпус ячейки
он работает в Столбцах, в которых есть пустые ячейки. Также функция ничего не выводит (не ошибки), если вы перематываете ячейки (вызывая функцию) в места, где не должно быть вывода, Как я это сделал в предыдущем примере "2. Вырастить его" часть.
окольный путь-загрузить электронную таблицу 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)));"")
то это должно выглядеть примерно так;
попробуйте эту формулу в B2
ячейка
=IFERROR(INDEX($A:$A,MATCH(0,COUNTIF(B:$B1,$A:$A),0),1),"")
после нажатия F2
и нажать Ctrl
+ Shift
+ Enter
вы можете использовать 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),))
это формула массива
обращение к сводной таблице может не считаться используя формулы только но, кажется, более практичным, что большинство других предложений до сих пор:
недавно я столкнулся с той же проблемой и, наконец, понял это.
используя ваш список, вот вставка из моего Excel с формулой.
Я рекомендую написать формулу где-то в середине списка, например, в ячейке C6
моего примера, а затем скопировать его и вставить его вверх и вниз по вашему столбцу, формула должна автоматически корректироваться без необходимости перепечатывать его.
единственная ячейка, которая имеет уникально разные формула находится в первой строке.
используя свой список ("красный", "синий", "красный", "зеленый", "синий", "черный"); вот результат: (у меня нет достаточно высокого уровня, чтобы опубликовать изображение, поэтому надеюсь, что эта версия txt имеет смысл)
- [Столбец A: Исходный Список]
- [Столбец B: Уникальный Результат Списка]
-
[Столбец C: Уникальная Формула Списка]
- красный, красный,
=A3
- синий, голубой,
=IF(ISERROR(MATCH(A4,A:A3,0)),A4,"")
- красный, ,
=IF(ISERROR(MATCH(A5,A:A4,0)),A5,"")
- зеленый, зеленый,
=IF(ISERROR(MATCH(A6,A:A5,0)),A6,"")
- синий, ,
=IF(ISERROR(MATCH(A7,A:A6,0)),A7,"")
- черный, черный,
=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")
шаги
- сортировка данных
- добавить столбец для Формулы
- проверяет, равна ли ячейка ячейке над ней
- фильтр
Not a Duplicate
- необязательно: скопируйте данные, вычисленные столбцом формулы, и вставьте только как значения (таким образом, если вы начнете удалять данные, вы не начнете получать ошибки
- Примечание / предупреждение: это работает, только если вы сначала отсортируете данные
Пример Формулы: =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
теперь вы получаете уникальный список значений.