Table of contents
在本教程中,我们将研究几种查找和替换多个单词、字符串或单个字符的方法,因此你可以选择最适合你需要的方法。
人们通常是如何在Excel中进行搜索的呢? 大多数情况下,通过使用查找&替换功能,这对单个数值来说效果很好。 但是,如果你有几十甚至几百个项目需要替换呢? 当然,没有人愿意一个一个地手动进行所有这些替换,然后在数据发生变化时再重新做一遍。 幸运的是,有一些更有效的方法可以在Excel中进行大规模替换,并且我们将详细调查它们中的每一个。
用嵌套的SUBSTITUTE查找和替换多个值
在Excel中查找和替换多个条目的最简单方法是使用SUBSTITUTE函数。
这个公式的逻辑非常简单:你写几个单独的函数,用一个新的值替换一个旧的值。 然后,你把这些函数一个一个嵌套起来,这样,每一个后续的SUBSTITUTE都使用前一个SUBSTITUTE的输出来寻找下一个值。
替换(替换(替换)) 文本 , old_text1 , new_text1 ), old_text2 , new_text2 ), old_text3 , new_text3 )在A2:A10的地点列表中,假设你想替换缩写的国家名称(如 共和国 , 英国 和 美国 )的全名。
要做到这一点,在D2:D4中输入旧值,在E2:E4中输入新值,如下图所示。 然后,在B2中输入以下公式并按回车键。
=substitute(substitute(a2:a10, d2, e2), d3, e3), d4, e4)
......你将一次性完成所有的替换。
请注意,上述方法只适用于 Excel 365 支持动态数组。
在Excel 2019、Excel 2016和更早的动态版本中,需要为最上面的单元格(B2)编写公式,然后再复制到下面的单元格。
=替代(替代(a2, $d$2, $e$2), $d$3, $e$3), $d$4, $e$4)
请注意,在这种情况下,我们用绝对的单元格引用来锁定替换值,所以当向下复制公式时,它们不会移动。
注意:SUBSTITUTE函数是 区分大小写 ,这意味着你应该输入旧的值( 旧文本 )的字母大小写与它们在原始数据中出现的相同。
虽然可能很简单,但这种方法有一个明显的缺点--当你有几十个项目要替换时,嵌套函数变得相当难以管理。
优势 :易于实施;支持所有Excel版本
缺点 :最好用于有限数量的查找/替换值
用XLOOKUP搜索和替换多个条目
在你想更换的情况下 整个细胞的内容 ,而不是它的一部分,XLOOKUP功能就会派上用场。
假设你在A列有一个国家列表,目的是用相应的全名替换所有的缩写。 像前面的例子一样,你先在不同的列(D和E)输入 "查找 "和 "替换 "项目,然后在B2中输入这个公式。
=xlookup(a2, $d$2:$d$4, $e$2:$e$4, a2)
从Excel语言翻译成人类语言,下面是这个公式的作用。
在D2:D4(lookup_array)中搜索A2的值(lookup_value),并从E2:E4(return_array)中返回一个匹配的值。 如果没有找到,则从A2中提取原始值。
双击填充柄,让公式复制到下面的单元格中,结果不会让你等待。
由于XLOOKUP函数仅在Excel 365中可用,上述公式在早期版本中无法使用。 然而,你可以用IFERROR或IFNA和VLOOKUP的组合轻松地模仿这种行为。
=ifna(vlookup(a2, $d$2:$e$4, 2, false), a2)
注意:与SUBSTITUTE不同,XLOOKUP和VLOOKUP函数是 不区分大小写 ,这意味着它们搜索的查找值忽略了字母的大小写。 例如,我们的公式将同时取代 共和国 和 冯小刚 与 法国 .
优势 异常使用常用函数;可在所有Excel版本中使用
缺点 :在单元格层面上工作,不能取代单元格的部分内容。
使用递归LAMBDA函数进行多次替换
对于微软365的用户,Excel提供了一个特殊的功能,可以使用传统的公式语言创建自定义函数。 是的,我说的是LAMBDA。 这种方法的好处是,它可以将一个非常冗长和复杂的公式转换成一个非常紧凑和简单的公式。 此外,它可以让你创建自己的函数,而这些函数在Excel中并不存在,这是以前只有通过VBA才能实现。
关于创建和使用自定义LAMBDA函数的详细信息,请查看本教程:如何在Excel中编写LAMBDA函数。 这里,我们将讨论几个实际的例子。
优势 :结果是一个优雅的、令人惊讶的简单使用的函数,无论替换对的数量如何
缺点 :仅在Excel 365中可用;针对工作簿,不能在不同的工作簿中重复使用
例1.一次搜索和替换多个单词/字符串
为了一次性替换多个单词或文本,我们创建了一个自定义的LAMBDA函数,名为 多重置换 ,它可以采取以下形式之一。
=LAMBDA(text, old, new, IF(old"", MultiReplace(SUBSTITUTE(text, old, new), OFFSET(old, 1, 0), OFFSET(new, 1, 0)), text)
或
=LAMBDA(text, old, new, IF(old="", text, MultiReplace(SUBSTITUTE(text, old, new), OFFSET(old, 1, 0), OFFSET(new, 1, 0)))))
两者都是调用自己的递归函数,区别只在于如何建立退出点。
在第一个公式中,IF函数检查是否 老 如果为 "true",则表示 多重置换 函数被调用。 如果是FALSE,函数返回 文本 它的当前形式和退出。
第二个公式使用相反的逻辑:如果 老 是空的(old=""),则返回 文本 并退出;否则调用 多重置换 .
最棘手的部分已经完成了!你要做的是命名为 多重置换 关于详细的指南,请看如何命名LAMBDA函数。
一旦函数得到一个名字,你就可以像其他内置函数一样使用它。
无论你选择两种公式中的哪一种,从终端用户的角度来看,其语法都是如此简单。
MultiReplace(text, old, new)在哪里?
- 文本 - 源数据
- 旧的 - 的值来寻找
- 新的 - 的值来代替
在前面的例子中,我们不仅要替换国家的缩写,还要替换州的缩写。 为此,输入缩写 ( 老 值)在D列中从D2开始,而全名( 新 值),从E2开始的E列中。
在B2中,进入多重替换功能。
=MultiReplace(A2:A10, D2, E2)
按回车键,享受结果 :)
这个公式如何运作
理解该公式的线索是理解递归。 这听起来很复杂,但原理很简单。 每一次迭代,一个递归函数都会解决一个大问题的一个小实例。 在我们的例子中,我们的 多重置换 函数在新旧两个值之间循环,每循环一次,就进行一次替换。
多重置换 (SUBSTITUTE(text, old, new), OFFSET(old, 1, 0), OFFSET(new, 1, 0))
与嵌套的SUBSTITUTE函数一样,前一个SUBSTITUTE的结果成为 案文 换句话说,在每一个后续的SUBSTITUTE调用中 多重置换 ,SUBSTITUTE函数处理的不是原始文本字符串,而是前一次调用的输出。
要处理所有在 老 列表,我们从最上面的单元格开始,并使用OFFSET函数在每次交互中向下移动1行。
OFFSET(old, 1, 0)
同样的做法是针对 新 列表。
OFFSET(new, 1, 0)
最关键的是要提供一个 出口点 它是在IF函数的帮助下完成的--如果 老 单元是空的,函数返回 文本 它目前的形式和出口。
=LAMBDA(text, old, new, IF(old="", text, MultiReplace(..))
或
=LAMBDA(text, old, new, IF(old"", MultiReplace(..), text))
例2.替换Excel中的多个字符
原则上来说, 多重置换 前面例子中讨论的函数也可以处理单个字符,前提是每个新旧字符被输入到一个单独的单元格中,就像上面截图中的缩写和全名一样。
如果你想在一个单元格中输入旧的字符,在另一个单元格中输入新的字符,或者直接在公式中输入这些字符,那么你可以创建另一个自定义函数,名为 替换字符 ,通过使用这些公式之一。
=LAMBDA(text, old_chars, new_chars, IF(old_chars"", ReplaceChars(SUBSTITUTE(text, LEFT(old_chars), LEFT(new_chars)), RIGHT(old_chars, LEN(old_chars)-1), RIGHT(new_chars, LEN(new_chars)-1), text)
或
=LAMBDA(text, old_chars, new_chars, IF(old_chars="", text, ReplaceChars(SUBSTITUTE(text, LEFT(old_chars), LEFT(new_chars)), RIGHT(old_chars, LEN(old_chars)-1) , RIGHT(new_chars, LEN(new_chars)-1))))
记得像往常一样在名称管理器中命名你的新Lambda函数。
而你的新的自定义函数已经可以使用了。
ReplaceChars(text, old_chars, new_chars)在哪里?
- 文本 - 原来的字符串
- 旧的 - 要搜索的字符
- 新的 - 的字符来代替
为了给它做一个实地测试,让我们做一件经常在导入的数据上进行的事情--用直引号和直撇号替换智能引号和智能撇号。
首先,我们在D2中输入智能引号和智能撇号,在E2中输入直引号和直撇号,为了提高可读性,用空格隔开这些字符。 (由于我们在两个单元格中使用相同的分隔符,它不会对结果产生任何影响--Excel只是用空格替换了一个空格。)
之后,我们在B2中输入这个公式。
=ReplaceChars(A2:A4, D2, E2)
并得到我们所寻找的确切结果。
也可以直接在公式中输入字符。 在我们的例子中,只要记得像这样 "重复 "直引号就可以了。
=ReplaceChars(A2:A4, "" " '", "" " '")
这个公式如何运作
ǞǞǞ 替换字符 函数循环浏览 旧字符 和 新字符 这一部分是由SUBSTITUTE函数完成的。
SUBSTITUTE(text, LEFT(old_chars), LEFT(new_chars)
每一次迭代,RIGHT函数都会从两边的左边剥去一个字符。 旧字符 和 新字符 字符串,这样LEFT就可以取到下一对字符进行替换。
ReplaceChars(SUBSTITUTE(text, LEFT(old_chars), LEFT(new_chars)), RIGHT(old_chars, LEN(old_chars)-1) , RIGHT(new_chars, LEN(new_chars)-1)
在每次递归调用之前,IF函数会评估 旧字符 如果它不是空的,函数就会调用自己。 一旦最后一个字符被替换,迭代过程就结束了,公式返回 文本 它目前的形式和出口。
注意,因为我们的核心公式中使用的SUBSTITUTE函数是 区分大小写 ,两个Lambdas ( 多重置换 和 替换字符 )将大写字母和小写字母视为不同的字符。
用UDF进行大规模查找和替换
如果你的Excel中没有LAMBDA函数,你可以使用VBA以传统的方式编写一个用户定义的函数来进行多重替换。
为了区分UDF和LAMBDA定义的 多重置换 函数,我们将以不同的方式来命名它,例如 替换 该函数的代码如下。
Function MassReplace(InputRng As Range, FindRng As Range, ReplaceRng As Range) As Variant () Dim arRes() As Variant '存储结果的数组 Dim arSearchReplace(), sTmp As String '存储查找/替换对的数组,临时字符串 Dim iFindCurRow, cntFindRows As Long 'SearchReplace数组的当前行的索引,行数 Dim iInputCurRow, iInputCurCol, cntInputRows。cntInputCols As Long '源范围内当前行的索引,源范围内当前列的索引,行数,列数 cntInputRows = InputRng.Rows.Count cntInputCols = InputRng.Columns.Count cntFindRows = FindRng.Rows.Count ReDim arRes(1至cntInputRows,1至cntInputCols) ReDim arSearchReplace(1至cntFindRows,1至2) ' 准备查找/替换对阵列 ForiFindCurRow = 1 To cntFindRows arSearchReplace(iFindCurRow, 1) = FindRng.Cells(iFindCurRow, 1).Value arSearchReplace(iFindCurRow, 2) = ReplaceRng.Cells(iFindCurRow, 1).Value Next '在源区进行搜索和替换 For iInputCurRow = 1 To cntInputRows For iInputCurCol = 1 To cntInputCols sTmp = InputRng.Cells(iInputCurRow, iInputCurCol).Value ' 替换每个单元中所有搜索/替换对For iFindCurRow = 1 To cntFindRows sTmp = Replace(sTmp, arSearchReplace(iFindCurRow, 1), arSearchReplace(iFindCurRow, 2)) Next arRes(iInputCurRow, iInputCurCol) = sTmp Next Next MassReplace = arRes End Function像LAMBDA定义的函数一样,UDFs是 整个工作簿 这意味着 替换 如果你不确定如何正确操作,请按照《如何在Excel中插入VBA代码》中描述的步骤操作。
一旦代码被添加到你的工作簿中,函数就会出现在公式智能感应中--只有函数的名称,没有参数!虽然,我相信记住语法没有什么大问题。
MassReplace(input_range, find_range, replace_range)在哪里?
- 输入_范围 - 你想替换数值的源范围。
- 查找范围 - 要搜索的字符、字符串或单词。
- 替换_范围 - 要替换的字符、字符串或单词。
在Excel 365中,由于支持动态数组,这可以作为一个正常的公式工作,只需要在顶部的单元格(B2)中输入。
=MassReplace(A2:A10, D2:D4, E2:E4)
在前动态Excel中,这就像一个老式的CSE数组公式:你选择整个源范围(B2:B10),输入公式,并同时按下Ctrl + Shift + Enter键来完成它。
优势 :在Excel 2019、Excel 2016和早期版本中,是自定义LAMBDA函数的一个体面的替代品
缺点 :该工作簿必须保存为支持宏的.xlsm文件
用VBA宏在Excel中批量替换
如果你喜欢用宏来自动化普通任务,那么你可以使用下面的VBA代码来查找和替换一个范围内的多个值。
Sub BulkReplace() Dim Rng As Range, SourceRng As Range, ReplaceRng As Range On Error Resume Next Set SourceRng = Application.InputBox("Source data:" , "Bulk Replace" , Application.Selection.Address, Type :=8) Err.Clear If Not SourceRng Is Nothing Then Set ReplaceRng = Application.InputBox(" Replace range:" , " Bulk Replace" , Type :=8) Err.Clear If Not ReplaceRng Is Nothing ThenApplication.ScreenUpdating = False For Each Rng In ReplaceRng.Columns(1).Cells SourceRng.Replace what:=Rng.Value, replacement:=Rng.Offset(0, 1).Value Next Application.ScreenUpdating = True End If End If End Sub为了立即使用该宏,你可以下载我们包含代码的样本工作簿。 或者你可以在你自己的工作簿中插入代码。
如何使用该宏
在运行宏之前,将新旧值输入到相邻的两列,如下图所示(C2:D4)。
然后,选择你的源数据,按Alt + F8 ,选择 批量替换 宏,并点击 运转 .
由于 愤怒的来源 是预选的,只需验证参考,然后点击确定。
之后,选择 更换范围 ,然后点击确定。
完成了!
优势 :设置一次,随时重复使用
缺点 :每次数据变化时都需要运行该宏
在Excel中使用子串工具进行多次查找和替换
在第一个例子中,我提到嵌套式SUBSTITUTE是在Excel中替换多个数值的最简单方法。 我承认我错了。 我们的终极套件使事情变得更加简单
要在你的工作表中进行大规模替换,请前往 阿博比特数据 选项卡,并点击 子串工具 > 替换子字符串 .
ǞǞǞ 替换子字符串 对话框将出现,要求你定义 来源 范围和 子字符串 范围。
选定这两个范围后,点击 替换 是的,就是这么简单!
提示:在点击 替换 但有一件重要的事情需要你考虑 -- 区分大小写 如果你希望将大写字母和小写字母作为不同的字符来处理,请务必选择它。 在这个例子中,我们勾选这个选项,因为我们只想替换大写的字符串,而保留其他单词中的子字符串,如 "fr"、"uk "或 "ak"。
如果你想知道还可以对字符串进行哪些批量操作,请查看我们的终极套件中包含的其他子串工具。 或者更好的是,下载下面的评估版,试一试吧!
这就是如何在Excel中一次找到并替换多个单词和字符的方法。 感谢你的阅读,希望下周能在我们的博客上看到你。
可用的下载
在Excel(.xlsm文件)中进行多次查找和替换
终极套房14天全功能版(.exe文件)