Работа с текстовыми данными в Microsoft Excel часто требует проверки частичных совпадений между ячейками. Например, вам может понадобиться найти все строки, где в столбце с адресами есть слово "проспект", или проверить, содержат ли комментарии клиентов ключевые фразы из другого списка. В отличие от точного совпадения (где ячейки должны быть идентичны), частичное совпадение текста — более гибкий инструмент анализа.
Многие пользователи ошибочно пытаются использовать функцию ЕСЛИ(A1=B1;...) для таких задач, но она работает только с полным совпадением. На самом деле в Excel есть целый арсенал функций для поиска подстрок: от базовых ПОИСК и НАЙТИ до комбинаций с ЕСЛИОШИБКА и регулярными выражениями (в новых версиях). В этой статье мы разберём все методы — от самых простых до профессиональных, — а также покажем, как автоматизировать проверку для тысяч строк.
Особое внимание уделим типичным ошибкам: почему формула может возвращать #ЗНАЧ! вместо результата, как правильно учитывать регистр символов, и что делать, если искомый текст содержит специальные символы (например, звёздочки или вопросительные знаки). Для наглядности каждый метод сопровождается примером с реальными данными и пояснениями, как адаптировать формулу под ваши задачи.
Если вы работаете с большими массивами данных, в конце статьи найдёте советы по оптимизации производительности: как ускорить вычисления и избежать зависания Excel при проверке сотен тысяч ячеек.
1. Базовый метод: функция ПОИСК для проверки вхождения подстроки
Самый простой способ проверить, содержит ли ячейка часть текста из другой ячейки — использовать функцию ПОИСК (англ. SEARCH). Она возвращает позицию первого символа искомой подстроки или ошибку #ЗНАЧ!, если совпадений нет. Главное преимущество этой функции — она нечувствительна к регистру (то есть не различает заглавные и строчные буквы).
Синтаксис функции:
=ПОИСК(искомая_подстрока; текст_для_поиска; [начальная_позиция])
Где:
- 🔍 искомая_подстрока — текст, который вы ищете (может быть ссылкой на ячейку или текстом в кавычках);
- 📄 текст_для_поиска — ячейка или текст, в котором ведётся поиск;
- 📍 начальная_позиция (необязательно) — с какого символа начинать поиск (по умолчанию — с 1).
Пример: допустим, в ячейке A1 у нас текст "Отчёт по продажам за январь 2026", а в B1 — слово "январь". Чтобы проверить, содержится ли слово из B1 в A1, используем формулу:
=ЕСЛИ(ЕЧИСЛО(ПОИСК(B1; A1)); "Содержит"; "Не содержит")
Здесь ЕЧИСЛО проверяет, вернула ли ПОИСК число (позицию подстроки) или ошибку.
⚠️ Внимание: Если искомый текст содержит символы*или?, функцияПОИСКвоспримет их как подстановочные знаки (звёздочка — любое количество символов, вопросительный знак — один символ). Чтобы искать их буквально, используйте функциюНАЙТИ(см. следующий раздел).
Для удобства можно вынести проверку в отдельный столбец. Например, если у вас список email-адресов в столбце A, а в ячейке D1 указан домен "@gmail.com", формула для проверки будет:
=ЕСЛИ(ЕЧИСЛО(ПОИСК(D1; A1)); "Gmail"; "Другой почтовый сервис")
Убедитесь, что искомый текст не содержит подстановочных символов (* или ?)
Проверьте регистр — функция ПОИСК его игнорирует, но это может быть важно для вашей задачи
Если нужно искать с определённой позиции, укажите третий аргумент (например, ПОИСК("а"; A1; 5) начнёт поиск с 5-го символа)
Для больших таблиц зафиксируйте ссылки на ячейки с искомым текстом (например, $B$1)
-->
2. Функция НАЙТИ: поиск с учётом регистра и специальных символов
В отличие от ПОИСК, функция НАЙТИ (англ. FIND) учитывает регистр символов и позволяет искать подстановочные знаки (*, ?) как обычные символы. Это полезно, если вам нужно различать, например, "Excel" и "excel", или если искомый текст содержит звёздочки.
Синтаксис идентичен ПОИСК:
=НАЙТИ(искомая_подстрока; текст_для_поиска; [начальная_позиция])
Пример: проверка, содержится ли в ячейке A1 текст из B1 с учётом регистра:
=ЕСЛИ(ЕЧИСЛО(НАЙТИ(B1; A1)); "Содержит (с учётом регистра)"; "Не содержит")
Если вам нужно найти в тексте символ или ?, используйте именно НАЙТИ. Например, чтобы проверить, содержится ли в ячейке A1 текст "VIP" (со звёздочкой), формула будет:
=ЕСЛИ(ЕЧИСЛО(НАЙТИ("VIP*"; A1)); "Есть VIP*"; "Нет VIP*")
| Функция | Учитывает регистр | Подстановочные знаки (* ?) | Пример использования |
|---|---|---|---|
ПОИСК |
❌ Нет | ✅ Работают как подстановочные | Поиск слова независимо от регистра |
НАЙТИ |
✅ Да | ✅ Ищутся как обычные символы | Поиск с учётом регистра или символов * ? |
ПОИСКБ/НАЙТИБ |
✅ Да/Нет | ✅/❌ | Поиск в байтовом режиме (для двубайтовых языков) |
Для автоматизации проверки по всему столбцу можно использовать протягивание формулы. Например, если в столбце A у вас список товаров, а в ячейке D1 — ключевое слово, протяните формулу вниз:
=ЕСЛИ(ЕЧИСЛО(НАЙТИ($D$1; A1)); "Да"; "Нет")
Обратите внимание на абсолютную ссылку $D$1 — она зафиксирует ячейку с искомым текстом при протягивании.
ПОИСК (нечувствительна к регистру)
НАЙТИ (с учётом регистра)
Комбинация ЕСЛИ+ПОИСК
Другие методы (указаны ниже в статье)-->
3. Комбинация ЕСЛИОШИБКА + ПОИСК/НАЙТИ для обработки ошибок
При использовании ПОИСК или НАЙТИ в формулах с ЕСЛИ часто приходится обрабатывать ошибку #ЗНАЧ!, которая возникает, если подстрока не найдена. Чтобы избежать появления ошибок в таблице, можно обернуть поиск в функцию ЕСЛИОШИБКА.
Синтаксис:
=ЕСЛИОШИБКА(выражение; значение_если_ошибка)
Пример: проверка вхождения с возвратом "Да"/"Нет" без ошибок:
=ЕСЛИ(ЕСЛИОШИБКА(ПОИСК(B1; A1); 0)>0; "Да"; "Нет")
Здесь:
1. ПОИСК(B1; A1) ищет подстроку;
2. ЕСЛИОШИБКА(...; 0) заменяет ошибку на 0;
3. ЕСЛИ(...>0; "Да"; "Нет") проверяет, найдена ли подстрока (позиция > 0).
Этот метод удобен для создания условного форматирования. Например, чтобы выделить все ячейки в столбце A, содержащие текст из B1:
1. Выделите диапазон (например, A1:A100);
2. Перейдите в Главная → Условное форматирование → Создать правило;
3. Выберите "Использовать формулу для определения форматируемых ячеек";
4. Введите формулу:
=ЕСЛИОШИБКА(ПОИСК($B$1; A1); 0)>0
5. Задайте формат (например, зелёную заливку).
⚠️ Внимание: В условном форматировании нельзя использоватьЕСЛИ— только формулы, возвращающиеИСТИНА/ЛОЖЬили числа. Поэтому конструкцияЕСЛИОШИБКА(ПОИСК(...); 0)>0работает, аЕСЛИ(ЕЧИСЛО(ПОИСК(...)); 1; 0)— нет.
Для поиска нескольких подстрок одновременно можно использовать массив формул. Например, чтобы проверить, содержится ли в A1 хотя бы одно из слов из диапазона D1:D5, используйте:
=ЕСЛИ(МАКС(ЕСЛИОШИБКА(ПОИСК(D1:D5; A1); 0))>0; "Есть совпадение"; "Нет совпадений")
Внимание: это формула массива — вводите её с нажатием Ctrl+Shift+Enter (в новых версиях Excel достаточно просто Enter).
=ЕСЛИ(ЕСЛИОШИБКА(ПОИСК("текст"; A1); 0)=0; "Не содержит"; "Содержит")
Это полезно для фильтрации данных, например, чтобы исключить строки с определёнными словами.-->
4. Продвинутый поиск: регулярные выражения в Excel 365 и Excel 2021
В последних версиях Microsoft Excel (начиная с Excel 365 и Excel 2021) появилась поддержка регулярных выражений через новые функции: ТЕКСТДО, ТЕКСТПОСЛЕ, РАЗДТЕКСТ, а также РЕГВЫРАЖ (в бета-версиях). Это открывает возможности для сложного поиска по шаблонам.
Например, чтобы проверить, содержится ли в ячейке A1 слово, начинающееся на "Арт" (например, "Артикул", "Арт.123"), можно использовать:
=ЕСЛИ(РЕГВЫРАЖ.СОВПАД(A1; "Арт\w*"; 1); "Есть артикул"; "Нет")
Где:
- \w* — любой алфавитно-цифровой символ (0 или более раз);
- 1 — флаг чувствительности к регистру (0 — нечувствительно, 1 — чувствительно).
Для поиска email-адресов в тексте подойдёт шаблон:
=РЕГВЫРАЖ.СОВПАД(A1; "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}")
Эта формула вернёт ИСТИНА, если в A1 есть текст, похожий на email.
Если у вас более старая версия Excel, регулярные выражения можно эмулировать с помощью Power Query или VBA. Например, в Power Query для фильтрации строк по шаблону:
1. Загрузите данные в Power Query (Данные → Получение данных → Из таблицы/диапазона);
2. Добавьте столбец с условием: = Text.Contains([ВашСтолбец]; "шаблон");
3. Отфильтруйте по этому столбцу.
⚠️ Внимание: Регулярные выражения в Excel поддерживаются не во всех локализациях. Если функция РЕГВЫРАЖ отсутствует, проверьте настройки языка или обновите программу. В Excel для Mac поддержка может отставать от Windows-версии.
Для сложных шаблонов (например, поиска дат в произвольном формате) лучше использовать VBA. Пример макроса для поиска ячеек, содержащих даты в формате "ДД.ММ.ГГГГ":
Sub FindDates()
Dim rng As Range, cell As Range
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "\b\d{2}\.\d{2}\.\d{4}\b"
Set rng = Selection
For Each cell In rng
If regex.Test(cell.Value) Then
cell.Interior.Color = RGB(255, 200, 150) ' Выделяем цветом
End If
Next cell
End Sub
Чтобы запустить этот код:
1. Нажмите Alt + F11 для открытия редактора VBA;
2. Вставьте код в новый модуль;
3. Выделите диапазон ячеек и запустите макрос.
Как включить поддержку регулярных выражений в Excel 2019 и старше
1. Убедитесь, что у вас установлена последняя версия Microsoft 365 (регулярные выражения появились в обновлениях 2022 года).
2. Если функции РЕГВЫРАЖ нет, попробуйте использовать Power Query или VBA (см. примеры выше).
3. Для корпоративных пользователей может потребоваться разрешение администратора на установку обновлений.
5. Поиск нескольких подстрок одновременно: функции ИЛИ и МАССИВ
Часто требуется проверить, содержится ли в ячейке хотя бы одна из нескольких подстрок. Например, вы хотите найти все отзывы клиентов, где упоминаются слова "плохо", "медленно" или "недоволен". Для этого можно комбинировать функции ПОИСК с ИЛИ.
Пример: проверка на наличие одного из трёх слов в ячейке A1:
=ЕСЛИ(ИЛИ(
ЕЧИСЛО(ПОИСК("плохо"; A1)),
ЕЧИСЛО(ПОИСК("медленно"; A1)),
ЕЧИСЛО(ПОИСК("недоволен"; A1))
); "Есть негатив"; "Позитивный отзыв")
Если список искомых слов хранится в отдельном диапазоне (например, D1:D10), используйте формулу массива:
=ЕСЛИ(МАКС(ЕСЛИОШИБКА(ПОИСК(D1:D10; A1); 0))>0; "Есть совпадение"; "Нет")
Не забудьте ввести эту формулу с Ctrl+Shift+Enter в старых версиях Excel (в Excel 365 достаточно Enter).
Для проверки, что ячейка содержит все подстроки из списка, замените ИЛИ на И:
=ЕСЛИ(И(
ЕЧИСЛО(ПОИСК("слово1"; A1)),
ЕЧИСЛО(ПОИСК("слово2"; A1))
); "Содержит оба слова"; "Хотя бы одно слово отсутствует")
- 🔄 ИЛИ — проверяет, есть ли хотя бы одно совпадение;
- 🔗 И — требует, чтобы все подстроки присутствовали;
- 📊 МАКС + ЕСЛИОШИБКА — универсальный метод для динамических списков.
Для больших списков (более 100 слов) формулы массива могут замедлять работу Excel. В этом случае лучше использовать Power Query или VBA. Например, в Power Query можно создать столбец с условием:
= List.AnyTrue(List.Transform(СписокСлов, each Text.Contains([ВашСтолбец], _)))
- Используйте ИЛИ для проверки хотя бы одного совпадения.
- Используйте И для проверки всех совпадений.
- Для динамических списков подходит комбинация МАКС + ЕСЛИОШИБКА + ПОИСК (формула массива).
- В больших таблицах (>10 000 строк) отдавайте предпочтение Power Query или VBA.-->
6. Оптимизация производительности: как ускорить проверку в больших таблицах
При работе с большими массивами данных (десятки тысяч строк) формулы с ПОИСК/НАЙТИ могут значительно тормозить Excel. Вот несколько способов оптимизации:
1. Замена формул на значения:
- 📌 После выполнения проверки скопируйте столбец с результатами;
- 📋 Вставьте их как значения (
Главная → Вставить → Значения); - ⚡ Удалите исходные формулы — это снизит нагрузку.
2. Использование Power Query:
Power Query обрабатывает данные быстрее, чем формулы, особенно при работе с миллионами строк. Пример:
1. Загрузите данные в Power Query;
2. Добавьте столбец с условием:
= Table.AddColumn(Источник, "Содержит", each Text.Contains([ВашСтолбец], "искомый текст"))
3. Загрузите результат обратно в Excel.
3. Отключение автоматического пересчёта:
При работе с формулами отключите автоматический пересчёт:
1. Перейдите в Формулы → Параметры вычислений → Вручную;
2. После завершения редактирования нажмите F9 для пересчёта.
⚠️ Внимание: Не забывайте включать автоматический пересчёт обратно, иначе данные могут устареть при изменении исходных ячеек.
4. Использование VBA для массовой проверки:
Для одноразовой проверки большого объёма данных можно написать макрос:
Sub CheckSubstring()
Dim ws As Worksheet
Dim rng As Range, cell As Range
Dim searchText As String
Set ws = ActiveSheet
Set rng = ws.Range("A1:A" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row)
searchText = ws.Range("B1").Value
For Each cell In rng
If InStr(1, cell.Value, searchText, vbTextCompare) > 0 Then
cell.Offset(0, 1).Value = "Да"
Else
cell.Offset(0, 1).Value = "Нет"
End If
Next cell
End Sub
Этот код проверяет все ячейки в столбце A на наличие текста из B1 и записывает результат в столбец B.
5. Разделение задачи на части:
Если таблица очень большая (более 100 000 строк), разбейте её на несколько файлов и обрабатывайте по частям. Например:
- 📂 Сохраните исходные данные в
CSV; - 🔄 Обработайте первые 50 000 строк в одном файле, затем следующие 50 000 — в другом;
- 📊 Объедините результаты с помощью
Power Query.
7. Типичные ошибки и как их избежать
При работе с проверкой вхождения подстрок в Excel пользователи часто сталкиваются с следующими проблемами:
1. Ошибка #ЗНАЧ! при поиске пустых ячеек
Если ячейка, в которой вы ищете текст, пустая, функции ПОИСК и НАЙТИ вернут ошибку. Чтобы избежать этого, добавьте проверку на пустоту:
=ЕСЛИ(A1=""; "Пусто"; ЕСЛИ(ЕЧИСЛО(ПОИСК(B1; A1)); "Есть"; "Нет"))
2. Неправильная обработка регистра
Функция ПОИСК игнорирует регистр, а НАЙТИ — нет. Если вам нужно, чтобы поиск был регистронезависимым, но при этом искались специальные символы (*, ?), используйте комбинацию:
=ЕСЛИ(ЕЧИСЛО(ПОИСК(ПОДСТАВИТЬ(B1; ""; CHAR(1)); ПОДСТАВИТЬ(A1; ""; CHAR(1)))); "Есть"; "Нет")
Здесь CHAR(1) заменяет звёздочки на непечатаемый символ, чтобы избежать их интерпретации как подстановочных знаков.
3. Поиск чисел в текстовом формате
Если вы ищете число (например, "123") в ячейке, где оно хранится как текст, проблем не возникнет. Но если число хранится как числовой формат, а вы ищете его как текст, ПОИСК не сработает. Решение — преобразовать число в текст:
=ЕСЛИ(ЕЧИСЛО(ПОИСК(ТЕКСТ(B1; "0"); ТЕКСТ(A1; "0"))); "Есть"; "Нет")
4. Ошибки при использовании подстановочных знаков
Если искомый текст содержит или ?, и вы используете ПОИСК, эти символы будут восприняты как подстановочные. Например, поиск "VIP" найдёт "VIP123", "VIPклиент" и т.д. Чтобы искать их буквально, используйте НАЙТИ или экранируйте символы:
=ЕСЛИ(ЕЧИСЛО(ПОИСК(ПОДСТАВИТЬ(B1; ""; "~"); A1)); "Есть"; "Нет")
Здесь ~* ищет именно звёздочку.
5. Зависание Excel при работе с большими диапазонами
Если формула проверяет сотни тысяч ячеек, Excel может подвисать. Решения:
- 🔄 Используйте
Power Queryдля предварительной обработки; - 📊 Разбейте задачу на части (например, обрабатывайте по 10 000 строк за раз);
- ⚡ Отключите автоматический пересчёт формул (
Формулы → Параметры вычислений → Вручную).
FAQ: Частые вопросы по поиску подстрок в Excel
Можно ли искать подстроку с учётом форматирования (например, жирный или курсивный текст)?
Нет, функции ПОИСК и НАЙТИ работают только с текстовым содержимым ячеек и не учитывают форматирование. Чтобы проверить форматирование, потребуется VBA. Пример кода для поиска жирного текста:
Function HasBoldText(rng As Range, searchText As String) As Boolean
Dim ch As Characters
For Each ch In rng.Characters
If ch.Font.Bold And InStr(ch.Text, searchText) > 0 Then
HasBoldText = True
Exit Function
End If
Next ch
HasBoldText = False
End Function
Используйте её как пользовательскую функцию: =HasBoldText(A1; "текст").
Как найти ячейки, которые содержат ТОЛЬКО определённую подстроку (а не часть текста)?
Чтобы проверить, что ячейка содержит только искомый текст (без других символов), используйте:
=ЕСЛИ(A1=B1; "Точное совпадение"; "Не совпадает")
Если нужно игнорировать пробелы в начале/конце, добавьте СЖПРОБЕЛЫ:
=ЕСЛИ(СЖПРОБЕЛЫ(A1)=СЖПРОБЕЛЫ(B1); "Совпадает"; "Не совпадает")
Почему формула возвращает #ЗНАЧ!, хотя текст точно есть в ячейке?
Причины ошибки #ЗНАЧ!:
- 🔍 Искомая подстрока пустая (например,
B1содержит""); - 📄 Ячейка, в которой ищут, содержит ошибку (например,
#ДЕЛ/0!); - 🔤 В искомом тексте есть подстановочные знаки (
*,?), а используется функцияПОИСК; - 🖥️ В настройках региональных стандартов используется другая кодировка (например, кириллица vs. латиница).
Решение: проверьте содержимое