Как найти слово в тексте vba

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!

VBA Instr

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

vba find text in cell

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

search range for text

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.

vba instr access

To learn more, read our article: VBA text functions

<<Return to VBA Examples

RRS feed

  • 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 With

    Error :

    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

  • 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

  • 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):

Пользовательская форма с элементами управления Label и CommandButton

Код имитации печатной машинки состоит из двух процедур, первая из которых замедляет выполнение второй, создавая паузу перед отображением очередного символа, что и создает эффект печатающей машинки:

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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub Indexes()
Dim x As String
Dim y As String
Dim oWord As Range
Dim oFootnote As Footnote
x = InputBox("Введите корень", "Производим пометку")
у = InputBox("Введите слово, которое должно быть в Указателе", "Производим пометку")
Application.ScreenUpdating = False
ActiveWindow.ActivePane.View.ShowAll = False
For Each oWord In ActiveDocument.Words
    If InStr(oWord, x) > 0 Then
        oWord.Select
        ActiveDocument.Indexes.MarkEntry Range:=Selection.Range, Entry:=у
    End If
Next oWord
For Each oFootnote In ActiveDocument.footnotes
    For Each oWord In oFootnote.Range.Words
        If InStr(oWord, x) > 0 Then
            oWord.Select
            ActiveDocument.Indexes.MarkEntry Range:=Selection.Range, Entry:=у
        End If
    Next oWord
Next oFootnote
Application.ScreenUpdating = True
End Sub

Про InputBox сейчас почитаю.
Да, и тебе это надо для профессиональной деятельности или 1-2 раза применить? Если 1-2 раза, то этого достаточно.

Добавлено через 18 минут
krendel34rus,
Вот нашёл кое-что. Вставь это

Visual Basic
1
2
If x = Empty Then Exit Sub
If y = Empty Then Exit Sub

после

Visual Basic
1
2
x = InputBox("Введите корень", "Производим пометку")
у = InputBox("Введите слово, которое должно быть в Указателе", "Производим пометку")

соответственно после х вставь про х, после y про y.
При нажатии на Cancel InputBox принимает значение Empty. Также выход из программы будет происходить, если ты ничего не введёшь в поле и нажмёшь Ок.

Добавлено через 30 минут
krendel34rus,

А как ворд ищет слова?
Я представлял, что он будет перебирать все символы подряд, пока не наткнется на: пробел, дефис, точку, запятую, ¤, знак ввода. Может еще, что забыл

Я честно говоря, плохо представляю, как и что работает, я просто складываю различные строчки кодов вместе, находя их в Справке, на др. Форумах, записав их с помощью Макрорекордера.
Вот эта строчка мне и самому не понята

Visual Basic
1
For Each oWord In ActiveDocument.Words

т.к. здесь oWord является

Visual Basic
1
Dim oWord As Range

диапазоном, а на самом деле я подразумеваю под oWord одно любое слово в данном документе.
Если абстрагироваться и не вдаваться в подробности, то эта строка

Visual Basic
1
For Each oWord In ActiveDocument.Words

означает: для каждого слова в данном документе. Т.е. мы просматриваем все слова в документе, начиная с первого и заканчивая последним.
Вот эта строка

Visual Basic
1
If InStr(oWord, x) > 0 Then

означает следующее.
InStr является функцией VBA, с помощью которой можно выяснить, есть ли в данном фрагменте, нужный нам фрагмент. oWord – это слово в документе, а x – фрагмент который мы ищем, в данном случае x является Корнем. Если в oWord есть x, то вот это выражение InStr(oWord, x) будет больше нуля, если нету, то будет равно 0. И соответственно данная строка

Visual Basic
1
If InStr(oWord, x) > 0 Then[

читается: если в данном слове есть корень, то.
Затем я просто выделяю это слово и помечаю его. Пометку я записал с помощью Макрорекордера, а затем из полученного кода удалил то, что посчитал ненужным.



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's user avatar

Shai Rado

33k6 gold badges27 silver badges51 bronze badges

asked Aug 19, 2016 at 6:03

Bhavin's user avatar

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

Anastasiya-Romanova 秀's user avatar

Добавить комментарий