In this Article
- INSTR Function
- Instr Example
- Instr Syntax
- Instr Start Position
- Case-Insensitive INSTR Test
- InstrRev Function
- VBA Coding Made Easy
- InString Examples
- If String Contains Substring
- Find Text String in a Cell
- Find Position of a Character in a String
- Search String for Word
- If Variable Contains String
- Instr and the Left Function
- Using Instr in Microsoft Access VBA
INSTR Function
The VBA Instr Function checks if a string of text is found in another string of text. It returns 0 if the text is not found. Otherwise it returns the character position where the text is found.
The Instr Function performs exact matches. The VBA Like Operator can be used instead to perform inexact matches / pattern matching by using Wildcards.
Instr Example
The following code snippet searches the string “Look in this string” for the word “Look”. The Instr Function returns 1 because the text is found in the first position.
Sub FindSomeText()
MsgBox InStr("Look in this string", "Look")
End Sub
This second example returns 7 because the text is found starting in the 7th position:
Sub FindSomeText2()
MsgBox InStr("Don't Look in this string", "Look")
End Sub
Important! The Instr Function is case-sensitive by default. This means “look” will not match with “Look”. To make the test case-insensitive read below.
Instr Syntax
The syntax for the Instr function is as follows:
Instr( [start], string, substring, [compare] )
[start] (optional) – This optional argument is the starting position of the search. Enter 1 to start searching from position 1 (or leave blank). Enter 5 to start searching from position 5. Important! The INSTR function calculates the character position by counting from 1 NOT from the [start] position.
string – The string of text to search in.
substring – The string of text to find in the primary string.
[compare] (optional) – By default, Instr is case-sensitive. By setting this argument you can make Instr Case insensitive:
Argument vb Value |
Argument Integer | Description |
vbBinaryCompare |
0 |
(Default) Case-sensitive |
vbTextCompare |
1 |
Not Case-sensitive |
vbDatabaseCompare |
2 |
MS Access Only. Uses information in the database to perform comparison. |
Instr Start Position
The Instr start position allows you to indicate the character position where you will begin your search. Keep in mind however, the Instr output will always count from 1.
Here we set the start position to 3 to skip the first B:
Sub Instr_StartPosition()
MsgBox InStr(3, "ABC ABC", "B")
End Sub
The result is 6 because the second B is the 6th character in the string.
Case-Insensitive INSTR Test
By default, VBA treats “L” different from “l”. In other words, VBA is case-sensitive. This is true of all text functions. To make VBA case-insensitive, set the [compare] argument to 1 or vbTextCompare.
Public Sub FindText_IgnoreCase()
MsgBox InStr(1, "Don't Look in this string", "look", vbTextCompare)
End Sub
Alternatively, you can add Option Compare Text to the top of your code module:
Option Compare Text
Option Compare Text
Public Sub FindText_IgnoreCase2()
MsgBox InStr("Don't Look in this string", "look")
End Sub
Option Compare Text will impact all of the code in that module. I personally place this at the top of any module that deals with text because I never care about case differences.
InstrRev Function
The Instr Function searches from the left. Instead you can search from the right using the InstrRev Function. The InstrRev Function works very similarly to the Instr function.
Sub FindSomeText_FromRight()
MsgBox InStrRev("Look in this string", "Look")
End Sub
Just like the Instr function this will return 1 because there is only one instance of “Look” in the text. But if we add a second “Look”, you’ll see that it returns the position of the right-most “Look”:
Sub FindSomeText_FromRight()
MsgBox InStrRev("Look in this string Look", "Look")
End Sub
Next we will review more Instr examples.
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro – A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
InString Examples
If String Contains Substring
Here we will use an If statement to test if a string contains a a substring of text:
Public Sub FindSomeText()
If InStr("Look in this string", "look") = 0 Then
MsgBox "No match"
Else
MsgBox "At least one match"
End If
End Sub
Find Text String in a Cell
You can also find a string in a cell:
Sub Find_String_Cell()
If InStr(Range("B2").Value, "Dr.") > 0 Then
Range("C2").Value = "Doctor"
End If
End Sub
Or loop through a range of cells to test if the cells contain some text:
Sub Search_Range_For_Text()
Dim cell As Range
For Each cell In Range("b2:b6")
If InStr(cell.Value, "Dr.") > 0 Then
cell.Offset(0, 1).Value = "Doctor"
End If
Next cell
End Sub
VBA Programming | Code Generator does work for you!
Find Position of a Character in a String
This code will find the position of a single character in a string and assign the position to a variable:
Sub Find_Char()
Dim n As Long
n = InStr("Here Look Here", "L")
End Sub
Search String for Word
This code will search a string for a word:
Sub Search_String_For_Word()
Dim n As Long
n = InStr("Here Look Here", "Look")
If n = 0 Then
MsgBox "Word not found"
Else
MsgBox "Word found in position: " & n
End If
End Sub
If Variable Contains String
This code will test if a string variable contains a string of text:
Sub Variable_Contains_String()
Dim str As String
str = "Look Here"
If InStr(str, "Here") > 0 Then
MsgBox "Here found!"
End If
End Sub
Instr and the Left Function
Instr can be used along with other text functions like Left, Right, Len, and Mid to trim text.
With the Left function you can output the text prior to a string of text:
Sub Instr_Left()
Dim str As String
Dim n As Long
str = "Look Here"
n = InStr(str, "Here")
MsgBox Left(str, n - 1)
End Sub
Using Instr in Microsoft Access VBA
All of the above examples work exactly the same in Access VBA as in Excel VBA.
To learn more, read our article: VBA text functions
<<Return to VBA Examples
- Remove From My Forums
-
General discussion
-
Hi,
I am new to VBA. My requirement is that VBA code should find the path in the word document., some of the paths are present in the word document.
search criteria should start with \\ and end with .doc. Could anyone please help me out on how to provide the search criteria and is there any predefined methods present.
Thanks in advance.
Thanks,.
All replies
-
You’re doing a wildcard search for \\*.doc. In VBA, this is done as follows:
Sub FindIt() Selection.HomeKey Unit:=wdStory With Selection.Find .ClearFormatting .Text = "\\*.doc" .Forward = True .Wrap = wdFindStop .Format = False .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True .Execute End With End Sub
or if you want to find all occurrences:
Sub FindIt() Selection.HomeKey Unit:=wdStory With Selection.Find .ClearFormatting .Text = "\\*.doc" .Forward = True .Wrap = wdFindStop .Format = False .MatchCase = False .MatchWholeWord = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True Do While .Execute ' Do something here Loop End With End Sub
Regards, Hans Vogelaar (http://www.eileenslounge.com)
-
Hi,
Thanks for the reply.
I getting the error when i use the code. please find below the changes i made
doc.ActiveDocument.Application.Selection.HomeKey Unit:=wdStory
With Selection.Find
.ClearFormatting
.Text = “\\*.doc”
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
.Execute
End WithError :
Wrong number of arguments or invalid property
Thanks in advance.
-
Hi,
my requirement is from excel VBA i will open the document and will search in that document so only i have used
doc.ActiveDocument.Application.Selection.HomeKey Unit:=wdStory
Thanks
-
It might have helped had you said you were woking from Excel – it isn’t clear from the forum 🙁
In this case you could use the following which will list the paths in column A of the activesheet. You can change that in the code where marked in bold
Sub FindIt()
Dim wdApp As Object
Dim wdDoc As Object
Dim oRng As Object
Dim bStarted As Boolean
Dim i As Integer
On Error Resume Next
Set wdApp = GetObject(, “Word.Application”)
If Err Then
Set wdApp = CreateObject(“Word.Application”)
bStarted = True
End If
On Error GoTo 0
ActiveWorkbook.Save
‘Note that opening the document in Word if it is already open does not cause an error. It just sets the value to that open document.
Set wdDoc = wdApp.Documents.Open(“C:PathDocumentName.docx“)
Set oRng = wdDoc.Range
With oRng.Find
i = 1
Do While .Execute(FindText:=.Text = “\\*.doc”, MatchWildCards:=True)
Range(“A” & i) = oRng.Text
oRng.collapse 0
i = i + 1
Loop
End With
wdDoc.Close 0
If bStarted Then wdApp.Quit
Set oRng = Nothing
Set wdDoc = Nothing
Set wdApp = Nothing
End Sub
Graham Mayor – Word MVP
www.gmayor.com
-
Edited by
Tuesday, December 30, 2014 7:25 AM
-
Edited by
-
Hi,
many Thanks for the reply
oRng.Text is always returning 0.
but i need the path to be written in the excel.
Thanks.
-
Hi,
My requirement is
I have 100 + word documents.
In that i have some paths hard coded in header,footer and in the content.
I need to take all those paths and need to write in excel sheet.
I know only the starting and the end letters of the document. starting is \\ and the end is .doc.
I need the complete paht between these.
Many thanks in advance.
Thanks
-
Apologies, the line
Do While .Execute(FindText:=.Text = “\\*.doc”, MatchWildCards:=True)
should read
Do While .Execute(FindText:=”\\*.doc”, MatchWildCards:=True)
It will however only work for the document body. If the string is in a different story range you will have to loop through those story ranges e.g.
Sub FindIt()
Dim wdApp As Object
Dim wdDoc As Object
Dim oRng As Object
Dim bStarted As Boolean
Dim i As Integer
On Error Resume Next
Set wdApp = GetObject(, “Word.Application”)
If Err Then
Set wdApp = CreateObject(“Word.Application”)
bStarted = True
End If
On Error GoTo 0
ActiveWorkbook.Save
Set wdDoc = wdApp.Documents.Open(“C:PathDocumentName.docx”)
i = 1
For Each oRng In wdDoc.StoryRanges
With oRng.Find
.MatchWildcards = True
Do While .Execute(FindText:=”\\*.doc”)
Range(“A” & i) = oRng.Text
oRng.Collapse 0
i = i + 1
Loop
End With
If oRng.StoryType <> wdMainTextStory Then
While Not (oRng.NextStoryRange Is Nothing)
Set oRng = oRng.NextStoryRange
With oRng.Find
.MatchWildcards = True
Do While .Execute(FindText:=”\\*.doc”)
Range(“A” & i) = oRng.Text
oRng.Collapse 0
i = i + 1
Loop
End With
Wend
End If
Next oRng
wdDoc.Close 0
If bStarted Then wdApp.Quit
Set oRng = Nothing
Set wdDoc = Nothing
Set wdApp = Nothing
End Sub
Graham Mayor – Word MVP
www.gmayor.com
-
Edited by
Graham MayorMVP
Tuesday, December 30, 2014 10:51 AM
-
Edited by
-
Hi,
Many Thanks for the reply. This helped me a lot. I have an another issue. When i try to convert my .dot files to .dotm the macros are not getting converted. Any Idea please.
Thanks
-
Hi,
Thanks for the help.
I there any way to find/search for the text in notepad through VBA.
Thanks
-
You can open a text file in Word, edit it and then save it.
Regards, Hans Vogelaar (http://www.eileenslounge.com)
-
Hi,
I have a footer document which is kept seperately in the some other folder.
I have thousands of files which refer to that footer document. I am planning to write an ini file to automate the usage.
IS there any way to read the data from the another file to one file using Ini.
Thanks.
Работа с текстом в коде VBA Excel. Функции, оператор &
и другие ключевые слова для работы с текстом. Примеры использования некоторых функций и ключевых слов.
Функции для работы с текстом
Основные функции для работы с текстом в VBA Excel:
Функция | Описание |
---|---|
Asc(строка) | Возвращает числовой код символа, соответствующий первому символу строки. Например: MsgBox Asc(«/Stop»). Ответ: 47, что соответствует символу «/». |
Chr(код символа) | Возвращает строковый символ по указанному коду. Например: MsgBox Chr(47). Ответ: «/». |
Format(Expression, [FormatExpression], [FirstDayOfWeek], [FirstWeekOfYear]) | Преобразует число, дату, время в строку (тип данных Variant (String)), отформатированную в соответствии с инструкциями, включенными в выражение формата. Подробнее… |
InStr([начало], строка1, строка2, [сравнение]) | Возвращает порядковый номер символа, соответствующий первому вхождению одной строки (строка2) в другую (строка1) с начала строки. Подробнее… |
InstrRev(строка1, строка2, [начало, [сравнение]]) | Возвращает порядковый номер символа, соответствующий первому вхождению одной строки (строка2) в другую (строка1) с конца строки. Подробнее… |
Join(SourceArray,[Delimiter]) | Возвращает строку, созданную путем объединения нескольких подстрок из массива. Подробнее… |
LCase(строка) | Преобразует буквенные символы строки в нижний регистр. |
Left(строка, длина) | Возвращает левую часть строки с заданным количеством символов. Подробнее… |
Len(строка) | Возвращает число символов, содержащихся в строке. |
LTrim(строка) | Возвращает строку без начальных пробелов (слева). Подробнее… |
Mid(строка, начало, [длина]) | Возвращает часть строки с заданным количеством символов, начиная с указанного символа (по номеру). Подробнее… |
Replace(expression, find, replace, [start], [count], [compare]) | Возвращает строку, полученную в результате замены одной подстроки в исходном строковом выражении другой подстрокой указанное количество раз. Подробнее… |
Right(строка, длина) | Возвращает правую часть строки с заданным количеством символов. Подробнее… |
RTrim(строка) | Возвращает строку без конечных пробелов (справа). Подробнее… |
Space(число) | Возвращает строку, состоящую из указанного числа пробелов. Подробнее… |
Split(Expression,[Delimiter],[Limit],[Compare]) | Возвращает одномерный массив подстрок, извлеченных из указанной строки с разделителями. Подробнее… |
StrComp(строка1, строка2, [сравнение]) | Возвращает числовое значение Variant (Integer), показывающее результат сравнения двух строк. Подробнее… |
StrConv(string, conversion) | Изменяет регистр символов исходной строки в соответствии с заданным параметром «conversion». Подробнее… |
String(число, символ) | Возвращает строку, состоящую из указанного числа символов. В выражении «символ» может быть указан кодом символа или строкой, первый символ которой будет использован в качестве параметра «символ». Подробнее… |
StrReverse(строка) | Возвращает строку с обратным порядком следования знаков по сравнению с исходной строкой. Подробнее… |
Trim(строка) | Возвращает строку без начальных (слева) и конечных (справа) пробелов. Подробнее… |
UCase(строка) | Преобразует буквенные символы строки в верхний регистр. |
Val(строка) | Возвращает символы, распознанные как цифры с начала строки и до первого нецифрового символа, в виде числового значения соответствующего типа. Подробнее… |
WorksheetFunction.Trim(строка) | Функция рабочего листа, которая удаляет все лишние пробелы (начальные, конечные и внутренние), оставляя внутри строки одиночные пробелы. |
В таблице перечислены основные функции VBA Excel для работы с текстом. С полным списком всевозможных функций вы можете ознакомиться на сайте разработчика.
Ключевые слова для работы с текстом
Ключевое слово | Описание |
---|---|
& | Оператор & объединяет два выражения (результат = выражение1 & выражение2). Если выражение не является строкой, оно преобразуется в Variant (String), и результат возвращает значение Variant (String). Если оба выражения возвращают строку, результат возвращает значение String. |
vbCrLf | Константа vbCrLf сочетает в себе возврат каретки и перевод строки (Chr(13) + Chr(10)) и переносит последующий текст на новую строку (результат = строка1 & vbCrLf & строка2). |
vbNewLine | Константа vbNewLine в VBA Excel аналогична константе vbCrLf, также сочетает в себе возврат каретки и перевод строки (Chr(13) + Chr(10)) и переносит текст на новую строку (результат = строка1 & vbNewLine & строка2). |
Примеры
Вывод прямых парных кавычек
Прямые парные кавычки в VBA Excel являются спецсимволами и вывести их, заключив в самих себя или в одинарные кавычки (апострофы), невозможно. Для этого подойдет функция Chr:
Sub Primer1() ‘Вывод одной прямой парной кавычки MsgBox Chr(34) ‘Отображение текста в прямых кавычках MsgBox Chr(34) & “Волга” & Chr(34) ‘Вывод 10 прямых парных кавычек подряд MsgBox String(10, Chr(34)) End Sub |
Смотрите интересное решение по выводу прямых кавычек с помощью прямых кавычек в первом комментарии.
Отображение слов наоборот
Преобразование слова «налим» в «Милан»:
Sub Primer2() Dim stroka stroka = “налим” stroka = StrReverse(stroka) ‘милан stroka = StrConv(stroka, 3) ‘Милан MsgBox stroka End Sub |
или одной строкой:
Sub Primer3() MsgBox StrConv(StrReverse(“налим”), 3) End Sub |
Преобразование слова «лето» в «отель»:
Sub Primer4() Dim stroka stroka = “лето” stroka = StrReverse(stroka) ‘отел stroka = stroka & “ь” ‘отель MsgBox stroka End Sub |
или одной строкой:
Sub Primer5() MsgBox StrReverse(“лето”) & “ь” End Sub |
Печатная машинка
Следующий код VBA Excel в замедленном режиме посимвольно печатает указанную строку на пользовательской форме, имитируя печатную машинку.
Для реализации этого примера понадобится пользовательская форма (UserForm1) с надписью (Label1) и кнопкой (CommandButton1):
Код имитации печатной машинки состоит из двух процедур, первая из которых замедляет выполнение второй, создавая паузу перед отображением очередного символа, что и создает эффект печатающей машинки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub StopSub(Pause As Single) Dim Start As Single Start = Timer Do While Timer < Start + Pause DoEvents Loop End Sub Private Sub CommandButton1_Click() Dim stroka As String, i As Byte stroka = “Печатная машинка!” Label1.Caption = “” For i = 1 To Len(stroka) Call StopSub(0.25) ‘пауза в секундах ‘следующая строка кода добавляет очередную букву Label1.Caption = Label1.Caption & Mid(stroka, i, 1) Next End Sub |
Обе процедуры размещаются в модуле формы. Нажатие кнопки CommandButton1 запустит замедленную печать символов в поле надписи, имитируя печатную машинку.
krendel34rus,
В этом варианте учитываются Сноски. А для Колонтитулов и Надписей Указатели не предусмотрены. Этот Макрос чувствителен к регистру, поэтому макрос для одного Корня должен применяться 2 раза: 1 раз вводишь корень с Большой буквы, 2 – с маленькой.
Visual Basic | ||
|
Про InputBox сейчас почитаю.
Да, и тебе это надо для профессиональной деятельности или 1-2 раза применить? Если 1-2 раза, то этого достаточно.
Добавлено через 18 минут
krendel34rus,
Вот нашёл кое-что. Вставь это
Visual Basic | ||
|
после
Visual Basic | ||
|
соответственно после х вставь про х, после y про y.
При нажатии на Cancel InputBox принимает значение Empty. Также выход из программы будет происходить, если ты ничего не введёшь в поле и нажмёшь Ок.
Добавлено через 30 минут
krendel34rus,
А как ворд ищет слова?
Я представлял, что он будет перебирать все символы подряд, пока не наткнется на: пробел, дефис, точку, запятую, ¤, знак ввода. Может еще, что забыл
Я честно говоря, плохо представляю, как и что работает, я просто складываю различные строчки кодов вместе, находя их в Справке, на др. Форумах, записав их с помощью Макрорекордера.
Вот эта строчка мне и самому не понята
Visual Basic | ||
|
т.к. здесь oWord является
Visual Basic | ||
|
диапазоном, а на самом деле я подразумеваю под oWord одно любое слово в данном документе.
Если абстрагироваться и не вдаваться в подробности, то эта строка
Visual Basic | ||
|
означает: для каждого слова в данном документе. Т.е. мы просматриваем все слова в документе, начиная с первого и заканчивая последним.
Вот эта строка
Visual Basic | ||
|
означает следующее.
InStr является функцией VBA, с помощью которой можно выяснить, есть ли в данном фрагменте, нужный нам фрагмент. oWord – это слово в документе, а x – фрагмент который мы ищем, в данном случае x является Корнем. Если в oWord есть x, то вот это выражение InStr(oWord, x) будет больше нуля, если нету, то будет равно 0. И соответственно данная строка
Visual Basic | ||
|
читается: если в данном слове есть корень, то.
Затем я просто выделяю это слово и помечаю его. Пометку я записал с помощью Макрорекордера, а затем из полученного кода удалил то, что посчитал ненужным.
1
There is a code I am using to search for specific words in a VBA string. Currently I’m using InSTR:
tag1 = InStr(1, dish, keyword, vbTextCompare)
However the challenge is that the search is comparing strings and not words.
E.g. If I’m searching for “egg” as a keyword in a string – Eggplant Pizza, it’s returning a true value.
Ideally I would simply like to search if the word “egg” exists in a string. Is there a better function I can use?
Shai Rado
33k6 gold badges27 silver badges51 bronze badges
asked Aug 19, 2016 at 6:03
2
InStr
is the way to go. For finding out how many times a string is present in a text, you can use this one-line code. Here I use your example.
Debug.Print UBound(Split("Eggplant Pizza", "Egg"))
To make the code case insensitive, you can put Option Compare Text
on top of your code module.
answered Aug 19, 2016 at 10:20