Перейти к основному контенту

Функция VBA InStr: как искать текст в Excel VBA

Узнайте, как использовать функцию VBA InStr для поиска текста внутри строк: синтаксис, примеры, чувствительность к регистру и частые ошибки.
Обновлено 21 сент. 2026 г.  · 9 мин читать

Изучить с помощью AI

ChatGPTClaudePerplexity

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

В этом руководстве мы разберём синтаксис InStr, несколько примеров, как работают режимы сравнения (этот момент вызывает проблемы чаще, чем должен), и пару шаблонов, которые вы действительно будете переиспользовать.

Рекомендуем начать с нашего трека навыков «Основы Excel», чтобы заложить прочную базу перед переходом к VBA, или пройти наш курс «Продвинутые функции Excel», если у вас уже есть опыт, чтобы узнать больше о том, как функции повышают эффективность анализа данных.

Что такое функция VBA InStr?

InStr — это функция VBA, которая возвращает позицию первого вхождения одной строки в другую.

Результаты ведут себя так:

  • Если найдено — возвращается число (позиция, где начинается совпадение)
  • Если ничего не найдено — возвращается 0

Например, если «cat» встречается в строке на позиции 5, вы получите 5. Если его нет — получите 0.

Синтаксис VBA InStr

Полный синтаксис InStr выглядит так:

InStr([start], string1, string2, [compare])

Где:

  • start (необязательный): указывает VBA, откуда начать поиск. Если пропустить, VBA начнёт с позиции 1.

  • string1 (обязательный): полный текст, внутри которого выполняется поиск.

  • string2 (обязательный): текст, который нужно найти.

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

Обратите внимание: можно опустить аргументы start и compare (InStr(string1, string2)) для упрощённого варианта. Но если вы используете аргумент compare, нужно также задать аргумент start.

Как работает VBA InStr

Думайте о InStr как о чтении предложения слева направо, по одному символу.

Функция берёт string1, просматривает её и ищет первое место, где совпадает string2. В момент, когда совпадение найдено, поиск прекращается и возвращается позиция начала совпадения.

Позиция «совпадения» важна, поскольку VBA считает с 1, а не с 0. То есть первый символ в строке — позиция 1, второй — 2 и так далее. 

Возвращаемые значения VBA InStr

Интерпретировать результат функции InStr просто. Возможны два варианта:

  • Положительное число: если найдено совпадение, число показывает, откуда оно начинается.

  • 0: если совпадений в строке нет

Однако если входные строки равны Null, функция вернёт Null. В базовых макросах этим можно пренебречь, но стоит помнить: такая разница может незаметно «сломать» условие.

Базовые примеры VBA InStr

Теперь покажем несколько примеров использования функции VBA InStr

Поиск слова в предложении

Проверим, содержится ли слово «before» в примечании «Deliver before noon».

Sub Before()

    Dim result As Integer
    result = InStr("Deliver before noon", "before")
    
    MsgBox result

End Sub

Результат для кода выше — 9, так как «before» начинается с 9-го символа.

Проверка наличия символа

Чтобы проверить, существует ли символ «0» в заданной строке, используйте VBA:

Sub ChExist()

    Dim result As Integer
    result = InStr(“A1023”, “0”)
    
    MsgBox result

End Sub

В этом случае любой результат больше 0 означает, что символ найден.

Поиск с начала строки

Чтобы искать с начала строки, не нужно указывать позицию старта — поиск начнётся с 1. Это значение по умолчанию каждый раз, если не указать иное.

Sub ChExist()

    Dim result As Integer
    result = InStr("Report_2026_Final", "2026")
    
    MsgBox result

End Sub

Как использовать VBA InStr в операторах If

В реальной таблице вы ищете не просто число — вы принимаете решение. Чаще всего InStr используют внутри оператора If для фильтрации данных.

В этом руководстве мы используем пример набора данных Orders со столбцами: ID, CustomerName, Email, City и OrderNotes.

If InStr(...) > 0 Then

Поскольку InStr возвращает 0, если ничего не найдено, мы проверяем, что результат есть, когда возвращается число больше 0.

В примере ниже просматривается столбец OrderNotes (столбец 5). Если найдено слово «Fragile», в столбец 6 записывается «Handle Carefully».

Sub ChExist()

    Dim i As Integer
    
    ' Loop through rows 2 to 51
    For i = 2 To 51
    
        ' Check if the order notes mention "Fragile"
        If InStr(Cells(i, 5).Value, "Fragile") > 0 Then
            Cells(i, 6).Value = "Handle Carefully"
        End If
        
    Next i

End Sub

Условные проверки по ключевым словам и фильтрация текста

Функцию InStr также можно использовать для проверки ключевых слов в строках, особенно если формулировка немного меняется. Например, код ниже проверяет, содержит ли заметка «Call» (как в «Call on arrival» или «Call before delivery»). Затем он помечает и добавляет тег «Cal Customer» в столбец 6.

Sub ChExist()

    Dim i As Integer
    
    ' Loop through rows 2 to 51
    For i = 2 To 51
    
        ' Check if the order notes mention “Call”
        If InStr(Cells(i, 5).Value, “Call”) > 0 Then
            Cells(i, 6).Value = “Call Customer”
        End If
        
    Next i

