Поиск повторяющихся слов в одном столбце Excel: от простых формул до продвинутых инструментов

Дубликаты в данных — как сорняки в огороде: незаметны на первый взгляд, но портят всю картину. В Microsoft Excel поиск повторяющихся слов в одном столбце может понадобиться для очистки базы клиентов, анализа опросов, проверки уникальности товарных наименований или даже для выявления ошибок при ручном вводе. Проблема в том, что стандартные функции вроде Удалить дубликаты работают с целыми строками, а не с отдельными словами внутри ячеек.

Что делать, если в ячейке A1 написано "красное яблоко зелёное", а в A5"зелёное яблоко спелое"? Обычные инструменты Excel не распознают, что слово "зелёное" повторяется. В этой статье разберём 7 методов — от элементарных формул до автоматизации через Power Query, — которые помогут найти такие повторения. Особое внимание уделим нюансам: регистру букв, знакам препинания и производительности на больших массивах данных (10 000+ строк).

Спойлер: самый универсальный способ — комбинация ТЕКСТРАЗД + ПОИСКПОЗ, но для обработки текстов с опечатками потребуется Power Query. Если вам нужно не просто найти, а визуализировать дубликаты — не пропустите раздел про условное форматирование с пользовательскими формулами.

📊 Как часто вы сталкиваетесь с дубликатами в Excel?
Ежедневно
Раз в неделю
Редко
Никогда не обращал внимания

1. Базовый метод: формула СЧЁТЕСЛИ для точных совпадений

Если слова в ячейках не содержат пробелов (например, столбец с артикулами или хэштегами), задача упрощается. Достаточно использовать функцию СЧЁТЕСЛИ, чтобы подсчитать количество вхождений каждого значения. Формула для ячейки B1 (рядом с данными в столбце A):

=СЧЁТЕСЛИ($A$1:$A$100; A1)>1

Эта формула вернёт ИСТИНА, если слово из A1 встречается в диапазоне A1:A100 больше одного раза. Важный нюанс: функция чувствительна к регистру! Слова "Яблоко" и "яблоко" будут считаться разными. Чтобы игнорировать регистр, оберните аргументы в ПРОПИСН:

=СЧЁТЕСЛИ(ПРОПИСН($A$1:$A$100); ПРОПИСН(A1))>1
  • ✅ Простота: не требует знания сложных функций.
  • ✅ Быстродействие: работает мгновенно даже на 50 000 строк.
  • ❌ Ограничение: не подходит для ячеек с несколькими словами (например, "красное яблоко").

Пример применения: проверка уникальности логинов в базе пользователей или поиск повторяющихся тегов в каталоге товаров.

2. Разделение текста на слова: ТЕКСТРАЗД + ПОИСКПОЗ

Когда в одной ячейке содержится несколько слов (например, "быстрый коричневый лис"), предыдущий метод не сработает. Здесь поможет комбинация функций ТЕКСТРАЗД (в новых версиях Excel) или ТЕКСТ.ПОСЛЕ/ТЕКСТ.ДО для разделения текста по пробелам.

Алгоритм действий:

  1. Добавьте вспомогательный столбец для извлечения отдельных слов.
  2. Используйте ТЕКСТРАЗД с разделителем пробела:
    =ТЕКСТРАЗД(A1; " ")

    Это создаст массив слов из ячейки A1.

  3. Примените ПОИСКПОЗ для поиска каждого слова в общем списке.

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

=ЕСЛИ(СУММПРОИЗВ(--(НЕОШ(ПОИСК("яблоко"; $A$1:$A$100))))>1; "Дубликат"; "")
⚠️ Внимание: Функция ТЕКСТРАЗД доступна только в Excel 365 и Excel 2021. Для старых версий используйте комбинацию ПСТР + НАЙТИ с циклом по пробелам.
Альтернатива для Excel 2016 и старше

Для разделения текста по пробелам в старых версиях Excel создайте макрос:

