Подсчёт уникальных значений в Microsoft Excel — задача, с которой сталкивается каждый аналитик, бухгалтер или менеджер. Казалось бы, что может быть проще: выбрать столбец и узнать, сколько в нём неповторяющихся элементов? Но на практике даже опытные пользователи допускают ошибки, когда речь идёт о больших массивах данных, пробелах или регистрозависимых значениях.
В этой статье мы разберём 5 проверенных методов — от элементарных формул до продвинутых инструментов вроде Power Query. Вы узнаете, как избежать типичных ловушек (например, когда функция COUNTIF игнорирует пустые ячейки), как обработать данные с учётом регистра, и почему сводные таблицы иногда показывают неверные результаты. А в конце — бонус: сравнительная таблица скорости работы каждого метода на 100 000 строк.
Если вы работаете с отчётами, базами клиентов или инвентаризацией, умение быстро выделять уникальные записи сэкономит часы ручной работы. Но прежде чем переходить к формулам, давайте чётко определим, что такое «уникальное значение» в контексте Excel. Это не просто «неповторяющийся текст» — здесь важны нюансы: учитываются ли пробелы, регистр, скрытые символы? Ответы на эти вопросы изменят результат на 20–30%.
Например, для Excel строки «Иванов» и « иванов» (с пробелом в начале) — это два разных значения. А если в ячейке есть невидимый символ переноса строки (CHAR(10)), то даже функция TRIM не поможет его удалить. Мы научимся обрабатывать такие случаи без потери данных.
1. Базовый метод: функция COUNTIF для небольших таблиц
Самый простой способ посчитать уникальные значения — использовать комбинацию функций COUNTIF и SUMPRODUCT. Этот метод подходит для таблиц до 10 000 строк и не требует дополнительных столбцов.
Формула выглядит так:
=SUMPRODUCT(1/COUNTIF(диапазон; диапазон))
Где диапазон — это столбец с данными, например A2:A100.
Разберём, как это работает:
COUNTIF(диапазон; диапазон)возвращает массив, где для каждого значения указано, сколько раз оно встречается.1/COUNTIF(...)заменяет каждое число на дробь1/n, гдеn— количество повторений.SUMPRODUCTсуммирует все дроби, и в итоге остаются только единицы (уникальные значения).
Пример: если в столбце значения «Яблоко» (3 раза), «Груша» (2 раза), «Банан» (1 раз), формула вернёт 1/3 + 1/3 + 1/3 + 1/2 + 1/2 + 1/1 = 3 (три уникальных значения).
⚠️ Внимание: Этот метод не учитывает регистр! Слова «Текст» и «текст» будут считаться одинаковыми. Для регистрозависимого подсчёта используйте Power Query (раздел 5).
2. Функция UNIQUE в Excel 365 и 2021: революция или маркетинг?
В новых версиях Excel (начиная с 2021 и Microsoft 365) появилась функция UNIQUE, которая радикально упрощает задачу. Она не просто считает уникальные значения, а возвращает их список — это удобно для дальнейшей обработки.
Синтаксис:
=ROWS(UNIQUE(диапазон))
Где ROWS подсчитывает количество строк в массиве, возвращённом UNIQUE.
Преимущества метода:
- 🔹 Работает с динамическими массивами (результат обновляется автоматически при изменении данных).
- 🔹 Учитывает пустые ячейки (в отличие от
COUNTIF). - 🔹 Можно комбинировать с
SORTдля упорядочивания:=SORT(UNIQUE(A2:A100)).
Но есть и подводные камни:
- 🚫 Не работает в Excel 2019 и старше.
- 🚫 Тормозит на больших диапазонах (>50 000 строк).
- 🚫 Не различает регистр (как и
COUNTIF).
3. Сводные таблицы: универсальный инструмент с подвохом
Сводные таблицы — классический способ анализа данных, но при подсчёте уникальных значений они часто вводят пользователей в заблуждение. Дело в том, что по умолчанию сводная таблица показывает количество записей, а не уникальных значений.
Чтобы получить правильный результат:
- Выделите исходный диапазон и создайте сводную таблицу (
Вставка → Сводная таблица). - Перетащите столбец с данными в область «Строки» и «Значения».
- Щёлкните по полю в области «Значения» → «Параметры полей значений» → выберите «Число уникальных значений».
Пример на скриншоте ниже (данные — список городов):
| Город | Количество записей | Уникальные значения |
|---|---|---|
| Москва | 12 | 1 |
| Санкт-Петербург | 8 | 1 |
| Казань | 5 | 1 |
| (пусто) | 3 | 1 |
| Итого | 28 | 4 |
⚠️ Внимание: Если в данных есть скрытые символы (например,CHAR(160)— неразрывный пробел), сводная таблица посчитает «Москва» и «Москва» (с невидимым символом) как два разных значения. Чтобы этого избежать, предварительно очистите данные функцией=CLEAN(TRIM(A2)).
Удалить лишние пробелы (TRIM)
Заменить неразрывные пробелы (=SUBSTITUTE(A2; CHAR(160); " "))
Проверить на скрытые символы (CLEAN)
Удалить дубликаты (Удаление дубликатов на вкладке Данные)
-->
4. Power Query: обработка миллионов строк без тормозов
Если вам нужно проанализировать более 100 000 строк, обычные формулы Excel будут работать слишком медленно или вообще выдадут ошибку. Здесь на помощь приходит Power Query — инструмент для извлечения, преобразования и загрузки данных (доступен в Excel 2016+).
Алгоритм действий:
- Выделите диапазон → вкладка «Данные» → «Из таблицы/диапазона» (в Power Query).
- В открывшемся редакторе выделите столбец → «Главная» → «Группировка».
- В настройках группировки выберите «Число уникальных строк» и укажите столбец для подсчёта.
- Нажмите «Закрыть и загрузить».
Преимущества Power Query:
- 🔹 Обрабатывает миллионы строк без зависаний.
- 🔹 Учитывает регистр (в отличие от формул!).
- 🔹 Можно сохранять шаги обработки и обновлять данные одним кликом.
Пример кода на языке M (для ручного ввода в Power Query):
let
Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
Группировка = Table.Group(Источник, {"Столбец1"}, {{"Уникальные", each Table.RowCount(Table.Distinct(_)), type number}})
in
Группировка
Как ускорить Power Query в 2 раза?
Используйте Table.Buffer для кэширования данных в памяти:
let
Источник = Table.Buffer(Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content]),
...
Это особенно актуально при многоступенчатых преобразованиях.
5. VBA-макрос: автоматизация для повторяющихся задач
Если вам приходится считать уникальные значения ежедневно (например, в отчётах), имеет смысл написать простой макрос на VBA. Он будет работать в любых версиях Excel и позволит обрабатывать данные по расписанию.
Пример макроса для подсчёта уникальных значений в выделенном диапазоне:
Sub CountUniqueValues()
Dim rng As Range
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
On Error Resume Next
Set rng = Selection.SpecialCells(xlCellTypeConstants)
On Error GoTo 0
If rng Is Nothing Then
MsgBox "Выделите диапазон с данными!", vbExclamation
Exit Sub
End If
Dim cell As Range
For Each cell In rng
dict(cell.Value) = 1
Next cell
MsgBox "Уникальных значений: " & dict.Count, vbInformation
End Sub
Как использовать:
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - Вставьте код в новый модуль (
Insert → Module). - Выделите диапазон в Excel и запустите макрос (
Alt + F8).
⚠️ Внимание: Макрос различает регистр! Если нужно игнорировать регистр, заменитеdict(cell.Value)наdict(UCase(cell.Value)).
6. Сравнение методов: что выбрать для вашей задачи?
Чтобы вам было проще ориентироваться, мы собрали ключевые характеристики каждого способа в одной таблице:
| Метод | Макс. строк | Учитывает регистр | Скорость | Сложность | Версии Excel |
|---|---|---|---|---|---|
COUNTIF + SUMPRODUCT |
10 000 | ❌ Нет | ⚡ Быстро | ⭐⭐ | 2007+ |
UNIQUE + ROWS |
50 000 | ❌ Нет | ⚡⚡ Средне | ⭐ | 2021/365 |
| Сводная таблица | 100 000 | ❌ Нет | ⚡⚡ Средне | ⭐⭐ | 2007+ |
| Power Query | 1 000 000+ | ✅ Да | ⚡⚡⚡ Медленно | ⭐⭐⭐ | 2016+ |
| VBA | Неограничено | ✅ Да | ⚡⚡⚡⚡ Очень быстро | ⭐⭐⭐⭐ | 2003+ |
Критическая ошибка большинства пользователей: выбор метода без учёта размера данных. Например, применение SUMPRODUCT к таблице с 500 000 строк заставит Excel «зависнуть» на часы, тогда как Power Query справится за минуты.
Рекомендации по выбору:
- 📊 Для отчётов до 10 000 строк →
COUNTIF + SUMPRODUCT. - 📈 Для Excel 365 и небольших таблиц →
UNIQUE + ROWS. - 📂 Для больших данных (100K+ строк) → Power Query или VBA.
- 🔍 Если важен регистр → только Power Query или VBA.
FAQ: Ответы на частые вопросы
Почему функция UNIQUE не работает в моём Excel?
Функция UNIQUE доступна только в Excel 2021 и Microsoft 365. Если у вас более старая версия, используйте альтернативные методы из этой статьи (например, COUNTIF + SUMPRODUCT или сводные таблицы).
Чтобы проверить версию Excel, перейдите в Файл → Учётная запись → О программе Excel.
Как посчитать уникальные значения по нескольким столбцам?
Для подсчёта уникальных комбинаций по нескольким столбцам (например, «Город + Продавец») используйте:
- В Power Query: объедините столбцы перед группировкой (
Table.AddColumnс оператором&). - В формулах: создайте вспомогательный столбец с конкатенацией (
=A2 & "|" & B2), затем применитеCOUNTIFк нему.
Пример для Power Query:
= Table.Group(
Таблица,
{"Столбец1", "Столбец2"},
{{"Уникальные комбинации", each Table.RowCount(Table.Distinct(_)), type number}}
)
Можно ли посчитать уникальные значения с учётом условия (например, только для строк, где «Сумма > 1000»)?
Да, для этого комбинируйте методы с функцией FILTER (в Excel 365) или IF (в старых версиях).
Пример для Excel 365:
=ROWS(UNIQUE(FILTER(A2:A100; B2:B100 > 1000)))
Пример для Excel 2016:
=SUMPRODUCT(--(B2:B100>1000); 1/COUNTIFS(A2:A100; A2:A100; B2:B100; ">1000"))
Почему сводная таблица показывает неверное количество уникальных значений?
Наиболее частые причины:
- 🔸 В данных есть скрытые символы (пробелы, переносы строк). Используйте
=CLEAN(TRIM(A2))для очистки. - 🔸 Столбец содержит ошибки (
#N/A,#VALUE!). Сводная таблица учитывает их как уникальные значения. - 🔸 В настройках группировки выбрано «Количество», а не «Число уникальных значений».
Проверьте данные с помощью функции =LEN(A2) — если длина строки не совпадает с видимым количеством символов, значит, есть скрытые знаки.
Как автоматически обновлять подсчёт уникальных значений при изменении данных?
Способы автоматизации:
- 🔄 Для формул: используйте таблицы Excel (
Ctrl + T). Формулы внутри таблицы обновляются автоматически. - 🔄 Для Power Query: нажмите «Обновить все» на вкладке «Данные» или настройте автоматическое обновление (
Свойства соединения → Обновить каждые N минут). - 🔄 Для VBA: добавьте макрос в событие
Worksheet_Change, чтобы он запускался при редактировании листа:Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("A2:A100")) Is Nothing Then
CountUniqueValues
End If
End Sub