Using Find and Replace in Excel VBA

This tutorial will demonstrate how to use the Find and Replace methods in Excel VBA.

VBA Find

Excel has excellent built-in Find and Find & Replace tools.

They can be activated with the shortcuts CTRL + F (Find) or CTRL + H (Replace) or through the Ribbon: Home > Editing > Find & Select.

find excel vba

By clicking Options, you can see advanced search options:

advanced find vba

You can easily access these methods using VBA.

Find VBA Example

To demonstrate the Find functionality, we created the following data set in Sheet1.

PIC 02

If you’d like to follow along, enter the data into your own workbook.

 

VBA Find without Optional Parameters

When using the VBA Find method, there are many optional parameters that you can set.

We strongly recommend defining all parameters whenever using the Find Method!

If you don’t define the optional parameters, VBA will use the currently selected parameters in Excel’s Find window. This means, you may not know what search parameters are being used when the code is ran. Find could be ran on the entire workbook or a sheet. It could search for formulas or values. There’s no way to know, unless you manually check what’s currently selected in Excel’s Find Window.

For simplicity, we will start with an example with no optional parameters defined.

Simple Find Example

Let’s look at a simple Find example:

Sub TestFind()
Dim MyRange As Range

Set MyRange = Sheets("Sheet1").UsedRange.Find("employee")
MsgBox MyRange.Address
MsgBox MyRange.Column
MsgBox MyRange.Row

End Sub

This code searches for “employee” in the Used Range of Sheet1. If it finds “employee”, it will assign the first found range to range variable MyRange.

Next, Message Boxes will display with the address, column, and row of the found text.

In this example, the default Find settings are used (assuming they have not been changed in Excel’s Find Window):

  • The search text is partially matched to the cell value (an exact cell match is not required)
  • The search is not case sensitive.
  • Find only searches a single worksheet

These settings can be changed with various optional parameters (discussed below).

Find Method Notes

  • Find does not select the cell where the text is found.  It only identifies the found range, which you can manipulate in your code.
  • The Find method will only locate the first instance found.
  • You can use wildcards (*) e.g. search for ‘E*’

Nothing Found

If the search text does not exist, then the range object will remain empty. This causes a major problem when your code tries to display the location values because they do not exist.  This will result in an error message which you do not want.

Fortunately, you can test for an empty range object within VBA using the Is Operator:

If Not MyRange Is Nothing Then

Adding the code to our previous example:

Sub TestFind()
Dim MyRange As Range

Set MyRange = Sheets("Sheet1").UsedRange.Find("employee")
If Not MyRange Is Nothing Then
    MsgBox MyRange.Address
    MsgBox MyRange.Column
    MsgBox MyRange.Row
Else
    MsgBox "Not found"
End If
End Sub 

Find Parameters

So far, we have only looked at a basic example of using the Find method.  However, there are a number of optional parameters available to help you refine your search

Parameter Type Description Values
What Required The value to search for Any data type such as a string or numeric
After Optional Single cell reference to begin your search Cell address
LookIn Optional Use Formulas, Values, Comments for search xlValues, xlFormulas, xlComments
LookAt Optional Match part or whole of a cell xlWhole, xlPart
SearchOrder Optional The Order to search in – rows or columns xlByRows, xlByColummns
SearchDirection Optional Direction for search to go in – forward or backward xlNext, xlPrevious
MatchCase Optional Search is case sensitive or not True or False
MatchByte Optional Used only if you have installed double byte language support e.g. Chinese language True or False
SearchFormat Optional Allow searching by format of cell True or False

 

After Parameter and Find Multiple Values

You use the After parameter to specify the starting cell for your search. This is useful where there is more than one instance of the value that you are searching for.

If a search has already found one value and you know that there will be more values found, then you use the Find method with the ‘After’ parameter to record the first instance and then use that cell as the starting point for the next search.

You can use this to find multiple instances of your search text:

Sub TestMultipleFinds()
Dim MyRange As Range, OldRange As Range, FindStr As String

'Look for first instance of "‘Light & Heat"
Set MyRange = Sheets("Sheet1").UsedRange.Find("Light & Heat")

'If not found then exit
If MyRange Is Nothing Then Exit Sub

'Display first address found
MsgBox MyRange.Address

'Make a copy of the range object
Set OldRange = MyRange

'Add the address to the string delimiting with a "|" character
FindStr = FindStr & "|" & MyRange.Address

'Iterate through the range looking for other instances
Do
    'Search for ‘Light & Heat’ using the previous found address as the After parameter   
    Set MyRange = Sheets("Sheet1").UsedRange.Find("Light & Heat", After:=Range(OldRange.Address))

    'If the address has already been found then exit the do loop – this stops continuous looping
    If InStr(FindStr, MyRange.Address) Then Exit Do
    
    'Display latest found address
    MsgBox MyRange.Address

    'Add the latest address to the string of addresses
    FindStr = FindStr & "|" & MyRange.Address

    'make a copy of the current range
     Set OldRange = MyRange
Loop
End Sub

This code will iterate through the used range, and will display the address every time it finds an instance of ‘Light & Heat’