Function SplitText(rng As Range, delimiter As String) As Variant

SplitText = Split(rng.Value, delimiter)

End Function

Затем вызовите его как формулу массива: =SplitText(A1; " ") (нажмите Ctrl+Shift+Enter).

3. Условное форматирование для визуализации дубликатов

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

Пошаговая инструкция:

  1. Выделите диапазон с данными (например, A1:A100).
  2. Перейдите на вкладку Главная → Условное форматирование → Создать правило.
  3. Выберите тип правила: "Использовать формулу для определения форматируемых ячеек".
  4. Введите формулу:
    =СЧЁТЕСЛИ($A$1:$A$100; A1)>1

    Для чувствительности к регистру добавьте ПРОПИСН.

  5. Задайте формат (например, красный фон или жирный шрифт).

Для выделения отдельных слов внутри ячеек потребуется более сложная формула с ПОИСК и ДЛСТР. Пример для выделения слова "яблоко" (регистронезависимо):

=НЕ(ОШИБКА(ПОИСК("яблоко"; ПРОПИСН(A1))))
  • 🎨 Гибкость: можно настроить разные цвета для разных повторяющихся слов.
  • ⚡ Скорость: форматирование применяется мгновенно.
  • ❌ Ограничение: не показывает, сколько раз слово повторяется.

Убедитесь, что в данных нет лишних пробелов (используйте СЖПРОБЕЛЫ)

Проверьте регистр букв (при необходимости приведите к единому виду)

Создайте резервную копию файла перед массовым форматированием

-->

4. Power Query: обработка больших объёмов данных

Если у вас десятки тысяч строк, формулы начнут тормозить. Здесь на помощь придёт Power Query — инструмент для преобразования данных, встроенный в Excel 2016+. Он позволяет разделить текст на слова, удалить стоп-слова (предлоги, союзы) и найти дубликаты за считанные секунды.

Инструкция:

  1. Выделите данные и перейдите на вкладку Данные → Из таблицы/диапазонаExcel 2016Получить данные → Из таблицы/диапазона).
  2. В редакторе Power Query выберите столбец с текстом → Преобразовать → Разделить столбец → По разделителю → укажите пробел.
  3. Теперь каждый столбец содержит отдельное слово. Выделите все столбцы с словами → Преобразовать → Развернуть (это объединит их в один столбец).
  4. Перейдите на вкладку Главная → Группировка и сгруппируйте по столбцу со словами, выбрав операцию "Количество строк".
  5. Отфильтруйте результаты по значению >1 — это и будут дубликаты.

Критический нюанс: Power Query игнорирует регистр по умолчанию, но сохраняет оригинальное форматирование слов. Чтобы привести всё к нижнему регистру, добавьте шаг преобразования с функцией Text.Lower.

МетодМакс. строкЧувствительность к региструТребует VBA
СЧЁТЕСЛИ50 000+Да (исправимо)Нет
ТЕКСТРАЗД + ПОИСКПОЗ10 000ДаНет
Условное форматирование100 000+Да (исправимо)Нет
Power Query1 000 000+НетНет
VBAНеограниченоНастраиваетсяДа

5. Автоматизация через VBA: скрипт для поиска дубликатов

Если вам нужно не только найти, но и удалить повторяющиеся слова или выполнить сложную обработку (например, учитывать синонимы), VBA станет оптимальным решением. Ниже приведён скрипт, который:

  • Разбивает текст в каждой ячейке на слова.
  • Создаёт словарь всех уникальных слов.
  • Выводит список дубликатов в новом листе.

Код макроса:

Sub FindDuplicateWords()

Dim ws As Worksheet, dict As Object, cell As Range, words() As String

Dim word As Variant, i As Long, duplicates As Collection

Set ws = ActiveSheet

Set dict = CreateObject("Scripting.Dictionary")

Set duplicates = New Collection

' Сбор всех слов

For Each cell In ws.UsedRange

