Если вы написали больше пары макросов на 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("[email protected]", ".")
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: от подготовки данных до написания формул и создания визуализаций. Предварительный опыт не требуется.
Если вы написали больше пары макросов на VBA, наверняка сталкивались с задачей: нужно проверить, есть ли в ячейке некоторый текст. В VBA
InStr— одна из тех функций, которые используются повсюду. Она сообщает, где один фрагмент текста встречается внутри другого. Её можно применять, чтобы проверить наличие текста в ячейке, разобрать значения в строке или управлять условной логикой в макросах, зависящих от текстовых шаблонов.В этом руководстве мы разберём синтаксис
InStr, несколько примеров, как работают режимы сравнения (этот момент вызывает проблемы чаще, чем должен), и пару шаблонов, которые вы действительно будете переиспользовать.Рекомендуем начать с нашего трека навыков «Основы Excel», чтобы заложить прочную базу перед переходом к VBA, или пройти наш курс «Продвинутые функции Excel», если у вас уже есть опыт, чтобы узнать больше о том, как функции повышают эффективность анализа данных.
Что такое функция VBA InStr?
InStr— это функция VBA, которая возвращает позицию первого вхождения одной строки в другую.Результаты ведут себя так:
Например, если «cat» встречается в строке на позиции 5, вы получите
5. Если его нет — получите0.Синтаксис VBA InStr
Полный синтаксис
InStrвыглядит так:Где:
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».
Результат для кода выше —
9, так как «before» начинается с 9-го символа.Проверка наличия символа
Чтобы проверить, существует ли символ «0» в заданной строке, используйте VBA:
В этом случае любой результат больше
0означает, что символ найден.Поиск с начала строки
Чтобы искать с начала строки, не нужно указывать позицию старта — поиск начнётся с 1. Это значение по умолчанию каждый раз, если не указать иное.
Как использовать VBA InStr в операторах If
В реальной таблице вы ищете не просто число — вы принимаете решение. Чаще всего
InStrиспользуют внутри оператораIfдля фильтрации данных.В этом руководстве мы используем пример набора данных
Ordersсо столбцами:ID,CustomerName,Email,CityиOrderNotes.If InStr(...) > 0 Then
Поскольку
InStrвозвращает0, если ничего не найдено, мы проверяем, что результат есть, когда возвращается число больше0.В примере ниже просматривается столбец
OrderNotes(столбец 5). Если найдено слово «Fragile», в столбец 6 записывается «Handle Carefully».Условные проверки по ключевым словам и фильтрация текста
Функцию
InStrтакже можно использовать для проверки ключевых слов в строках, особенно если формулировка немного меняется. Например, код ниже проверяет, содержит ли заметка «Call» (как в «Call on arrival» или «Call before delivery»). Затем он помечает и добавляет тег «Cal Customer» в столбец 6.Чувствительность к регистру и режимы сравнения VBA InStr
По умолчанию
InStrчувствителен к регистру (режимvbBinaryCompare). Допустим, вы ищете «chicago», а в данных — «Chicago».InStrвернёт0.Чтобы это исправить, используйте аргумент
compare, где:vbBinaryCompare(по умолчанию): чувствителен к регистру («A» не то же, что «a»).vbTextCompare: без учёта регистра — «A» то же, что «a».В примере ниже
InStrвозвращает0, поскольку ищется «fragile» (строчными) внутри «Fragile items».Однако при использовании
vbTextCompareтот же поиск вернёт1, игнорируя регистр.VBA InStr с позицией начала
Иногда не нужно начинать поиск с начала строки. Аргумент
startуказывает VBA, откуда начинать поиск.В примере ниже аргумент
startравен10, поэтому VBA начинает поиск с 10-го символа, а не с первого. Затем позже находит"delivery"в строке.Результат для примера выше —
31, это позиция, где начинается"delivery".Этот подход полезен, когда нужна вторая по счёту встреча, либо нужно игнорировать известный префикс при работе с повторяющимися шаблонами.
VBA InStr и InStrRev
Как вы уже узнали,
InStrищет слева направо. А вотInStrRevищет справа налево.Например, мы использовали
InStrRev, чтобы найти последнюю точку в адресе электронной почты. Результат —18, это позиция точки перед «com».Вы будете чаще использовать
InStrRev, когда нужна именно последняя встреча чего-то или когда вы работаете с именами файлов, email-адресами или путями.Типовые сценарии использования VBA InStr
Теперь, когда мы посмотрели примеры работы функции VBA
InStr, рассмотрим распространённые сценарии применения.Проверка, содержит ли ячейка ключевое слово
Предположим, у вас есть набор заказов клиентов, и нужно пометить заказы для особой обработки. Код просматривает столбец
OrderNotesи помечает всё, где встречается «noon».Проверка текста в формате email
Функцию
InStrтакже можно использовать для быстрой проверки валидности формата email. Например, код ниже проверяет, содержит ли адрес символ@, и записывает «Valid Email Format» в столбец 6.Обнаружение разделителей, таких как запятые или дефисы
Функцию
InStrможно использовать, чтобы проверить, есть ли в тексте дефис, запятая или слеш. В примере ниже код перебираетOrderNotes(столбец E), проверяет, есть ли в тексте запятая, а затем записывает результат в столбец F.Распространённые ошибки при работе с 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», но использует шаблон*, который означает «что угодно до или после».Используйте
InStr, если нужно просто понять, существует ли текст, иLike, когда нужно проверить текст по сложным шаблонам.InStr vs. Replace
Хотя с помощью
InStrможно изменить всё значение в ячейке, функцияReplaceзаменяет конкретный текст в ячейке.В примере ниже функция
Replaceнапрямую меняет «Fragile» на «Handle Carefully» внутри текста.InStr vs. Mid
Функция Mid используется для извлечения текста из строки. Поэтому часто
Midприменяют вместе сInStr, чтобы извлечь текст после получения его позиции.Код ниже извлекает домен из адресов электронной почты в наборе данных. Функция
InStrнаходит, где в email встречается «@», затемMidначинает извлечение после него. В конце код записывает домен в столбец H.InStr vs.Split
Функция
Splitиспользуется для разбиения текста на части по указанному разделителю.В примере ниже код читает каждую строку из столбца A, проверяет наличие запятой, а затем делит текст на две части. Записывает
Name→ столбец B иCity→ столбец C.Рекомендации по использованию VBA InStr
Чтобы избежать ошибок в VBA, рекомендуем следующие практики, которые помогают экономить время:
Используйте vbTextCompare, когда регистр не важен: поскольку реальные данные редко一致ны по регистру, вы можете пропустить совпадения, полагаясь на сравнение по умолчанию
argument.Комбинируйте с «If» для понятной логики: всегда добавляйте логику, возвращающую значение, поскольку сам по себе
InStrдаёт лишь число.Проверяйте > 0, а не точные позиции, если только позиция действительно не нужна.
Делайте разбор читаемым. Не наслаивайте слишком много функций в одной строке.
Вывод
InStrпроста, но вы будете использовать её повсюду. Она возвращает позицию одной строки внутри другой, и это единственное число управляет множеством решений в VBA: существует ли что-то, откуда извлекать и что макрос должен делать дальше. Сама по себе — это просто поиск. В сочетании с функциямиMid,Replaceили дажеSplitона становится частью рабочего процесса, который действительно выполняет задачи.Пройдите наш курс «Анализ данных в Excel», чтобы освоить продвинутую аналитику. Также пройдите наш курс «Power Query в Excel: средний уровень», чтобы узнать о преобразовании данных и языке M.