Anne-Mie意识到可以在Excel中使用通配符(?)进行搜索,但是她想知道是否可以在替换字符串中使用通配符。例如,她想搜索“ abde”并将其替换为“ aa * de”,其中星号表示任意数量的字符,或根本不表示任何字符。

简短的答案是,如上所述,无法在Excel中执行此操作。如果只想将文本值的第二个字符从“ b”转换为“ a”,则可以很容易地做到这一点:

=REPLACE(A1,2,1,"a")

但是,这可能不是您想要的。您想要一种在“替换为”文本中使用通配符的方法。进行此类字符串替换的技术术语称为REGEX,它是_Regular Expressions的缩写。REGEX始于Perl之类的语言,但功能如此强大,以至于许多其他编程语言都添加了它。

Excel中使用的VBA也不例外。 REGEX已添加到Visual Basic 6.0中,这意味着它已在Excel 2003中进入Excel的VBA。使用REGEX的第一步是将其打开。您可以通过在VBA编辑器中选择“工具” |“创建”来执行此操作。单击引用,然后确保在Microsoft VBScript正则表达式5.5选项旁边有一个复选标记。

启用此参考可以创建REGEX对象。这些对象具有Test方法和Pattern属性。这意味着您设置了Pattern属性,然后Test方法检查该模式是否存在。 REGEX对象还具有一个Replace方法,该方法用于进行替换。

在继续之前,重要的是要了解正则表达式会变得非常复杂,而且很“令人讨厌”。没有其他办法了;如何使用正则表达式一直是整本书的主题。幸运的是,出于本技巧的目的,这些表达式本质上非常简单。在这种情况下,我们将使用模式“ ^ ab.de $”。此模式指的是一个单词,该单词以“ ab”开头(由^表示),后跟任意表达式(由表示)

由至少一个字符(由句点表示)和以“ de”结尾(由$表示)组成。

这是实现使用REGEX对象进行实际替换的代码。

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

要使用此宏,请从要在A列中更改的字符串开始。假设第一个字符串位于单元格A1中,则可以将以下内容放入另一个单元格中,以获取更改后的文本:

=SearchNReplace1("^ab.*de$","^ab","aa",A1)

这告诉宏您要查找的模式是“ ^ ab。* de $”

(第一个参数),并且要将“ ^ ab”替换为“ aa”。

可以将该公式粘贴到该列的下方,最后得到A列的转换,其中字符串“ abde”被“ aade”替换。

如果您使用的旧版Excel不允许您创建REGEX对象,或者如果您不想这样做,则可以创建一个宏,该宏将单步执行一组选定的单元格并查找任何单元格以“ ab”开头,以“ de”结尾,然后以“ 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

若要使用此例程,只需选择要更改的单元格,然后执行宏。您还应根据需要对sFindInitial,sReplaceInitial,sFindFinal和sReplaceFinal变量进行更改。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(3303)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本:

链接:/ excelribbon-Wildcards_in_Replace_With_Text [“替换为”文本中的通配符”。