End Sub

Чувствительность к регистру и режимы сравнения VBA InStr

По умолчанию InStr чувствителен к регистру (режим vbBinaryCompare). Допустим, вы ищете «chicago», а в данных — «Chicago». InStr вернёт 0.

Чтобы это исправить, используйте аргумент compare, где:

  • vbBinaryCompare (по умолчанию): чувствителен к регистру («A» не то же, что «a»).

  • vbTextCompare: без учёта регистра — «A» то же, что «a».

В примере ниже InStr возвращает 0, поскольку ищется «fragile» (строчными) внутри «Fragile items».

Sub CheckFragile()

    Dim result As Integer
    
    result = InStr(1, "Fragile items", "fragile", vbBinaryCompare)
    
    MsgBox result

End Sub

Однако при использовании vbTextCompare тот же поиск вернёт 1, игнорируя регистр.

Sub CheckFragile()

    Dim result As Integer
    
    result = InStr(1, "Fragile items", "fragile", vbTextCompare)
    
    MsgBox result

End Sub

VBA InStr с позицией начала

Иногда не нужно начинать поиск с начала строки. Аргумент start указывает VBA, откуда начинать поиск.

В примере ниже аргумент start равен 10, поэтому VBA начинает поиск с 10-го символа, а не с первого. Затем позже находит "delivery" в строке.

Sub CheckUrgent()

    Dim result As Integer
    
    result = InStr(10, “Deliver before noon - urgent delivery”, “delivery”)
    
    MsgBox result

End Sub

Результат для примера выше — 31, это позиция, где начинается "delivery".

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

VBA InStr и InStrRev

Как вы уже узнали, InStr ищет слева направо. А вот InStrRev ищет справа налево.

Например, мы использовали InStrRev, чтобы найти последнюю точку в адресе электронной почты. Результат — 18, это позиция точки перед «com».

Sub CheckChr()

    Dim result As Integer
    
    result = InStrRev("john.jacobs@email.com", ".")
    
    MsgBox result

End Sub

Вы будете чаще использовать InStrRev, когда нужна именно последняя встреча чего-то или когда вы работаете с именами файлов, email-адресами или путями.

Типовые сценарии использования VBA InStr

Теперь, когда мы посмотрели примеры работы функции VBA InStr, рассмотрим распространённые сценарии применения.

Проверка, содержит ли ячейка ключевое слово

Предположим, у вас есть набор заказов клиентов, и нужно пометить заказы для особой обработки. Код просматривает столбец OrderNotes и помечает всё, где встречается «noon».

Sub ChExist()

    Dim i As Integer
    
    ' Loop through rows 2 to 51
    For i = 2 To 51
    
        If InStr(1, "Deliver before noon", "noon", vbTextCompare) > 0 Then
            ' Logic to mark as "Morning Delivery"
        End If
        
    Next i

End Sub

Проверка текста в формате email

Функцию InStr также можно использовать для быстрой проверки валидности формата email. Например, код ниже проверяет, содержит ли адрес символ @, и записывает «Valid Email Format» в столбец 6.

Sub ValidateEmail()

    Dim i As Integer
    
    ' Loop through rows 2 to 51
    For i = 2 To 51
    
        If InStr(Cells(i, 3).Value, "@") > 0 Then
            Cells(i, 6).Value = "Valid Email Format"
        End If
        
    Next i

End Sub

Обнаружение разделителей, таких как запятые или дефисы

Функцию InStr можно использовать, чтобы проверить, есть ли в тексте дефис, запятая или слеш. В примере ниже код перебирает OrderNotes (столбец E), проверяет, есть ли в тексте запятая, а затем записывает результат в столбец F.

Sub ValidateEmail()

    Dim i As Integer
    Dim commaPos As Integer
    Dim OrderNotes As String
    
    For i = 2 To 51
        
        OrderNotes = Cells(i, 5).Value
        
        commaPos = InStr(1, OrderNotes, ",")
        
        ' If a comma exists, mark it
        If commaPos > 0 Then
            Cells(i, 6).Value = "Has comma"
        Else
            Cells(i, 6).Value = "No comma"
        End If
        
    Next i

End Sub

Распространённые ошибки при работе с VBA InStr

Даже будучи опытным разработчиком, вы можете столкнуться с проблемами при использовании InStr, из-за которых код ведёт себя неожиданно. Ниже — типичные проблемы, с которыми приходилось сталкиваться, и способы их решения:

  • Забывают, что InStr считает с 1: всегда помните: позиции начинаются с 1, а не с 0. Если вы пришли из Python или JavaScript, поначалу это непривычно.

  • Воспринимают InStr как True/False: помните, что InStr не возвращает True или False. Если нужно что-то найти, проверяйте, что результат > 0.

  • Игнорируют чувствительность к регистру: как вы теперь знаете, по умолчанию InStr чувствителен к регистру. Если регистр не важен, используйте vbTextCompare в аргументе compare.

  • Путают string1 и string2: всегда помните: первый аргумент — где ищем. Второй — что ищем. Если искать так InStr(SearchTerm, FullText), вы всегда получите 0.

