
Tips.Net > ExcelTips Home > Find and Replace > Wildcards in 'Replace With' Text
Summary: When doing searches in Excel, you can use wildcard characters in the specification of what you are searching. However, you cannot use them in the replacement text. This tip examines ways you can work around this limitation and use wildcards in your replacements. (This tip works with Microsoft Excel 97, Excel 2000, Excel 2002, Excel 2003, and Excel 2007.)
Anne-Mie realizes that she can use wildcards (*?) to search in Excel, but she wonders if she can use wildcards in the replace string. For instance, she would like to search for "ab*de" and replace it with "aa*de", where the asterisk represents any number of characters, or none at all.
The short answer is that there is no way to do this in Excel, as described. If you only wanted to convert the second character of a text value from "b" to "a", then that can be done rather easily:
=REPLACE(A1,2,1,"a")
This, however, is probably not what you want to do; you want a way to use wildcards in the "replace with" text. The technical term for doing such string replacements is called REGEX, which is short for Regular Expressions. REGEX started with languages like Perl but was so powerful that many other programming languages added it on.
The VBA used in Excel is no exception. REGEX was added to Visual Basic 6.0, which means that it made its way to Excel's VBA in Excel 2003. The first step in using REGEX is to turn it on. You do this in the VBA Editor by choosing Tools | References and then making sure there is a check mark next to the Microsoft VBScript Regular Expressions 5.5 option.
Enabling this reference allows you to create REGEX objects. These objects possess a Test method and a Pattern property. This means that you set the Pattern property, and then the Test method checks to see if the pattern exists. A REGEX object also has a Replace method, which is used to do replacements.
Before proceeding, it is important to understand that regular expressions can get very complex and, well, "geeky." There is no way around it; how to work with regular expressions has been the subject of entire books. Fortunately, for the purposes of this tip, the expressions are rather simple in nature. In this case we'll use the pattern "^ab.*de$". This pattern refers to a word that starts (indicated by the ^) with "ab" followed by an arbitrary expression (indicated by *) consisting of at least one character (indicated by the period) and ending (indicated by the $) with "de".
Here is the code that implements the use of the REGEX object to do the actual replacements.
Public Function SearchNReplace1(Pattern1 As String, _
Pattern2 As String, Replacestring As String, _
TestString As String)
Dim reg As New RegExp
reg.IgnoreCase = True
reg.MultiLine = False
reg.Pattern = Pattern1
If reg.Test(TestString) Then
reg.Pattern = Pattern2
SearchNReplace = reg.Replace(TestString, ReplaceString)
Else
SearchNReplace = TestString
End If
End Function
To use this macro, start with the strings you want to change in column A. Assuming that the first string is in cell A1, you could place the following into another cell in order to get the changed text:
=SearchNReplace1("^ab.*de$","^ab","aa",A1)
This tells the macro that the pattern you want to look for is "^ab.*de$" (the first parameter), and that you want to replace "^ab" with "aa". This formula can be pasted down the column, and you end up with a conversion of column A where the string "ab*de" is replaced by "aa*de".
If you are using an older version of Excel that does not allow you to create REGEX objects, or if you would prefer not to do so, then you can create a macro that will simply step through a group of selected cells and look for any cell that begins with "ab" and ends with "de", and then replaces the beginning part with "aa".
Sub SearchNReplace2()
Dim sFindInitial As String
Dim sReplaceInitial As String
Dim iLenInitial As Integer
Dim sFindFinal As String
Dim sReplaceFinal As String
Dim iLenFinal As Integer
Dim sTemp As String
Dim rCell As Range
sFindInitial = "ab"
sReplaceInitial = "aa"
sFindFinal = "de"
sReplaceFinal = "de"
For Each rCell In Selection
sTemp = rCell.Value
iLenInitial = Len(sFindInitial)
iLenFinal = Len(sFindFinal)
If Left(sTemp, iLenInitial) = sFindInitial And _
Right(sTemp, iLenFinal) = sFindFinal Then
sTemp = Mid(sTemp, iLenInitial + 1)
sTemp = Left(sTemp, Len(sTemp) - iLenFinal)
sTemp = sReplaceInitial & sTemp & sReplaceFinal
rCell.Value = sTemp
End If
Next
Set rCell = Nothing
End Sub
To use this routine, simply select the cells you want to change, and then execute the macro. You should also make changes to the sFindInitial, sReplaceInitial, sFindFinal, and sReplaceFinal variables, as needed.
Tip #3303 applies to Microsoft Excel versions: 97 2000 2002 2003 2007
PivotTables Got You Perplexed? ExcelTips: PivotTables for the Faint of Heart shows how you can start using Excel's PivotTable tool right away to spin your data into gold! You discover how easy it really is to crunch the numbers you need to crunch. Uncover the power of the PivotTable Wizard, how to edit PivotTables, how to format them, how to customize them, and much more.
Check out ExcelTips: PivotTables for the Faint of Heart today!
Want to make Excel do even more? The way is easy when you know how to use macros. This great e-book makes it easy. (more information...)
Ask an Excel Question
Make a Comment
ExcelTips FAQ
ExcelTips Premium
Beauty Tips
Bugs and Pests Tips
Car Tips
Cleaning Tips
College Tips
Cooking Tips
Excel2007 Tips
ExcelTips
Family Tips
Gardening Tips
Health Tips
Home Tips
Money Tips
Organizing Tips
Pet Tips
Word2007 Tips
WordTips
Advertise on the
ExcelTips Site