Note that the code will keep looping until a duplicate address is found in FindStr, in which case it will exit the Do loop.

LookIn Parameter

You can use the LookIn parameter to specify which component of the cell you want to search in.  You can specify values, formulas, or comments in a cell.

  • xlValues – Searches cell values (the final value of a cell after it’s calculation)
  • xlFormulas – Searches within the cell formula itself (whatever is entered into the cell)
  • xlComments – Searches within cell notes
  • xlCommentsThreaded – Searches within cell comments

Assuming that a formula has been entered on the worksheet, you could use this example code to find the first location of any formula:

Sub TestLookIn()
Dim MyRange As Range

Set MyRange = Sheets("Sheet1").UsedRange.Find("=", LookIn:=xlFormulas)
If Not MyRange Is Nothing Then
    MsgBox MyRange.Address   
Else
    MsgBox "Not found"
 End If
End Sub

If the ‘LookIn’ parameter was set to xlValues, the code would display a ‘Not Found’ message. In this example it will return B10.

Using the LookAt Parameter

The LookAt parameter determines whether find will search for an exact cell match, or search for any cell containing the search value.

  • xlWhole – Requires the entire cell to match the search value
  • xlPart – Searches within a cell for the search string

This code example will locate the first cell containing the text “light”. With Lookat:=xlPart, it will return a match for “Light & Heat”.

Sub TestLookAt()
Dim MyRange As Range
Set MyRange = Sheets("Sheet1").UsedRange.Find("light", Lookat:=xlPart)
If Not MyRange Is Nothing Then
    MsgBox MyRange.Address
  Else
    MsgBox "Not found"  
End If
End Sub

If xlWhole was set, a match would only return if the cell value was “light”.

SearchOrder Parameter

The SearchOrder parameter dictates how the search will be carried out throughout the range.

  • xlRows – Search is done row by row
  • xlColumns – Search is done column by column
Sub TestSearchOrder()
Dim MyRange As Range
Set MyRange = Sheets("Sheet1").UsedRange.Find("employee", SearchOrder:=xlColumns)
If Not MyRange Is Nothing Then
    MsgBox MyRange.Address
Else
    MsgBox "Not found"
End If
End Sub

This influences which match will be found first.

Using the test data entered into the worksheet earlier, when the search order is columns, the located cell is A5.  When the search order parameter is changed to xlRows, the located cell is C4

This is important if you have duplicate values within the search range and you want to find the first instance under a particular column name.

SearchDirection Parameter

The SearchDirection parameter dictates which direction the search will go in – effectively forward or backwards.

  • xlNext – Search for next matching value in range
  • xlPrevious – Search for previous matching value in range

Again, if there are duplicate values within the search range, it can have an effect on which one is found first.

Sub TestSearchDirection()
Dim MyRange As Range

Set MyRange = Sheets("Sheet1").UsedRange.Find("heat", SearchDirection:=xlPrevious)
If Not MyRange Is Nothing Then
    MsgBox MyRange.Address
Else
    MsgBox "Not found"
End If
End Sub

Using this code on the test data, a search direction of xlPrevious will return a location of C9.  Using the xlNext parameter will return a location of A4.

The Next parameter means that the search will begin in the top left-hand corner of the search range and work downwards. The Previous parameter means that the search will start in the bottom right-hand corner of the search range and work upwards.

MatchByte Parameter

The MatchBye parameter is only used for languages which use a double byte to represent each character, such as Chinese, Russian, and Japanese.

If this parameter is set to ‘True’ then Find will only match double-byte characters with double-byte characters.  If the parameter is set to ‘False’, then a double-byte character will match with single or double-byte characters.

SearchFormat Parameter

The SearchFormat parameter enables you to search for matching cell formats. This could be a particular font being used, or a bold font, or a text color.  Before you use this parameter, you must set the format required for the search using the Application.FindFormat property.

Here is an example of how to use it:

Sub TestSearchFormat()
Dim MyRange As Range

Application.FindFormat.Clear
Application.FindFormat.Font.Bold = True
Set MyRange = Sheets("Sheet1").UsedRange.Find("heat", Searchformat:=True)
If Not MyRange Is Nothing Then
    MsgBox MyRange.Address
Else
    MsgBox "Not found"
End If
Application.FindFormat.Clear
End Sub

In this example, the FindFormat property is set to look for a bold font. The Find statement then searches for the word ‘heat’ setting the SearchFormat parameter to True so that it will only return an instance of that text if the font is bold.

In the sample worksheet data shown earlier, this will return A9, which is the only cell containing the word ‘heat’ in a bold font.

Make sure that the FindFormat property is cleared at the end of the code.  If you do not your next search will still take this into account and return incorrect results.

Where you use a SearchFormat parameter, you can also use a wildcard (*) as the search value.  In this case it will search for any value with a bold font:

Set MyRange = Sheets("Sheet1").UsedRange.Find("*", Searchformat:=True)

Using Multiple Parameters

All the search parameters discussed here can be used in combination with each other if required.

For example, you could combine the ‘LookIn’ parameter with the ‘MatchCase’ parameter so that you look at the whole of the cell text, but it is case-sensitive

