Track
Если вы написали больше пары макросов на 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 — справа налево. Используйте вторую, когда важна последняя встреча.