If Not IsEmpty(cell) Then

words = Split(Application.WorksheetFunction.Trim(cell.Value), " ")

For i = LBound(words) To UBound(words)

word = LCase(Trim(words(i)))

If Len(word) > 0 Then

If dict.exists(word) Then

dict(word) = dict(word) + 1

On Error Resume Next

duplicates.Add word, CStr(word)

On Error GoTo 0

Else

dict.Add word, 1

End If

End If

Next i

End If

Next cell

' Вывод результатов

Sheets.Add.Name = "Дубликаты слов"

Dim newWs As Worksheet, rowNum As Long

Set newWs = ActiveSheet

rowNum = 1

newWs.Cells(rowNum, 1).Value = "Слово"

newWs.Cells(rowNum, 2).Value = "Количество вхождений"

rowNum = rowNum + 1

For Each word In duplicates

newWs.Cells(rowNum, 1).Value = word

newWs.Cells(rowNum, 2).Value = dict(word)

rowNum = rowNum + 1

Next word

newWs.Columns("A:B").AutoFit

MsgBox "Поиск дубликатов завершён! Результаты на листе 'Дубликаты слов'.", vbInformation

End Sub

Как использовать:

  1. Нажмите Alt + F11, чтобы открыть редактор VBA.
  2. Вставьте код в новый модуль (Insert → Module).
  3. Запустите макрос (F5).
⚠️ Внимание: Макрос учитывает регистр только если убрать функцию LCase. Для больших файлов (>50 000 строк) может потребоваться оптимизация кода для ускорения работы.

6. Продвинутый анализ: поиск частичных совпадений

Что делать, если слова не повторяются полностью, но имеют общие корни? Например, "бежать", "побежать", "пробежка". Для таких случаев подойдёт поиск по маске с использованием подстановочных знаков (*, ?) или функция ПОИСК для нахождения вхождений.

Пример 1: Найти все слова, начинающиеся на "беж":

=СЧЁТЕСЛИ($A$1:$A$100; "беж*")>0

Пример 2: Найти ячейки, содержащие слово "яблоко" в любом падеже (с учётом окончаний):

=СУММПРОИЗВ(--(НЕ(ЕОШИБКА(ПОИСК("яблок"; $A$1:$A$100)))))>0

Для более точного анализа можно использовать регулярные выражения через VBA. Например, следующий код найдёт все слова с корнем "бег" (регистронезависимо):

Function FindRootWords(rng As Range, root As String) As Variant

Dim regEx As Object, cell As Range, matches As Object

Dim results() As String, i As Long

Set regEx = CreateObject("VBScript.RegExp")

regEx.Pattern = "\b" & LCase(root) & "\w*\b"

regEx.IgnoreCase = True

regEx.Global = True

ReDim results(1 To rng.Rows.Count, 1 To 1)

i = 1

For Each cell In rng

If regEx.Test(cell.Value) Then

Set matches = regEx.Execute(cell.Value)

results(i, 1) = cell.Address & ": " & Join(UniqueMatches(matches), ", ")

i = i + 1

End If

Next cell

If i = 1 Then

FindRootWords = "Совпадений не найдено"

Else

ReDim Preserve results(1 To i - 1, 1 To 1)

FindRootWords = results

End If

End Function

Function UniqueMatches(matches As Object) As String()

Dim dict As Object, match As Object, arr() As String, i As Long

Set dict = CreateObject("Scripting.Dictionary")

For Each match In matches

dict(match.Value) = 1

Next match

ReDim arr(1 To dict.Count)

i = 1

For Each match In dict.Keys

arr(i) = match

i = i + 1

Next match

UniqueMatches = arr

End Function

Этот код вернёт адреса ячеек и список найденных слов с указанным корнем. Например, для корня "бег" он найдёт "бег", "бегун", "пробежка" и т.д.

7. Обработка ошибок: что делать с опечатками и синонимами