Sub TestMultipleParameters()
Dim MyRange As Range
Set MyRange = Sheets("Sheet1").UsedRange.Find("Light & Heat", LookAt:=xlWhole, MatchCase:=True)
If Not MyRange Is Nothing Then
    MsgBox MyRange.Address
Else
    MsgBox "Not found"
End If
End Sub

In this example, the code will return A4, but if we only used a part of the text e.g. ‘heat’, nothing would be found because we are matching on the whole of the cell value.  Also, it would fail due to the case not matching.

Set MyRange = Sheets("Sheet1").UsedRange.Find("heat", LookAt:=xlWhole, MatchCase:=True)

Replace in Excel VBA

There is, as you may expect, a Replace function in Excel VBA, which works in a very similar way to ‘Find’ but replaces the values at the cell location found with a new value.

These are the parameters that you can use in a Replace method statement.  These operate in exactly the same way as for the Find method statement.  The only difference to ‘Find’ is that you need to specify a Replacement parameter.

Name Type Description Values
What Required The value to search for Any data type such as a string or numeric
Replacement Required The replacement string. Any data type such as a string or numeric
LookAt Optional Match part or the whole of a cell xlPart or xlWhole
SearchOrder Optional The order to search in – Rows or Columns xlByRows or xlByColumns
MatchCase Optional Search is case sensitive or not True or False
MatchByte Optional Used only if you have installed double byte language support True or False
SearchFormat Optional Allow searching by format of cell True or False
ReplaceFormat Optional The replace format for the method. True or False

 

The Replace Format parameter searches for a cell with a particular format e.g. bold in the same way the SearchFormat parameter operates in the Find method. You need to set the Application.FindFormat property first, as shown in the Find example code shown earlier 

Replace Without Optional Parameters

At its simplest, you only need to specify what you are searching for and what you want to replace it with.

Sub TestReplace()
Sheets("Sheet1").UsedRange.Replace What:="Light & Heat", Replacement:="L & H"
End Sub

Note that the Find method will only return the first instance of the matched value, whereas the Replace method works through the entire range specified and replaces everything that it finds a match on.

The replacement code shown here will replace every instance of ‘Light & Heat’ with ‘L & H’ through the entire range of cells defined by the UsedRange object

Using VBA to Find or Replace Text Within a VBA Text String

The above examples work great when using VBA to interact with Excel data. However, to interact with VBA strings, you can use built-in VBA Functions like INSTR and REPLACE.

You can use the INSTR Function to locate a string of text within a longer string.

Sub TestInstr()
MsgBox InStr("This is MyText string", "MyText")
End Sub

This example code will return the value of 9, which is the number position where ‘MyText’ is found in the string to be searched.

Note that it is case sensitive. If ‘MyText’ is all lower case, then a value of 0 will be returned which means that the search string was not found. Below we will discuss how to disable case-sensitivity.

INSTR – Start

There are two further optional parameters available.  You can specify the start point for the search:

MsgBox InStr(9, "This is MyText string", "MyText")

The start point is specified as 9 so it will still return 9.  If the start point was 10, then it would return 0 (no match) as the start point would be too far forward.

INSTR – Case Sensitivity

You can also set a Compare parameter to vbBinaryCompare or vbTextCompare. If you set this parameter, the statement must have a start parameter value.

  • vbBinaryCompare – Case-sensitive (Default)
  • vbTextCompare – Not Case-sensitive
MsgBox InStr(1, "This is MyText string", "mytext", vbTextCompare)

This statement will still return 9, even though the search text is in lower case.

To disable case-sensitivity you can also declare Option Compare Text at the top of your code module.

VBA Replace Function

If you wish to replace characters in a string with different text within your code, then the Replace method is ideal for this:

Sub TestReplace()
MsgBox Replace("This is MyText string", "MyText", "My Text")
End Sub

This code replaces ‘MyText’ with ‘My Text’.  Note that the search string is case sensitive as a binary compare is the default.

You can also add other optional parameters:

  • Start – defines position in the initial string that the replacement has to start from. Unlike in the Find method, it returns a truncated string starting from the character number defined by the Start parameter.
  • Count – defines the number of replacements to be made.  By default, Replace will change every instance of the search text found, but you can limit this to a single replacement by setting the Count parameter to 1
  • Compare – as in the Find method you can specify a binary search or a text search using vbBinaryCompare or vbTextCompare.  Binary is case sensitive and text is non case sensitive
MsgBox Replace("This is MyText string (mytext)", "MyText", "My Text", 9, 1, vbTextCompare)

This code returns ‘My Text string (mytext)’. This is because the start point given is 9, so the new returned string starts at character 9.   Only the first ‘MyText’ has been changed because the Count parameter is set to 1.

The Replace method is ideal for solving problems like peoples’ names containing apostrophes e.g. O’Flynn. If you are using single quotes to define a string value and there is an apostrophe, this will cause an error because the code will interpret the apostrophe as the end of the string and will not recognize the remainder of the string.

You can use the Replace method to replace the apostrophe with nothing, removing it completely.