VBA InStr и другие строковые функции VBA

Поскольку InStr обычно показывает, где строка находится в тексте, сравним её с другими строковыми функциями.

InStr vs. Like

Оператор Like используется для сопоставления с шаблоном. Например, код ниже проверяет «Fragile», но использует шаблон *, который означает «что угодно до или после».

Sub ChExist()

    Dim i As Integer
    
    ' Loop through rows 2 to 51
    For i = 2 To 51
    
        If Cells(i, 5).Value Like "*Fragile*" Then
            Cells(i, 6).Value = "Handle Carefully"
        End If
        
    Next i

End Sub

Используйте InStr, если нужно просто понять, существует ли текст, и Like, когда нужно проверить текст по сложным шаблонам.

InStr vs. Replace

Хотя с помощью InStr можно изменить всё значение в ячейке, функция Replace заменяет конкретный текст в ячейке.

В примере ниже функция Replace напрямую меняет «Fragile» на «Handle Carefully» внутри текста.

Sub ReplaceOrder()

    Dim i As Integer
    
    For i = 2 To 51
        Cells(i, 5).Value = Replace(Cells(i, 5).Value, "Fragile", "Handle Carefully")
    Next i

End Sub

InStr vs. Mid

Функция Mid используется для извлечения текста из строки. Поэтому часто Mid применяют вместе с InStr, чтобы извлечь текст после получения его позиции. 

Код ниже извлекает домен из адресов электронной почты в наборе данных. Функция InStr находит, где в email встречается «@», затем Mid начинает извлечение после него. В конце код записывает домен в столбец H.

Sub ExtractDomain()

    Dim i As Integer
    Dim pos As Integer
    Dim domain As String
    
    For i = 2 To 51
        
        pos = InStr(1, Cells(i, 3).Value, "@")
        
        If pos > 0 Then
            domain = Mid(Cells(i, 3).Value, pos + 1)
            Cells(i, 8).Value = domain
        End If
        
    Next i

End Sub

InStr vs.Split

Функция Split используется для разбиения текста на части по указанному разделителю. 

В примере ниже код читает каждую строку из столбца A, проверяет наличие запятой, а затем делит текст на две части. Записывает Name → столбец B и City → столбец C.

Sub SplitTextColumn()

    Dim i As Integer
    Dim lastRow As Integer
    Dim parts As Variant
    Dim text As String
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 2 To lastRow
        
        text = Cells(i, 1).Value
        
        ' Only split if a comma exists
        If InStr(1, text, ",") > 0 Then
            
            parts = Split(text, ",")
            
            Cells(i, 2).Value = parts(0) ' Name
            Cells(i, 3).Value = parts(1) ' City
            
        End If
        
    Next i

End Sub

Рекомендации по использованию VBA InStr

Чтобы избежать ошибок в VBA, рекомендуем следующие практики, которые помогают экономить время:

  • Используйте vbTextCompare, когда регистр не важен: поскольку реальные данные редко一致ны по регистру, вы можете пропустить совпадения, полагаясь на сравнение по умолчанию argument.

  • Комбинируйте с «If» для понятной логики: всегда добавляйте логику, возвращающую значение, поскольку сам по себе InStr даёт лишь число.

  • Проверяйте > 0, а не точные позиции, если только позиция действительно не нужна.

  • Делайте разбор читаемым. Не наслаивайте слишком много функций в одной строке.

Вывод

InStr проста, но вы будете использовать её повсюду. Она возвращает позицию одной строки внутри другой, и это единственное число управляет множеством решений в VBA: существует ли что-то, откуда извлекать и что макрос должен делать дальше. Сама по себе — это просто поиск. В сочетании с функциями Mid, Replace или даже Split она становится частью рабочего процесса, который действительно выполняет задачи.

Пройдите наш курс «Анализ данных в Excel», чтобы освоить продвинутую аналитику. Также пройдите наш курс «Power Query в Excel: средний уровень», чтобы узнать о преобразовании данных и языке M.

FAQs

Что именно возвращает InStr?

Функция возвращает позицию, где начинается совпадение. Если ничего не найдено, возвращается 0.

Чувствительна ли InStr к регистру?

Да, по умолчанию InStr чувствительна к регистру. ”Fragile” и ”fragile” считаются разными. Используйте vbTextCompare, если не нужен учёт регистра.

Что означает, что InStr «считает с 1»?

Первый символ в строке имеет позицию 1, а не 0. Это важно, когда вы используете результат в других функциях.

Что произойдёт, если одно из значений — Null?

Результат также будет Null, а не 0.

В чём разница между InStr и InStrRev?

InStr ищет слева направо, а InStrRev — справа налево. Используйте вторую, когда важна последняя встреча.

Темы
Excel

Учитесь с DataCamp

Track

Основы Excel

16 ч
Освойте основные навыки, необходимые для работы в Excel: от подготовки данных до написания формул и создания визуализаций. Предварительный опыт не требуется.
ПодробнееRight Arrow
Начать Курс
Смотрите большеRight Arrow