Skip to content
В этом руководстве вы узнаете, как посчитать уникальные значения в Excel с помощью формул и как это сделать в сводной таблице. Мы также разберём несколько примеров счёта уникальных текстовых и числовых значений, в том числе с учетом регистра букв.
При работе с большим набором данных в Excel вам часто может потребоваться знать, сколько в вашей таблице повторяющихся и сколько уникальных записей.
И вот о чем мы сейчас поговорим:
- Как посчитать уникальные значения в столбце.
- Считаем уникальные текстовые значения.
- Подсчет уникальных чисел.
- Как посчитать уникальные с учётом регистра.
- Формулы для подсчета различных значений.
- Как не учитывать пустые ячейки?
- Сколько встречается различных чисел?
- Считаем различные текстовые значения.
- Как сосчитать различные текстовые значения с учетом условий?
- Считаем количество различных чисел с ограничениями.
- Как учесть регистр при подсчёте?
- Как посчитать уникальные строки?
- Используем сводную таблицу.
Если вы регулярно посещаете этот блог, вы уже знаете формулу Excel для подсчета дубликатов. А сегодня мы собираемся изучить различные способы подсчета уникальных значений в Excel. Но для ясности давайте сначала определимся с терминами.
- Уникальные значения – те, которые появляются в списке только один раз.
- Различные – это все, которые имеются в списке без учета повторов, то есть уникальные плюс первое вхождение повторяющихся.
Следующий рисунок иллюстрирует эту разницу:
А теперь давайте посмотрим, как можно их посчитать с помощью формул и функций сводной таблицы.
Далее вы найдете несколько примеров для подсчета уникальных данных разных типов.
Считаем уникальные значения в столбце.
Предположим, у вас есть столбец с именами на листе Excel, и вам нужно подсчитать, сколько там есть неповторяющихся. Самое простое решение состоит в том, чтобы использовать функцию СУММ в сочетании с ЕСЛИ и СЧЁТЕСЛИ :
=СУММ(ЕСЛИ(СЧЁТЕСЛИ(диапазон ; диапазон ) = 1,1,0))
Примечание. Это формула массива, поэтому обязательно нажмите Ctrl + Shift + Enter, чтобы корректно ввести её. Как только вы это сделаете, Excel автоматически заключит всё выражение в {фигурные скобки}, как показано на скриншоте ниже. Ни в коем случае нельзя вводить фигурные скобки вручную, это не сработает.
В этом примере мы считаем уникальные имена в диапазоне A2: A10, поэтому наше выражение выглядит так:
{=СУММ(ЕСЛИ(СЧЁТЕСЛИ(A2:A10;A2:A10)=1;1;0))}
Этот метод подходит и для текстовых, и для цифровых данных. Недостатком является то, что в качестве уникального он будет пересчитывать любое содержимое, в том числе и ошибки.
Далее в этом руководстве мы обсудим несколько других подходов для подсчета уникальных значений разных типов. И поскольку в основном они являются вариациями этой базовой формулы, имеет смысл подробно рассмотреть её. Если вы поймете, как это работает, то сможете настроить ее для своих данных. Если кого-то не интересуют технические подробности, вы можете сразу перейти к следующему примеру.
Как работает формула подсчета уникальных значений?
Как видите, здесь используются 3 разные функции – СУММ, ЕСЛИ и СЧЁТЕСЛИ. Посмотрим, что делает каждая из них:
- Функция СЧЁТЕСЛИ считает, сколько раз каждое отдельное значение появляется в анализируемом диапазоне.
В этом примере СЧЁТЕСЛИ(A2:A10;A2:A10)возвращает массив {3:2:2:1:1:2:3:2:3}.
- Функция ЕСЛИ оценивает каждый элемент в этом массиве, сохраняет все единицы (то есть, уникальные) и заменяет все остальные цифры нулями.
Итак, функция ЕСЛИ(СЧЁТЕСЛИ(A2:A10;A2:A10)=1;1;0) преобразуется в ЕСЛИ({3:2:2:1:1:2:3:2:3}) = 1,1,0).
И далее она превращается в массив чисел {0:0:0:1:1:0:0:0:0}. Здесь 1 означает уникальное значение, а 0 – появляющееся более 1 раза.
- Наконец, функция СУММ складывает числа в этом итоговом массиве и выводит общее количество уникальных значений. Что нам и нужно.
Подсчет уникальных текстовых значений.
Если ваш список содержит как числа так и текст, и вы хотите посчитать только уникальные текстовые строки, добавьте функцию ЕТЕКСТ() в формулу массива, описанную выше:
{=СУММ(ЕСЛИ(ЕТЕКСТ(A2:A10)*СЧЁТЕСЛИ(A2:A10;A2:A10)=1;1;0))}
Функция ЕТЕКСТ возвращает ИСТИНА, если исследуемое содержимое ячейки является текстом, и ЛОЖЬ в противоположном случае. Поскольку звездочка (*) в формулах массива работает как оператор И, то функция ЕСЛИ возвращает 1, только если рассматриваемое одновременно текстовое и уникальное, в противном случае получаем 0. И после того, как функция СУММ сложит все числа, вы получите количество уникальных текстовых значений в указанном диапазоне.
Не забывайте нажимать Ctrl + Shift + Enter
, чтобы правильно ввести формулу массива, и вы получите результат, подобный этому:
Рис3
Как вы можете видеть на скриншоте выше, мы получили общее количество уникальных текстовых значений, исключая пустые ячейки, числа, логические выражения ИСТИНА и ЛОЖЬ, а также ошибки.
Как сосчитать уникальные числовые значения.
Чтобы посчитать уникальные числа в списке данных, используйте формулу массива точно так же, как мы только что делали при подсчете текстовых данных. Отличие заключается в том, что вы используете ЕЧИСЛО вместо ЕТЕКСТ:
{=СУММ(ЕСЛИ(ЕЧИСЛО(A2:A10)*СЧЁТЕСЛИ(A2:A10;A2:A10)=1;1;0))}
Пример и результат вы видите на скриншоте чуть выше.
Уникальные значения с учетом регистра.
Если для вас принципиально различие в заглавных и прописных буквах, то самым простым способом подсчета будет создание вспомогательного столбца со следующей формулой массива для идентификации повторяющихся и уникальных элементов:
{=ЕСЛИ(СУММ((—СОВПАД($A$2:$A$10;A2)))=1;»Уникальный»;»Дубль»)}
А затем используйте простую функцию СЧЁТЕСЛИ для подсчета уникальных значений:
=СЧЁТЕСЛИ(B2:B10; «Уникальный»)
А теперь посмотрим, как можно посчитать количество значений, которые появляются хотя бы один раз, то есть так называемых различных значений.
Подсчет различных значений.
Используйте следующую универсальное выражение:
{=СУММ(1 / СЧЁТЕСЛИ( диапазон ; диапазон ))}
Помните, что это формула массива, поэтому вам следует нажать Ctrl + Shift + Enter
, вместо обычного Enter.
Кроме того, вы можете использовать функцию СУММПРОИЗВ и записать формулу обычным способом:
=СУММПРОИЗВ(1 / СЧЁТЕСЛИ( диапазон ; диапазон ))
Например, чтобы сосчитать различные значения в диапазоне A2: A10, вы можете использовать выражение:
{=СУММ(1/СЧЁТЕСЛИ(A2:A10;A2:A10))}
или же
=СУММПРОИЗВ(1/СЧЁТЕСЛИ(A2:A10;A2:A10))
Этот способ подходит не только для подсчета в столбце, но и для диапазона данных. К примеру, у нас под имена отведено две колонки. Тогда делаем так:
{=СУММПРОИЗВ(1/СЧЁТЕСЛИ(A2:B10;A2:B10))}
Этот метод подходит для текста, чисел, дат.
Единственное ограничение – диапазон должен быть непрерывным и не содержать пустых ячеек и ошибок.
Если в вашем диапазоне данных есть пустые ячейки, то можно изменить:
{=СУММПРОИЗВ(1/СЧЁТЕСЛИ(A2:A10; A2:A10&»»))}
Тогда в расчёт попадёт и будет засчитана и пустая ячейка.
Как это работает?
Как вы уже знаете, мы используем функцию СЧЁТЕСЛИ, чтобы узнать, сколько раз каждый отдельный элемент встречается в указанном диапазоне. В приведенном выше примере, результат работы функции СЧЕТЕСЛИ представляет собой числовой массив: {3:2:2:1:3:2:1:2:3}.
После этого выполняется ряд операций деления, где единица делится на каждую цифру из этого массива. Это превращает все неуникальные значения в дробные числа, соответствующие количеству повторов. Например, если число или текст появляется в списке 2 раза, в массиве создаются 2 элемента равные 0,5 (1/2 = 0,5). А если появляется 3 раза, в массиве создаются 3 элемента 0,333333.
В нашем примере результатом вычисления выражения 1/СЧЁТЕСЛИ(A2:A10;A2:A10) является массив {0.333333333333333:0.5:0.5:1:0.333333333333333:0.5:1:0.5:0.333333333333333}.
Пока не слишком понятно? Это потому, что мы еще не применили функцию СУММ / СУММПРОИЗВ. Когда одна из этих функций складывает числа в массиве, сумма всех дробных чисел для каждого отдельного элемента всегда дает 1, независимо от того, сколько раз он появлялся. И поскольку все уникальные элементы отображаются в массиве как единицы (1/1 = 1), окончательный результат представляет собой общее количество всех встречающихся значений.
Как и в случае подсчета уникальных значений в Excel, вы можете использовать варианты универсальной формулы для обработки отдельно чисел, текста или же с учетом регистра.
Помните, что все приведенные ниже выражения являются формулами массива и требуют нажатия Ctrl + Shift + Enter
.
Подсчет различных значений без учета пустых ячеек
Если столбец, в котором вы хотите совершить подсчет, может содержать пустые ячейки, вам следует в уже знакомую нам формулу массива добавить функцию ЕСЛИ. Она будет проверять ячейки на наличие пустот (основная формула Excel, описанная выше, в этом случае вернет ошибку #ДЕЛ/0):
=СУММ(ЕСЛИ( диапазон <> «»; 1 / СЧЁТЕСЛИ( диапазон ; диапазон ); 0))
Вот как, к примеру, можно посчитать количество индивидуальных значений, игнорируя пустые ячейки:
Используем:
{=СУММ(ЕСЛИ(A2:A10<>»»;1/СЧЁТЕСЛИ(A2:A10; A2:A10); 0))}
Как видите, наш список состоит из трёх имён.
Подсчет различных чисел.
Чтобы посчитать различные числовые значения (числа, даты и время), используйте функцию ЕЧИСЛО:
= СУММ(ЕСЛИ(ЕЧИСЛО( диапазон ); 1 / СЧЁТЕСЛИ( диапазон ; диапазон ); «»))
Считаем, сколько имеется различных чисел в диапазоне A2: A10:
{=СУММ(ЕСЛИ(ЕЧИСЛО(A2:A10);1/СЧЁТЕСЛИ(A2:A10; A2:A10);»»))}
Результат вы можете посмотреть ниже.
Это достаточно простое и элегантное решение, но работает оно гораздо медленнее, чем выражения, которые используют функцию ЧАСТОТА для подсчета уникальных значений. Если у вас большие наборы данных, то целесообразно переключиться на формулу, основанную на расчёте частот.
И вот еще один способ подсчета чисел:
=СУММ(—(ЧАСТОТА(диапазон; диапазон)>0))
Применительно к примеру ниже:
=СУММ(—(ЧАСТОТА(A2:A10; A2:A10)>0))
Как видите, здесь игнорируются записи, в которых имеются буквы.
Пошагово разберём, как это работает.
Функция ЧАСТОТА возвращает массив цифр, которые соответствуют интервалам, заданным имеющимися числами. В этом случае мы сравниваем один и тот же набор чисел для массива данных и для массива интервалов.
Результатом является то, что ЧАСТОТА() возвращает массив, который представляет собой счетчик для каждого числового значения в массиве данных.
Это работает, потому что ЧАСТОТА() возвращает ноль для любых чисел, которые ранее уже появились в списке. Ноль возвращается и для текстовых данных. Поэтому полученный массив выглядит следующим образом:
{3:0:0:2:0:0}
Как видите, обрабатываются только числа. Ячейки A7:A10 игнорируются, потому что там текст. А функция ЧАСТОТА() работает только с числами.
Теперь каждое из этих чисел проверяем на условие «больше нуля».
Получаем:
{ИСТИНА:ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ЛОЖЬ}
Теперь превращаем ИСТИНА и ЛОЖЬ в 1 и 0 соответственно. Делаем это при помощи двойного отрицания. Проще говоря, это двойной минус, который не меняет величину числа, но позволяет получить реальные числа, когда это вообще возможно:
{1:0:0:1:0:0}
А теперь функция СУММ складывает всё и получаем результат: 2.
Различные текстовые значения.
Чтобы посчитать отдельные текстовые записи в столбце, мы будем использовать тот же подход, который мы использовали для исключения пустых ячеек.
Как вы можете легко догадаться, мы просто добавим функцию ЕТЕКСТ и проверку условия:
=СУММ(ЕСЛИ(ЕТЕКСТ( диапазон ); 1 / СЧЁТЕСЛИ( диапазон ; диапазон ); «»))
Количество индивидуальных символьных значений посчитаем так:
{=СУММ(ЕСЛИ(ЕТЕКСТ(A2:A10);1/СЧЁТЕСЛИ(A2:A10; A2:A10);»»))}
Не забываем, что это формула массива.
Если в вашей таблице нет пустых ячеек и ошибок, то вы можете применить формулу, которая использует несколько функций: ЧАСТОТА, ПОИСКПОЗ, СТРОКА и СУММПРОИЗВ.
В общем виде это выглядит так:
=СУММПРОИЗВ(—(ЧАСТОТА(ПОИСКПОЗ (диапазон; диапазон;0); СТРОКА (диапазон)- СТРОКА (диапазон_первая_ячейка)+1)>0))
Предположим, у вас есть список имен сотрудников вместе с часами работы над проектом, и вы хотите знать, сколько человек в этом участвовали. Глядя на данные, вы можете увидеть, что имена повторяются. А вы хотите пересчитать всех, кто хотя бы раз появился в этом списке.
Применяем формулу массива:
{=СУММПРОИЗВ(— (ЧАСТОТА(ПОИСКПОЗ(A2:A10; A2:A10;0); СТРОКА(A2:A10) -СТРОКА(A2) +1)> 0))}
Она является более сложной, чем аналогичная, которая использует функцию ЧАСТОТА() для подсчета различных чисел. Это потому, что ЧАСТОТА() не работает с текстом. Поэтому ПОИСКПОЗ преобразует имена в номера позиций, которые может обрабатывать ЧАСТОТА().
Если какая-либо из ячеек в диапазоне пустая, вам необходимо использовать более сложную формулу массива, которая включает в себя функцию ЕСЛИ:
{= СУММ(ЕСЛИ(ЧАСТОТА(ЕСЛИ(данные <> «»;ПОИСКПОЗ(данные; данные; 0));СТРОКА(данные) -СТРОКА(данные_первая_ячейка) +1); 1))}
Примечание: поскольку логическая проверка в операторе ЕСЛИ содержит массив, то наше выражение сразу становится формулой массива, которая требует ввода через Ctrl+Shift+Enter. Поэтому же СУММПРОИЗВ была заменена на СУММ.
Применительно к нашему примеру это выглядит так:
{=СУММ(ЕСЛИ(ЧАСТОТА(ЕСЛИ(A2:A10 <> «»;ПОИСКПОЗ(A2:A10; A2:A10; 0));СТРОКА(A2:A10) -СТРОКА(A2) +1); 1))}
Теперь «сломать» этот расчет может только наличие ячеек с ошибками в исследуемом диапазоне.
Различные текстовые значения с условием.
Предположим, необходимо пересчитать, сколько наименований товаров заказал конкретный покупатель.
Чтобы решить эту проблему, вам может помочь этот вариант:
{=СУММПРОИЗВ((($A$2:$A$18=E2)) / СЧЁТЕСЛИМН($A$2:$A$18;$A$2:$A$18&»»; $B$2:$B$18;$B$2:$B$18&»»))}
Введите это в пустую ячейку, куда вы хотите поместить результат, F2, например. А затем нажмите Shift + Ctrl + Enter вместе, чтобы получить правильный результат.
Поясним: здесь A2:A18 это список покупателей, с учётом которого вы ограничиваете область расчётов, B2: B18 — перечень товаров, в котором вы хотите посчитать уникальные значения, Е2 содержит критерий, на основании которого подсчет ограничивается только конкретным покупателем.
Второй способ.
Для уникальных значений в диапазоне с критериями, вы можете использовать формулу массива, основанную на функции ЧАСТОТА.
{=СУММ(—(ЧАСТОТА(ЕСЛИ(критерий; ПОИСКПОЗ(диапазон; диапазон;0)); СТРОКА(диапазон) -СТРОКА(диапазон_первая_ячейкаl)+1)>0))}
Применительно к нашему примеру:
{=СУММ(—(ЧАСТОТА(ЕСЛИ(A2:A10 = E2; ПОИСКПОЗ(B2:B10; B2:B10;0)); СТРОКА(B2:B10) — СТРОКА(B2)+1) > 0))}
С учетом ограничений ЕСЛИ() функция ПОИСКПОЗ определяет порядковый номер только для строк, которые соответствуют критериям.
Если какая-либо из ячеек в диапазоне критериев пустая, вам необходимо скорректировать расчёт, добавив дополнительно ЕСЛИ для обработки пустых ячеек. Иначе они будут переданы в функцию ПОИСКПОЗ, которая в ответ сгенерирует сообщение об ошибке.
Вот что получилось после корректировки:
{=СУММ(— (ЧАСТОТА(ЕСЛИ(B2:B10 <> «»; ЕСЛИ(A2:A10 = E2; ПОИСКПОЗ(B2:B10; B2:B10;0))); СТРОКА(B2:B10) -СТРОКА(B2) +1)> 0))}
То есть все действия и расчёты мы производим, если в столбце B нам встретилась непустая ячейка: ЕСЛИ(B2:B10 <> «»….
Если у вас есть два критерия, вы можете расширить логику формулы путем добавления другого вложенного ЕСЛИ.
Поясним. Определим, сколько наименований товара находилось в первой партии первого покупателя.
Критерии запишем в G2 и G3.
В общем виде это выглядит так:
{=СУММ(—(ЧАСТОТА(ЕСЛИ(критерий1; ЕСЛИ(критерий2; ПОИСКПОЗ (диапазон; диапазон;0))); СТРОКА (диапазон) — СТРОКА (диапазон_первая_позиция) +1)> 0))}
Подставляем сюда реальные данные и получаем результат:
{=СУММ(—(ЧАСТОТА(ЕСЛИ(A2:A10=G2; ЕСЛИ(C2:C10=G3;ПОИСКПОЗ(B2:B10;B2:B10;0)));СТРОКА(B2:B10)-СТРОКА(B2)+1)>0))}
В первой партии 2 наименования товара, хотя и 3 позиции.
Различные числа с условием.
Если вам нужно пересчитать уникальные (с учётом первого вхождения) числа в диапазоне с учетом каких-то ограничений, можно использовать формулу, основанную на СУММ и ЧАСТОТА, и вместе с этим применять критерии.
{=СУММ(— (ЧАСТОТА(ЕСЛИ(критерий; диапазон); диапазон)> 0))}
Предположим, у нас есть перечень табельных номеров и количество отработанных часов по дням. Нужно сосчитать, сколько человек хотя бы раз отработали менее чем по 8 часов, то есть неполную смену.
Вот наша формула массива:
{=СУММ(— (ЧАСТОТА(ЕСЛИ(B2:B10 < 8; A2:A10); A2:A10)> 0))}
Как видите, таких случаев 3, но связаны они с двумя работниками.
Различные значения с учетом регистра.
Подобно подсчету уникальных, самый простой способ подсчета различных значений с учетом регистра – это добавить вспомогательный столбец с формулой массива, который идентифицирует нужные элементы, включая первые повторяющиеся вхождения.
Подход в основном такой же, как и тот, который мы использовали для подсчета уникальных значений с учетом регистра, с одним небольшим изменением:
{=ЕСЛИ(СУММ((—СОВПАД($A$2:$A2;$A2)))=1;»Уникальный»;»»)}
Как вы помните, все формулы массива в Excel требуют нажатия Ctrl + Shift + Enter
.
После того, как это выражение будет записано, вы можете посчитать «различные» значения с помощью обычной функции СЧЁТЕСЛИ, например:
=СЧЁТЕСЛИ(B2:B10; «Уникальный»)
Если вы не можете добавить вспомогательный столбец на свой рабочий лист, вы можете использовать следующую более сложную формулу массива для подсчета различных значений с учетом регистра без создания дополнительного столбца:
{=СУММ(ЕСЛИОШИБКА(1/ЕСЛИ($A$2:$A$10<>»»; ЧАСТОТА(ЕСЛИ(СОВПАД($A$2:$A$10; ТРАНСП($A$2:$A$10)); ПОИСКПОЗ(СТРОКА($A$2:$A$10); СТРОКА($A$2:$A$10)); «»); ПОИСКПОЗ(СТРОКА($A$2:$A$10); СТРОКА($A$2:$A$10))); 0); 0))}
Как видите, обе формулы дают одинаковые результаты.
Подсчет уникальных строк в таблице.
Подсчет уникальных / различных строк в Excel сродни пересчёту уникальных и различных значений. С той лишь разницей, что вы используете функцию СЧЁТЕСЛИМН вместо СЧЁТЕСЛИ, что позволяет вам указать сразу несколько столбцов для проверки уникальности.
Например, чтобы подсчитать уникальные строки на основе столбцов A (Имя) и B (Фамилия), используйте один из следующих вариантов:
Для уникальных строк:
{=СУММ(ЕСЛИ(СЧЁТЕСЛИМН(A3:A11;A3:A11; B3:B11;B3:B11)=1;1;0))}
Для различных строк:
{=СУММ(1/СЧЁТЕСЛИМН(A3:A11;A3:A11;B3:B11;B3:B11))}
Естественно, вы не ограничены только двумя столбцами. Функция СЧЁТЕСЛИМН может обрабатывать до 127 пар диапазон / критерий.
Как можно использовать сводную таблицу.
Вот обычная задача, которую все пользователи Excel должны время от времени выполнять. У вас есть список данных (к примеру, названий товаров), и нужно узнать количество уникальных позиций в этом списке. Как это сделать? Проще, чем вы думаете
В версиях Excel выше 2013 есть специальная функция, которая позволяет автоматически пересчитывать различные значения в сводной таблице. На следующем рисунке показано, как выглядит этот счетчик:
Чтобы создать сводную таблицу со счетчиком для определенного столбца, выполните следующие действия.
- Выберите данные для включения в сводную таблицу, перейдите на вкладку «Вставка» и нажмите кнопку «Сводная таблица» .
- В диалоговом окне «Создание сводной таблицы» выберите, следует ли разместить сводную таблицу на новом или существующем листе, и обязательно установите флажок «Добавить эти данные в модель данных» .
- Когда откроется сводная таблица, расположите области строк, столбцов и значений так, как вам нужно. Если у вас нет большого опыта работы со сводными таблицами Excel, могут оказаться полезными следующие подробные рекомендации: Создание сводной таблицы в Excel.
- Переместите поле, количество уникальных элементов которого вы хотите вычислить ( поле « Товар» в этом примере), в область « Значения» , щелкните его и выберите «Параметры значения поля…» из раскрывающегося меню.
- Откроется диалоговое окно , прокрутите вниз до операции «Число разных элементов» , которая является самым последним пунктом в списке, выберите ее и нажмите OK .
Вы также можете дать собственное имя своему счетчику, если хотите.
Готово! Вновь созданная сводная таблица будет отображать количество различных товаров, как показано на самом первом скриншоте в этом разделе.
Вот как можно подсчитать различные и уникальные значения в столбце и целиком в таблице Excel.
Благодарю вас за чтение и надеюсь увидеть вас снова. Пожалуйста, не переключайтесь!
Подсчет количества уникальных значений
Постановка задачи
Есть диапазон с данными, в котором некоторые значения повторяются больше одного раза:
Задача — подсчитать количество уникальных (неповторяющихся) значений в диапазоне. В приведенном выше примере, как легко заметить, на самом деле упоминаются всего четыре варианта.
Рассмотрим несколько способов ее решения.
Способ 1. Если нет пустых ячеек
Если вы уверены, что в исходном диапазоне данных нет пустых ячеек, то можно использовать короткую и элегантную формулу массива:
Не забудьте ввести ее как формулу массива, т.е. нажать после ввода формулы не Enter, а сочетание Ctrl+Shift+Enter.
Технически, эта формула пробегает по всем ячейкам массива и вычисляет для каждого элемента количество его вхождений в диапазон с помощью функции СЧЕТЕСЛИ (COUNTIF). Если представить это в виде дополнительного столбца, то выглядело бы оно так:
Потом вычисляются дроби 1/Число вхождений для каждого элемента и все они суммируются, что и даст нам количество уникальных элементов:
Способ 2. Если есть пустые ячейки
Если в диапазоне встречаются пустые ячейки, то придется немного усовершенствовать формулу, добавив проверку на пустые ячейки (иначе получим ошибку деления на 0 в дроби):
Вот и все дела.
Ссылки по теме
- Как извлечь из диапазона уникальные элементы и удалить дубликаты
- Как подсветить дубликаты в списке цветом
- Как сравнить два диапазона на наличие в них дубликатов
- Извлечение уникальных записей из таблицы по заданному столбцу с помощью надстройки PLEX
Произведем подсчет неповторяющихся значений в списке, содержащем повторы. Диапазон может содержать текстовые значения и числа.
Если исходный список значений находится в диапазоне
А7:А16
(см.
файл примера
), то число
неповторяющихся
значений можно вычислить с помощью формулы
=СУММПРОИЗВ(—(СЧЁТЕСЛИ(A7:A16;A7:A16)=1))
Формула хороша тем, что производит подсчет и текстовых и числовых значений, кроме того, она игнорирует
пустые
ячейки.
Неповторяющиеся значения на рисунке выделены с помощью
Условного форматирования
(см. статью
Выделение неповторяющихся значений в MS EXCEL
).
СОВЕТ:
Решение обратной задачи (подсчет повторяющихся значений) можно найти в статье
Подсчет повторяющихся значений (дубликатов)
. Вообще, если от общего количества значений отнять число неповторяющихся, то получим количество повторяющихся значений.
Хитрости »
1 Май 2011 532124 просмотров
Как получить список уникальных(не повторяющихся) значений?
Представим себе большой список различных наименований, ФИО, табельных номеров и т.п. А необходимо из этого списка оставить список все тех же наименований, но чтобы они не повторялись — т.е. удалить из этого списка все дублирующие записи. Как это иначе называют: создать список уникальных элементов, список неповторяющихся, без дубликатов. Для этого существует несколько способов: встроенными средствами Excel, встроенными формулами и, наконец, при помощи кода Visual Basic for Application(VBA) и сводных таблиц. В этой статье рассмотрим каждый из вариантов.
- При помощи встроенных возможностей Excel 2007 и выше
- При помощи Расширенного фильтра
- При помощи формул
- При помощи кодов Visual Basic for Application(VBA) — макросы, включая универсальный код выборки из произвольного диапазона
- При помощи сводных таблиц
В Excel 2007 и 2010 это сделать проще простого — есть специальная команда, которая так и называется — Удалить дубликаты (Remove Duplicates). Расположена она на вкладке Данные (Data) подраздел Работа с данными (Data tools)
Как использовать данную команду. Выделяете столбец(или несколько) с теми данными, в которых надо удалить дублирующие записи. Идете на вкладку Данные (Data) —Удалить дубликаты (Remove Duplicates).
Если выделить один столбец, но рядом с ним будут еще столбцы с данными(или хотя бы один столбец), то Excel предложит выбрать: расширить диапазон выборки этим столбцом или оставить выделение как есть и удалить данные только в выделенном диапазоне. Важно помнить, что если не расширить диапазон, то данные будут изменены лишь в одном столбце, а данные в прилегающем столбце останутся без малейших изменений.
Появится окно с параметрами удаления дубликатов
Ставите галочки напротив тех столбцов, дубликаты в которых надо удалить и жмете Ок. Если в выделенном диапазоне так же расположены заголовки данных, то лучше поставить флаг Мои данные содержат заголовки, чтобы случайно не удалить данные в таблице(если они вдруг полностью совпадают со значением в заголовке).
Способ 1: Расширенный фильтр
В случае с Excel 2003 все посложнее. Там нет такого инструмента, как Удалить дубликаты. Но зато есть такой замечательный инструмент, как Расширенный фильтр. В 2003 этот инструмент можно найти в Данные —Фильтр —Расширенный фильтр. Прелесть этого метода в том, с его помощью можно не портить исходные данные, а создать список в другом диапазоне.
В 2007-2010 Excel, он тоже есть, но немного запрятан. Расположен на вкладке Данные (Data), группа Сортировка и фильтр (Sort & Filter) — Дополнительно (Advanced)
Как его использовать: запускаем указанный инструмент — появляется диалоговое окно:
- Обработка: Выбираем Скопировать результат в другое место (Copy to another location).
- Исходный диапазон (List range): Выбираем диапазон с данными(в нашем случае это А1:А51).
- Диапазон критериев (Criteria range): в данном случае оставляем пустым.
- Поместить результат в диапазон (Copy to): указываем первую ячейку для вывода данных — любую пустую(на картинке — E2).
- Ставим галочку Только уникальные записи (Unique records only).
- Жмем Ок.
Примечание: если вы хотите поместить результат на другой лист, то просто так указать другой лист не получится. Вы сможете указать ячейку на другом листе, но…Увы и ах…Excel выдаст сообщение, что не может скопировать данные на другие листы. Но и это можно обойти, причем довольно просто. Надо всего лишь запустить Расширенный фильтр с того листа, на который хотим поместить результат. А в качестве исходных данных выбираем данные с любого листа — это дозволено.
Так же можно не выносить результат в другие ячейки, а отфильтровать данные на месте. Данные от этого никак не пострадают — это будет обычная фильтрация данных.
Для этого надо просто в пункте Обработка выбрать Фильтровать список на месте (Filter the list, in-place).
Способ 2: Формулы
Этот способ сложнее в понимании для неопытных пользователей, но зато он создает список уникальных значений, не изменяя при этом исходные данные. Ну и он более динамичен: если изменить данные в исходной таблице, то изменится и результат. Иногда это бывает полезно. Попытаюсь объяснить на пальцах что и к чему: допустим, список с данными у Вас расположен в столбце
А
(
А1:А51
, где
А1
— заголовок). Выводить список мы будем в столбец
С
, начиная с ячейки
С2
. Формула в
C2
будет следующая:
{=ИНДЕКС($A$2:$A$51;НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ($C$1:C1;$A$2:$A$51)=0;СТРОКА($A$1:$A$50));1))}
{=INDEX($A$2:$A$51;SMALL(IF(COUNTIF($C$1:C1;$A$2:$A$51)=0;ROW($A$1:$A$50));1))}
Детальный разбор работы данной формулы приведен в статье: Как просмотреть этапы вычисления формул
Надо отметить, что эта формула является формулой массива. Об этом могут сказать фигурные скобки, в которые заключена данная формула. А вводится такая формула в ячейку сочетанием клавиш —
Ctrl
+
Shift
+
Enter
(при этом сами скобки вводить не надо — они появятся сами после ввода формулы тремя клавишами
Ctrl
+
Shift
+
Enter
). После того, как мы ввели эту формулу в
C2
мы её должны скопировать и вставить в несколько строк так, чтобы точно отобразить все уникальные элементы. Как только формула в нижних ячейках вернет
#ЧИСЛО!(#NUM!)
— это значит все элементы отображены и ниже протягивать формулу нет смысла. Чтобы ошибку избежать и сделать формулу более универсальной(не протягивая каждый раз до появления ошибки) можно использовать нехитрую проверку:
для Excel 2007 и выше:
{=ЕСЛИОШИБКА(ИНДЕКС($A$2:$A$51;НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ($C$1:C1;$A$2:$A$51)=0;СТРОКА($A$1:$A$50));1));»»)}
{=IFERROR(INDEX($A$2:$A$51;SMALL(IF(COUNTIF($C$1:C1;$A$2:$A$51)=0;ROW($A$1:$A$50));1));»»)}
для Excel 2003:
{=ЕСЛИ(ЕОШ(НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ($C$1:C1;$A$2:$A$51)=0;СТРОКА($A$1:$A$50));1));»»;ИНДЕКС($A$2:$A$51;НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ($C$1:C1;$A$2:$A$51)=0;СТРОКА($A$1:$A$50));1)))}
{=IF(ISERR(SMALL(IF(COUNTIF($C$1:C1;$A$2:$A$51)=0;ROW($A$1:$A$50));1));»»;INDEX($A$2:$A$51;SMALL(IF(COUNTIF($C$1:C1;$A$2:$A$51)=0;ROW($A$1:$A$50));1)))}
Тогда вместо ошибки
#ЧИСЛО!(#NUM!)
у вас будут пустые ячейки(не совсем пустые, конечно — с формулами :-)).
Чуть подробнее про отличия и нюансы формул ЕСЛИОШИБКА и ЕСЛИ(ЕОШ можно прочесть в этой статье: Как в ячейке с формулой вместо ошибки показать 0
Для пользователей Excel 2021 выше, а так же пользователей Excel 365(с активной подпиской) — использовать формулы для извлечения уникальных элементов проще простого. В этих версиях появилась функция
УНИК(UNIQUE)
, которая как раз получает список уникальных значений на основании переданного диапазона:
=УНИК($A$2:$A$51)
=UNIQUE($A$2:$A$51)
Что самое важное в данном случае — это функция динамического массива и вводить её надо только в одну ячейку C2, а результат она поместит сама в нужное количество ячеек.
Способ 3: код VBA
Данный подход потребует разрешения макросов и базовых знаний о работе с ними. Если не уверены в своих знаниях для начала рекомендую прочитать эти статьи:
- Что такое макрос и где его искать? к статье приложен видеоурок
- Что такое модуль? Какие бывают модули? потребуется, чтобы понять куда вставлять приведенные ниже коды
Оба приведенных ниже кода следует помещать в стандартный модуль. Макросы должны быть разрешены.
Исходные данные оставим в том же порядке — список с данными расположен в столбце «А«(А1:А51, где А1 — заголовок). Только выводить список мы будем не в столбец С, а в столбец Е, начиная с ячейки Е2:
Sub Extract_Unique() Dim vItem, avArr, li As Long ReDim avArr(1 To Rows.Count, 1 To 1) With New Collection On Error Resume Next For Each vItem In Range("A2", Cells(Rows.Count, 1).End(xlUp)).Value 'Cells(Rows.Count, 1).End(xlUp) – определяет последнюю заполненную ячейку в столбце А .Add vItem, CStr(vItem) If Err = 0 Then li = li + 1: avArr(li, 1) = vItem Else: Err.Clear End If Next End With If li Then [E2].Resize(li).Value = avArr End Sub
С помощью данного кода можно извлечь уникальные не только из одного столбца, но и из любого диапазона столбцов и строк. Если вместо строки
Range(«A2», Cells(Rows.Count, 1).End(xlUp)).Value
указать Selection.Value, то результатом работы кода будет список уникальных элементов из выделенного на активном листе диапазона. Только тогда неплохо бы и ячейку вывода значений изменить — вместо [E2] поставить ту, в которой данных нет.
Так же можно указать конкретный диапазон:
Или другой столбец:
Range("C2", Cells(Rows.Count, 3).End(xlUp)).Value
здесь отдельно стоит обратить внимание то, что в данном случае помимо изменения А2 на С2 изменилась и цифра 1 на 3. Это указание на номер столбца, в котором необходимо определить последнюю заполненную ячейку, чтобы код не просматривал лишние ячейки. Подробнее про это можно прочитать в статье: Как определить последнюю ячейку на листе через VBA?
Универсальный код выбора уникальных значений
Код ниже можно применять для любых диапазонов. Достаточно запустить его, указать диапазон со значениями для отбора только неповторяющихся(допускается выделение более одного столбца) и ячейку для вывода результата. Указанные ячейки будут просмотрены, из них будут отобраны только уникальные значения(пустые ячейки при этом пропускаются) и результирующий список будет записан, начиная с указанной ячейки.
Sub Extract_Unique() Dim x, avArr, li As Long Dim avVals Dim rVals As Range, rResultCell As Range On Error Resume Next 'запрашиваем адрес ячеек для выбора уникальных значений Set rVals = Application.InputBox("Укажите диапазон ячеек для выборки уникальных значений", "Запрос данных", "A2:A51", Type:=8) If rVals Is Nothing Then 'если нажата кнопка Отмена Exit Sub End If 'если указана только одна ячейка - нет смысла выбирать If rVals.Count = 1 Then MsgBox "Для отбора уникальных значений требуется указать более одной ячейки", vbInformation, "www.excel-vba.ru" Exit Sub End If 'отсекаем пустые строки и столбцы вне рабочего диапазона Set rVals = Intersect(rVals, rVals.Parent.UsedRange) 'если указаны только пустые ячейки вне рабочего диапазона If rVals Is Nothing Then MsgBox "Недостаточно данных для выбора значений", vbInformation, "www.excel-vba.ru" Exit Sub End If avVals = rVals.Value 'запрашиваем ячейку для вывода результата Set rResultCell = Application.InputBox("Укажите ячейку для вставки отобранных уникальных значений", "Запрос данных", "E2", Type:=8) If rResultCell Is Nothing Then 'если нажата кнопка Отмена Exit Sub End If 'определяем максимально возможную размерность массива для результата ReDim avArr(1 To Rows.Count, 1 To 1) 'при помощи объекта Коллекции(Collection) 'отбираем только уникальные записи, 'т.к. Коллекции не могут содержать повторяющиеся значения With New Collection On Error Resume Next For Each x In avVals If Len(CStr(x)) Then 'пропускаем пустые ячейки .Add x, CStr(x) 'если добавляемый элемент уже есть в Коллекции - возникнет ошибка 'если же ошибки нет - такое значение еще не внесено, 'добавляем в результирующий массив If Err = 0 Then li = li + 1 avArr(li, 1) = x Else 'обязательно очищаем объект Ошибки Err.Clear End If End If Next End With 'записываем результат на лист, начиная с указанной ячейки If li Then rResultCell.Cells(1, 1).Resize(li).Value = avArr End Sub
Способ 4: Сводные таблицы
Несколько нестандартный способ извлечения уникальных значений.
- Выделяем один или несколько столбцов в таблице, переходим на вкладку Вставка(Insert) -группа Таблица(Table) —Сводная таблица(PivotTable)
- В диалоговом окне Создание сводной таблицы(Create PivotTable) проверяем правильность выделения диапазона данных (или установить новый источник данных)
- указываем место размещения Сводной таблицы:
- На новый лист (New Worksheet)
- На существующий лист (Existing Worksheet)
- подтверждаем создание нажатием кнопки OK
Т.к. сводные таблицы при обработке данных, которые помещаются в область строк или столбцов, отбирают из них только уникальные значения для последующего анализа, то от нас ровным счетом ничего не требуется, кроме как создать сводную таблицу и поместить в область строк или столбцов данные нужного столбца.
На примере приложенного к статье файла я:
- выделил диапазон A1:B51 на листе Извлечение по критерию
- вызвал меню вставки сводной таблицы: вкладка Вставка(Insert) -группа Таблица(Table) —Сводная таблица(PivotTable)
выбрал вставить на новый лист(New Worksheet) - назвал этот лист Уникальные сводной таблицей
- поле Данные поместил в область строк
- поле ФИО в область фильтра. Почему? Чтобы удобно было выбирать одно или несколько ФИО и в сводной отображался бы список уникальных месяцев только для выбранных фамилий
В чем неудобство работы со сводными в данном случае: при изменении в исходных данных сводную таблицу придется обновлять вручную: Выделить любую ячейку сводной таблицы -Правая кнопка мыши —Обновить(Refresh) или вкладка Данные(Data) —Обновить все(Refresh all) —Обновить(Refresh). А если исходные данные пополняются динамически и того хуже — надо будет заново указывать диапазон исходных данных. И еще один минус — данные внутри сводной таблицы нельзя менять. Поэтому если с полученным списком необходимо будет работать в дальнейшем, то после создания нужного списка при помощи сводной его надо скопировать и вставить на нужный лист.
Чтобы лучше понимать все действия и научиться обращаться со сводными таблицами настоятельно рекомендую ознакомиться со статьей Общие сведения о сводных таблицах — к ней приложен видеоурок, в котором я наглядно демонстрирую простоту и удобство работы с основными возможностями сводных таблиц.
В приложенном примере помимо описанных приемов, записана чуть более сложная вариация извлечения уникальных элементов формулой и кодом, а именно: извлечение уникальных элементов по критерию. О чем речь: если в одном столбце фамилии, а во втором(В) некие данные(в файле это месяцы) и требуется извлечь уникальные значения столбца В только для выбранной фамилии. Примеры подобных извлечений уникальных расположены на листе Извлечение по критерию.
Скачать пример:
Tips_All_ExtractUnique.xls (108,0 KiB, 18 431 скачиваний)
Также см.:
Работа с дубликатами
Как подсчитать количество повторений
Общие сведения о сводных таблицах
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Подсчёт уникальных значений в Excel
Смотрите также2. Вычисление количества: ,Sanja,я конечно ниче IsObject(Conditions(J)) Then rngCond
- Придумал вариант сКазанскийStart! = TimeraOld = [a1:a12000] макросы и UDF!!!: да, коллекции медленнее алгоритму еще добавить
уникальных значений...
For Each iCell
- (иначе получим ошибку Ctrl + Shift Функция частота используетАвтор: Антон АндроновЭтот пример показывает, как уникальных числовых и не понял, ну
= Conditions(J).Value If
доп.столбцом, однако способ
- : У меня вводOn Error Resumestr = «»
Казанский чем массив, но считываение диапазона вAlex_ST In Диапазон деления на 0 + Ввод. результирующее значение рассчитываетсяПримечание: создать формулу массива,
текстовых значений (не
- штучка прикольная. это IsNumeric(rngCond(I, 1)) Then будет неудобен при формулы в ячейку NextFor i =: Интересно! А функция
- скорость выявления уникальности массив..: К стати, знатокиIf iCell.Value <> в дроби):Чтобы просмотреть процесс вычисления соответствующих текстовых значений.Мы стараемся как которая подсчитает уникальные
- работает, если есть наверное аналог счётеслимн?
- If Application.Evaluate(Replace(rngCond(I, 1), большом количества сетей, листа 14,5 с,MyArray = [a1:a12000] 1 To UBound(aOld) листа как таковая?
ключей очень высокаа в этой
VBA, помогите, плиз…
«» Then .Add
Вот и все дела.
office-guru.ru
Подсчет количества уникальных значений среди повторяющихся
функции по шагам,Функция LEN используется для можно оперативнее обеспечивать значения. пустые ячейки)Sanja «,», «.») & тогда придется для «СЧЁТ_РАЗНЫХ_3» 28,9 с.For Each aIf InStr(1, str,Serge (подразумеваю, что ключи элегантной формуле переборЧто-то у меня iCell.Value, Trim(iCell.Value)karl311 выделите ячейку с поиска пустых ячеек. вас актуальными справочнымиВоспользуемся функцией=SUM(IF(FREQUENCY(MATCH(B2:B10;B2:B10;0);MATCH(B2:B10;B2:B10;0))>0;1))
: Можно и так Conditions(J + 1)) каждого создавать доп.столбцы Ровно в 2 In MyArray aOld(i, 1)) =: Ага, а потом там хранятся упорядоченно) происходит не один не получается сделатьNext: Здравствуйте. формулой, а затем Пустые ячейки иметь материалами на вашемCOUNTIF=СУММ (ЕСЛИ (ЧАСТОТА
сказать. Название говорит Then arrFlag(Int(J /Заранее благодарю!
-
раза. Интересно, почему?Col.Add a, CStr(a) 0 Then str
-
выясняется что расчётный — в этом
-
раз, а по на основе этойСЧЁТ_РАЗНЫХ = .CountНужна небольшая Ваша на вкладке длину 0 (количество языке. Эта страница(СЧЁТЕСЛИ). Для примера (ПОИСКПОЗ (B2:B10;B2:B10;0);ПОИСКПОЗ (B2:B10;B2:B10;0))>0;1)) само за себя 2)) = TrueDmitriy XMслэн
-
Next a = str & файл не работал и выигрыш. Еще количеству элементов - классной формулы UDF
-
End With помощь. Уже неФормулы символов). переведена автоматически, поэтому
Пример
подсчитаем количество чисел3. Вычисление количества СЧЕТ Else If rngCond(I,:: не помню с
’Если работа с |
aOld(i, 1) & |
у начальника на |
быстрее конструкция dictionarys.. |
для каждого из |
(ну, чтобы потом |
End Function |
первый день ломаю |
в группе |
|
Скопируйте таблицу в ячейку |
ее текст может |
5 в диапазоне |
уникальных значений (универсальная |
УНИК |
1) Like Conditions(J |
=СЧЁТЕСЛИМН(D2:D16;»Магнит»;E2:E16;»>»&0) |
кем мы оттачивали |
коллекцией далее неприемлема, |
«|» |
деловой презентации потому |
и удобнее. Но |
элементов массива происходит |
формулы писАть былоAlex_ST голову над этойЗависимости формул A1 на пустом |
содержать неточности и |
A1:A6 формула)ЕСЛИМН. В отличии от + 1) ThenОлег55 скорость этого алгоритма |
то перебросить её |
Next i что макросы отключены требует подключения доп перебор всех «остальных проще и не: К стати, kim, |
задачкой. Нужно подсчитатьнажмите кнопку
-
листе в Excel грамматические ошибки. Для, используя следующую формулу:=SUM(IF(FREQUENCY(IF(LEN(A2:A10)>0;MATCH(A2:A10;A2:A10;0);»»);IF(LEN(A2:A10)>0;MATCH(A2:A10;A2:A10;0);»»))>0;1)) обычное СЧЕТЕСЛИМН подсчитывает arrFlag(Int(J / 2)): Дмитрий, благодарю, что — точно с в массив
-
aNew = Split(str, были. библиотеки. элементов», сравнение с указывать два раза не посоветуете, количество уникальных значенийВычисление формулы для работы с нас важно, чтобы=COUNTIF(A1:A6,5)
support.office.com
Подсчет количества уникальных значений
Постановка задачи
=СУММ (ЕСЛИ (ЧАСТОТА количество УНИКАЛЬНЫХ значений = True End не остались равнодушны
ZVI, а вотReDim NewMyArray(1 To «|») ‘ последнееИ стоя наAlex_ST условием и увеличение диапазон)а как в
в массиве и.
Способ 1. Если нет пустых ячеек
примерами формул, использующих эта статья была=СЧЁТЕСЛИ(A1:A6;5) (ЕСЛИ (ДЛСТР (A2:A10)>0;ПОИСКПОЗalex1210 If Next If
к проблеме! Однако еще учавствовал или Col.Count) значение пустое бирже труда макрописец: По просьбам слушателей
индекса, если условиеДаже без игнорирования формуле =СУММПРОИЗВ(1/СЧЁТЕСЛИ(A4:P16;A4:P16)) обойти частоту их появления,Есть диапазон с данными, функции. вам полезна. ПросимЧтобы подсчитать уникальные значения, (A2:A10;A2:A10;0);»»);ЕСЛИ (ДЛСТР (A2:A10)>0;ПОИСКПОЗ: ААААААААААААААААААА, круто WorksheetFunction.And(arrFlag) = True Ваш вариант считает degassad или Anik..
For i =For i = упрямо повторяет себе: во время обеденного выполнено. пустых ячеек… ошибку #ДЕЛ/0! если
Способ 2. Если есть пустые ячейки
т.е. значение «7» в котором некоторыеДанные вас уделить пару добавим функцию (A2:A10;A2:A10;0);»»))>0;1))Akropochev Then .Add CStr(cl(I,
количество накладных сети
planetaexcel.ru
Подсчет количества уникальных значений в массиве
но там было 1 To Col.Count
0 To UBound(aNew) «А у меня перерыва (раньше работая уж неПытаюсь сделать так: в диапазоне попадается столько то раз, значения повторяются большеДанные секунд и сообщить,SUMПоследнюю формулу нужно: Олег55, добрый день
1)), cl(I, 1)
Магнит с бонусом чуточку точнее в’ NewMyArray(i) = — 1
считает-то всё-равно быстрее»… мешала) сделал сравнение
говорю о последующемFunction СЧЁТ_РАЗНЫХ_2(Диапазон As
хотя бы одна значение «12» столько
одного раза:
986 помогла ли она
(СУММ), 1/, и вводить как формулуМой вариант немассивной
If Err = больше нуля, а
конце
Col(i)Cells(i + 1,
Брр.
разных методов подсчёта делении и опять
Range) As Long
пустая ячейка? то раз иЗадача — подсчитать количество
Руслан
вам, с помощью заменим 5 на
массива, т. е. формулы 0 Then СЧЕТУНИКЕСЛИМН мне нужно вычислить
Alex_ST
Cells(i, 2) =
2) = aNew(i)слэн
числа уникальных значений суммировании..
’=СУММПРОИЗВ(1/СЧЁТЕСЛИ(Диапазон;Диапазон))kim
т.д.
уникальных (неповторяющихся) значенийДмитрий
кнопок внизу страницы.A1:A6 нажать не просто
=СУММПРОИЗВ(—(ПОИСКПОЗ(B2:B16*(D2:D16=L2)*(E2:E16>0);B2:B16*(D2:D16=L2)*(E2:E16>0);0)=(СТРОКА(B2:B16)-СТРОКА(B2)+1)*(D2:D16=L2)*(E2:E16>0)))
= СЧЕТУНИКЕСЛИМН +
количество точек, т.е.
: По совету слэн’a
Col(i)Next: и еще можно
в диапазоне.Михаил С.With Application.WorksheetFunction: =СУММПРОИЗВ(1/СЧЁТЕСЛИ(A4:P16;A4:P16&»»))-1Заранее благодарен. в диапазоне. В
563 Для удобства также
. Enter, а Ctrl
Олег55 1 Else Err.Clear количество уникальных значений
попробовал ещё подсократитьNextCells(2, 5) = немножко причесать.. :)
Конечно, создавать «массив: ну может выСЧЁТ_РАЗНЫХ_2 = .SumProduct(1
Alex_STkim приведенном выше примере,
67 приводим ссылку на=SUM(1/COUNTIF(A1:A6,A1:A6)) + Shift +: , , большое End If End по столбцу ИД время выполнения СЧЁТ_РАЗНЫХ_2.Cells(4, 5) =
Timer — Startнапример, зачем в из миллиона случайных и правы;
/ .CountIf(Диапазон, Диапазон)): Спасибо.: Для этого нужна как легко заметить,789 оригинал (на английском
=СУММ(1/СЧЁТЕСЛИ(A1:A6;A1:A6)) Enter. После этого спасибо, что не If Next End точки для сетиПопытался сначала заменить Timer — StartCells(2, 6) = коллекцию передавать значение, чисел в диапазоне=СУММПРОИЗВ(1/СЧЁТЕСЛИ(A4:P16;A4:P16&»»))-ИЛИ(A4:P16=»»)
End WithА почему -1 функция СЧЁТЕСЛИ()- масса
на самом деле235 языке) .Закончим ввод формулы нажатием в строке формул остались в стороне With End Function Магнит и бонуса в цикле в
Cells(4, 6) = UBound(aNew) + 1
если нужно только
1…200 000″ ятоже массив
End Function
в конце формулы
примеров на форуме. упоминаются всего четыре
Руслан
Предположим, что вы хотите
Ctrl+Shift+Enter
мы увидим, что от моей проблемы!
Jack Famous
больше нуля. В ключе коллекции CStr(tmpArr(i,
Col.Count[CalcTime] = Timer
посчитать? не стал, т.к.Alex_STвыдаёт #ЗНАЧ! вдруг появилось?Для подсчета уникальных: варианта.Дмитрий
узнать, сколько уникальных. формула взята в Разобрал принципы работы: Sanja, какая крутая
данном примере таковых
j)) на tmpArr(i,
[CalcTime] = Timer
— Startпередавайте только ключ времени жалко, но
: Не понял, зачем?Михаил С.
Уникальных значений раньше
=СУММПРОИЗВ(1/СЧЁТЕСЛИ(A4:P16;A4:P16))Рассмотрим несколько способов ее689 текстовых и числовых
Примечание:
фигурные скобки ({}), ваших вариантов, принял UDF’ка
будет пять. j): — StartEnd Subслэн с меньшим размером
Быстрее работать что: массив было 48, аHugo решения.789 значений в диапазонеСтрока формул указывает, это признак того, к сведению, будупасиба)))По одной точке
If tmpArr(i, j)End SubSub btnCollections1_Click(): или пересчет был
попробовал. ли будет если=СУММ(1/(ЕСЛИ(СЧЁТЕСЛИ(A4:P16;A4:P16);СЧЁТЕСЛИ(A4:P16;A4:P16);1)))-СЧЁТЕСЛИ(A4:P16;»»)
теперь вдруг получилось
: СЧЁТЕСЛИ
Если вы уверены, что вДмитрий
есть. Например, если что это формула что введенная формула теперь пользоваться наиболееalex1210 может быть несколько <> «» ThenSub btnDictionary_Click()Dim NewMyArray(), MyArray отключен :)Так вот, при
я сначала скопируюЕсли пустые не 47.Alex_ST исходном диапазоне данных143 столбец содержит текст массива, заключая её массива. удобным в зависимости: Sanja, Jack Famous, накладных, причем как .Add tmpArr(i, j),Dim NewMyArray, MyArray,Dim Col AsSerge обработке массива из
диапазон во временный считаем за уникальные
Да и мой: kim, нет пустых ячеек,56
значения в фигурные скобкиПолосатый жираф алик от ситуации
доброго времени, подскажите с бонусом, так tmpArr(i, j) D New Collection: Не согласен. Для 10 000 цифр массив, а потомAlex_ST макрос говорит, что=СУММПРОИЗВ(1/СЧЁТЕСЛИ(A4:P16;A4:P16))- это здОрово! то можно использовать237
Руслан «,» Сергей «,» {}. Их не: Напиши в C1Fabol ячейки B2:B16 какое и без негозаработало. Время уменьшилосьStart! = Timer
Start! = Timer того что бы от 0 до буду брать по: Михаил, их всё-таки 48…Элементарно просто и короткую и элегантную
67 Сергей, Сергей нужно вводить самостоятельно. =A1&B1: Как посчитать количество условие выполняют, не (т.е. ноль)
почти вдвое :On Error ResumeOn Error Resume пересчёт отключить надо 100 на моём
одному элементу массиватак может быть
kim элегантно. формулу массива:235, имеется два уникальных Они исчезнут, когдаСкопируй её до
одинаковых значений в могу разобраться
Сергей стало 0,047 сек. Next
Next лесть в настройки,
не шустром рабочем и пытаться добавить и будет работать: Алексей, поищите огрехиНе встречал такогоНе забудьте ввести ее
Формула значения — Руслан вы начнете редактировать С5. Чтобы не
таблице (уникальных)?Jack Famous: доп столбец один
НО возникли сомнения,Set D =MyArray = [a1:a12000] а это мало компе получилось следующее: его в коллекцию (честно говоря, даже в макросе :)
раньше, поэтому написАл как формулу массива,Описание (результат) и Сергей. Если формулу.
видеть формулы, можно
AlexM: alex1210, здравствуйте! для всех сетей
а С ЛЮБЫМИ CreateObject(«Scripting.Dictionary»)For Each a кто делает (я
1. Мой макрос
(метод проверки уникальности не проверял), ноДело в том,
UDF: т.е. нажать после=СУММ(ЕСЛИ(ЧАСТОТА(A2:A10,A2:A10)>0,1)) диапазон содержит числаПояснение: выбрать в формате: В таблице посчитатьНу, как яSanja ЛИ ТИПАМИ ДАННЫХMyArray = [a1:a12000] In MyArray вообще ещё не с прямым считыванием по Уокенбаху)? в вашем примере что в таком
Function СЧЁТ_РАЗНЫХ(Диапазон As ввода формулы неПодсчет количества уникальных числовых
5, 6, 7, 6Диапазон (массив констант), созданный белый ШРИФТ. можно, а в понял, это уникальный
: UDF (пользовательская функция)
это будет корректно
For Each a
Col.Add a, CStr(a)
встречал таких сотрудников
значений из диапазона
Я, к стати,
теряется вся простота виде, формула интерпретирует Range) As Long
Enter, а сочетание
значений в диапазоне
, уникальные значения —
с помощью функцииА в В6
картинке не получитсячисловой Function СЧЕТУНИКЕСЛИМН(rngU As работать? Ведь об In MyArrayNext a
кто знает как
и добавлением в искал где-нибудь данные и элегантность предложенной
пусто как еще’————————————————————————————— Ctrl+Shift+Enter.
A2:A10 без учета 5, 6 и
COUNTIF
напиши =СУММ (1/СЧЁТЕСЛИFabol
идентификатор конкретной точки Range, ParamArray Conditions())
ошибке работы макросаD.Add CStr(a), a
’Если работа с
это делается). А
коллекцию
о скорости выполнения kim формулы…
одно уникальное, вот
’ Procedure :Технически, эта формула пробегает
пустых ячеек и
7.(СЧЁТЕСЛИ), хранится в
(C1:C5;C1:C5))
: AlexM,
(как её адрес, As Long ‘rngU никак не узнаешь,Next a
коллекцией далее неприемлема, вот уровень безопасности
СЧЁТ_РАЗНЫХ_1 — 0,44
операций с коллекциями,Ну, разве можно
мы его и СЧЁТ_РАЗНЫХ
по всем ячейкам текстовых значений (4)
Чтобы подсчитать только уникальные
памяти Excel, а
Пробелы перед скобкамиAlexM
например, только в — диапазон поиска
т.к. включен обработчикNewMyArray = D.Items
то перебросить её
АЙтишники всегда ставят
сек.
но не нашел… сравнить по трудоёмкости
отнимаем. Для более
’ Author : массива и вычисляет
=СУММ(ЕСЛИ(ЧАСТОТА(ПОИСКПОЗ(B2:B10,B2:B10,0),ПОИСКПОЗ(B2:B10,B2:B10,0))>0,1))
значения, используйте следующие не в ячейках
удалить из формулы.
: Уникальные — это
виде числа) уникальных значений, обязательный ошибокFor i =
в массив высокий и тут
2. Мой доработанный Что-то мне подсказывает,
написания и возможному простого визуального восприятия
’ Topic_HEADER : для каждого элемента
Подсчет количества уникальных текстовых
функции: листа.
Вводить, как формулу такие значения, которые
Sanja ‘Conditions() — массив
Я с коллекциями
0 To UBound(NewMyArray)
’ReDim NewMyArray(1 To уже необходимы знания
макрос с предварительным
что она не при этом количеству
уменьшил проверяемый диапазон. Функция СЧЁТ_РАЗНЫХ (UDF)
количество его вхождений
и числовых значенийИспользуйте функции Если для
Массив констант выглядит следующим
массива. Как было
в таблице встречаются
: Так это у ПАР значений вида:
знаком мало, поэтомуCells(i + 1,
Col.Count)
что бы их копированием из диапазона
слишком велика (ну, ошибок формулы:
слэн’ Topic_URL :
в диапазон с
в диапазоне B2:B10,
присвоения значения 1
образом: {3;1;1;1;3;3}, что указано выше -
всего один раз. автора спросите
Диапазон_Условий1;Условие1;Диапазон_Условий2;Условие2…Диапазон_УсловийN;УсловиеN, обязательный ‘ и сомневаюсь…
2) = NewMyArray(i)
i = 1 (макросы) включить.
в массив и по крайней мере=СУММПРОИЗВ(1/СЧЁТЕСЛИ(A4:P16;A4:P16)): да, но если’ Post_Author : помощью функции который не должен
каждому истинному условию. обозначает: три числа в конце ввода=СУММПРОИЗВ(Ч(СЧЁТЕСЛИ(A1:J10;A1:J10)=1))ЦитатаОлег55 написал: …количество должен иметь хотя-быПопытки вместо значенияNextFor Each aТак что это добавлением в коллекцию
не выше, чеми формулу массива пустых ячеек все Alex_ST & The_Prist
СЧЕТЕСЛИ содержать пустые ячейкиИспользуется функция сумм для 7, одно значение нажать не Enter,
Fabol уникальных значений по одну пару значений. добавлять только ключ:
Cells(5, 5) = In Col не одно и
уже из этого обращение к ячейке={СУММ(1/(ЕСЛИ(СЧЁТЕСЛИ(A4:P16;A4:P16);СЧЁТЕСЛИ(A4:P16;A4:P16);1)))-СЧЁТЕСЛИ(A4:P16;»»)} же нет? :) & Лузер™(COUNTIF) (7) сложения уникальных значений. «sun», одно значение
а сочетание Ctrl+Shift+Enter.: AlexM, а количество столбцу ИД…это и
‘Все диапазоны должныIf tmpArr(i, j)
Timer — Start’ NewMyArray(i) = тоже… массива
диапазона). Поэтому, наверное,Казанский
planetaexcel.ru
Подсчет уникальных значений в столбце по двум условиям
Alex_ST’ Post_URL :. Если представить это
=СУММ(ЕСЛИ(ЧАСТОТА(ЕСЛИ(ДЛСТР(A2:A10)>0,ПОИСКПОЗ(A2:A10,A2:A10,0),»»),ЕСЛИ(ДЛСТР(A2:A10)>0,ПОИСКПОЗ(A2:A10,A2:A10,0),»»))>0,1))Функция частота позволяет выполнить «moon», одно числоАлексей матевосов (alexm) одинаковых можно посчитать, есть диапазон B2:B16 состоять из одного <> «» Then
Cells(5, 6) = aHugoСЧЁТ_РАЗНЫХ_2 — 0,094 выигрыш в скорости: Вкладывать worksheetfunction’ы так
: Макрос считает правильно.
’ DateTime : в виде дополнительногоПодсчет количества уникальных текстовых
подсчет количества уникальных 5, три числа: =СУММ (1/МУМНОЖ (—(A1:A5&B1:B5=ТРАНСП например (36.46-3; 36.41-5;Олег55 столбца и иметь .Add «», tmpArr(i, UBound(NewMyArray) + 1Cells(i, 2) =: У меня есть сек. при использовании массива нельзя. Проверялось не раз 06.04.10, 12:00 столбца, то выглядело и числовых значений
значений. Эта функция 7, три числа (A1:A5&B1:B5));{1:1:1:1:1})) 36.29-2…)?: От души большое равное кол-во строк
j)[CalcTime] = Timer a
такие цифры при3. Макрос, реализующий вместо прямого обращенияFunction СЧЁТ_РАЗНЫХ_2(Диапазон As (в том числе’ Purpose : бы оно так: в диапазоне A2:A10 игнорирует текстовые и 7.Формула массива, вводAlexM спасибо! оба варианта Dim cl() Dimк ускорению не — Starti = i + 1 копировании 3000 уникальных на VBA функцию к ячейкам будет Range) As Long даже и ручным возвращает число уникальныхПотом вычисляются дроби без учета пустых нулевые значения. ПервоеВсе это сводится к Ctrl+Shift+Enter: так? великолепные — и arrFlag() As Boolean привели.End SubNext из 11000 макросами: листа =СУММПРОИЗВ(1/СЧЁТЕСЛИ(Диапазон;Диапазон)) незначительным…’=СУММПРОИЗВ(1/СЧЁТЕСЛИ(Диапазон;Диапазон)) пересчётом). значений в указанном1/Число вхождений ячеек и текстовых вхождение конкретное значение {1/3;1/1;1/1;1/1;1/3;1/3}.В формуле массивПомогите написать формулу, которая Сергея, и Dim I&, J&Олег55Sub filter()Cells(3, 5) =Degassad 4.171125СЧЁТ_РАЗНЫХ_3 — 38,22
слэнСЧЁТ_РАЗНЫХ_2 = Evaluate(«SumProduct(1/CountIf(«А вот усовершенствованная диапазоне
для каждого элемента значений (6) она возвращает числоЭтот массив констант используется единиц длиной в высчитывала бы по
Очень помогли! Dim rngCond() On
: Доброе утро, уважаемыеStart! = Timer Timer — StartFor Each 1.625004 сек.: гораздо быстрее & Диапазон.Address &
вами формула даже’ Notes : и все они
Примечания: равно количество вхождений в качестве аргумента количество строк, и
двум столбцам кол-воJack Famous Error Resume Next знатоки Excel!Range(«A1:A12000»).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Worksheets(1).Range(«B1»),
Cells(3, 6) =
For i 2.422002Да… Гуру форума,
Казанский «,» & Диапазон.Address в исходном примере’————————————————————————————— суммируются, что и
значения. Для каждого для функции если строк много, уникальных записей. Пример: Олег55, доброго дня!
cl = rngU.ValueПожалуйста, помогите в Unique:=True Col.CountDictionary 1.530991 конечно, обычно правы,: Алексей, а протестируй & «))») топик-стартера (т.е. без
Dim iCell As даст нам количество
В формулах в этом случая того же
SUM например 99, то
на рисунке. Спасибо
Предлагаю вариант на With CreateObject(«Scripting.Dictionary») For ячейке вычислить количество[CalcTime] = Timer[CalcTime] = TimerAdvFilter 0.280985355 но чтобы разница разные методы иEnd Function пустых ячеек в Range
planetaexcel.ru
Подсчет уникальных значений (Формулы/Formulas)
уникальных элементов: примере должны быть значения после первого(СУММ), давая результат
единицы устанешь писать.Supreme council связях таблиц между I = 1
точек сети Магнит, — Start
— StartСами коды: во времени выполнения отпишись?слэн диапазоне) даёт 47,
Set Диапазон =Если в диапазоне встречаются введены как формулы эта функция возвращает 4.
Выход массив единиц: 1. Вычисление количества
excelworld.ru
Excel: Как посчитать количество уникальных записей?
собой. Использованы только To UBound(cl) ReDim по которым хотяCells(6, 5) =End Sub
Sub btnDeggasad_Click() достигала более 400Для тестов создай
: а не надо
когда реально и Intersect(Диапазон.Parent.UsedRange, Диапазон)
пустые ячейки, то массива. Выделите все значение 0.Урок подготовлен для Вас делать формулой
уникальных числовых значений
штатные функции Excel. arrFlag(Int(UBound(Conditions) / 2))
бы в одной Timer — StartSub btnCollections2_Click()
Dim aOld, aNew,
раз…!!! Не ожидал. массив из миллиона этой «элегантности» :) моим макросом и
On Error Resume придется немного усовершенствовать ячейки, содержащие формулы,Функция ПОИСКПОЗ используется для командой сайта office-guru.ru=СУММ (1/МУМНОЖ (—(A1:A5&B1:B5=ТРАНСП=SUM(IF(FREQUENCY(A2:A10;A2:A10)>0;1)) Результат на листе For J = товарной накладной начисленEnd SubDim NewMyArray(), MyArray i As Long,Так что, формулисты,
случайных чисел вв vba эффективнее вашей же исходной
Next формулу, добавив проверку нажмите клавишу F2 возврата позиции текстовогоИсточник: http://www.excel-easy.com/examples/count-unique-values.html
(A1:A5&B1:B5));СТРОКА (A1:ИНДЕКС (A:A;СЧЁТЗ=СУММ (ЕСЛИ (ЧАСТОТА «shop» 3ий столбец
LBound(Conditions) To UBound(Conditions) бонус (т.е. бонусФайл не даю,Dim Col As str As String бросайте своё тормозное диапазоне 1…200 000. будет простым перебором,
формулой там 48With New Collection на пустые ячейки
и нажмите клавиши значения в диапазоне.
Перевела: Ольга Гелих (A:A)))^0)) (A2:A10;A2:A10)>0;1))alex1210 Step 2 If >0). сильно секретный :) New Collection
Start! = Timer занятие и пишитеGuest
только к вашему