“替换为”文本中的通配符(Microsoft Excel)
Anne-Mie意识到可以在Excel中使用通配符(?)进行搜索,但是她想知道是否可以在替换字符串中使用通配符。例如,她想搜索“ abde”并将其替换为“ aa * de”,其中星号表示任意数量的字符,或根本不表示任何字符。
简短的答案是,如上所述,无法在Excel中执行此操作。如果只想将文本值的第二个字符从“ b”转换为“ a”,则可以很容易地做到这一点:
=REPLACE(A1,2,1,"a")
但是,这可能不是您想要的。您想要一种在“替换为”文本中使用通配符的方法。进行此类字符串替换的技术术语称为REGEX,它是_Regular Expressions的缩写。REGEX始于Perl之类的语言,但功能如此强大,以至于许多其他编程语言都添加了它。
Excel中使用的VBA也不例外。使用REGEX的第一步是将其打开。您可以通过在VBA编辑器中选择“工具” |“创建”来执行此操作。引用,然后确保在Microsoft VBScript正则表达式选项旁边有一个复选标记。如果参考的版本不止一个,请选择最新版本。
启用此参考可以创建REGEX对象。从技术上讲,您可以将其关闭,具体取决于您希望在宏中进行绑定的方式。讨论后期vs.
的优缺点早期绑定超出了本技巧的范围,因此,请继续并打开REGEX参考。
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 SearchNReplace1 = reg.Replace(TestString, ReplaceString) Else SearchNReplace1 = TestString End If End Function
要使用此宏,请从要在A列中更改的字符串开始。假设第一个字符串位于单元格A1中,则可以将以下内容放入另一个单元格中,以获取更改后的文本:
=SearchNReplace1("^ab.*de$","^ab","aa",A1)
这告诉宏您要查找的模式是“ ^ ab。* de $”
(第一个参数),并且要将“ ^ ab”替换为“ aa”。
可以将该公式粘贴到该列的下方,最后得到A列的转换,其中字符串“ abde”被“ aade”替换。
如果由于某种原因而不想在VBA中使用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培训的来源。
本技巧(11170)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。您可以在此处为Excel的较早菜单界面找到此技巧的版本:
链接:/ excel-Wildcards_in_Replace_With_Text [“替换为”文本中的通配符”。