Реальные данные редко бывают идеальными. Опечатки ("яблоко" vs "яблоко"), синонимы ("телефон" vs "смартфон") или разные формы слов ("стол" vs "столы") усложняют поиск дубликатов. Вот как справиться с этими проблемами:

  • 🔍 Опечатки: Используйте функцию НАЙТИПОХОЖЕЕ (fuzzy matching) в Power Query или библиотеку Fuzzy Lookup для Excel. Порог сходства настраивается (например, 80%).
    =НАЙТИПОХОЖЕЕ("яблоко"; $A$1:$A$100; 0,8)
  • 📚 Синонимы: Создайте справочник синонимов в отдельном листе и используйте ВПР или XLOOKUP для замены слов перед анализом.
  • 🔄 Склоне́ние слов: Для русского языка подключите Морфологический анализатор (например, через Python + pymorphy2) или используйте онлайн-сервисы вроде Yandex Speller API.

Практический пример: Допустим, у вас в столбце A есть слова "стол", "стола", "столу". Чтобы привести их к единой форме, добавьте вспомогательный столбец с функцией:

=ЕСЛИОШИБКА(ВПР(ЛЕВСИМВ(A1; 3); {'стол';'стул';'диван'}; {1;2;3}; 0); "")

Это заменит все формы слова "стол" на единый идентификатор (например, "1").

⚠️ Внимание: Автоматическая замена синонимов или форм слов может привести к потере контекста. Всегда проверяйте результаты на небольшом фрагменте данных перед массовой обработкой.

FAQ: Частые вопросы о поиске дубликатов в Excel

Можно ли найти дубликаты слов без вспомогательных столбцов?

Да, с помощью условного форматирования или Power Query. В первом случае используйте формулу с СЧЁТЕСЛИ прямо в правиле форматирования. Во втором — разделите текст на слова прямо в редакторе запросов, без добавления столбцов в исходную таблицу.

Почему формула СЧЁТЕСЛИ не находит слово "яблоко", если в ячейке написано "красное яблоко"?

Функция СЧЁТЕСЛИ ищет точные совпадения всей ячейки, а не её частей. Чтобы найти слово внутри текста, используйте комбинацию ЕСЛИ + ПОИСК:

=ЕСЛИ(НЕ(ЕОШИБКА(ПОИСК("яблоко"; A1))); "Есть"; "Нет")

Для подсчёта вхождений по всему столбцу оберните это в СУММПРОИЗВ.

Как игнорировать предлоги и союзы при поиске дубликатов?

Создайте список стоп-слов (например, "и", "в", "на", "из") в отдельном столбце, затем используйте Power Query для фильтрации:

  1. Разделите текст на слова.
  2. Добавьте шаг фильтрации: удалите строки, содержащие стоп-слова.
  3. Сгруппируйте оставшиеся слова и найдите дубликаты.

Альтернатива — VBA-скрипт с проверкой каждого слова на вхождение в список стоп-слов.

Можно ли автоматически заменить все дубликаты слов на уникальные синонимы?

Да, но потребуется справочник синонимов и VBA-скрипт. Пример алгоритма:

  1. Создайте таблицу с парами "исходное слово → синоним" на отдельном листе.
  2. Напишите макрос, который:
    • Разбивает текст каждой ячейки на слова.
    • Сравнивает каждое слово со справочником.
    • Заменяет найденные совпадения на синонимы.

Готовое решение можно найти в этом репозитории (требуется адаптация под ваши данные).

Почему Power Query тормозит на 100 000 строк?

Скорее всего, проблема в шаге разделения текста на слова. Оптимизируйте запрос:

  • Разделяйте текст не по пробелам, а по регулярному выражению (например, [^а-яА-ЯёЁ]+ для русского текста).
  • Отключите автоматическое определение типов данных на этапе загрузки.
  • Используйте Table.Buffer для промежуточных таблиц.

Если данные статичные, сохраните их в Binary Format (.bin) перед обработкой.