Table of contents
本教程将教你如何通过使用本地公式和自定义函数在Excel中分离文本和数字。 你还将学习如何将文本和数字分成两个独立的列。
想象一下:你收到用于分析的原始数据,发现数字与文字混杂在一列中。 在大多数情况下,将它们放在不同的列中进行仔细检查肯定会更方便。
如果你处理的是同质数据,你可能会使用LEFT、RIGHT和MID函数从同一位置提取相同数量的字符。 但这是实验室测试的理想情况。 在现实生活中,你很可能会处理不同的数据,即数字出现在文本之前、文本之后或文本之间。 下面的例子正是提供了这方面的解决方案案。
如何删除Excel单元格中的文字并保留数字
该解决方案可在Excel 365、Excel 2021和Excel 2019中使用。
Microsoft Excel 2019引入了一些早期版本中没有的新函数,我们将使用其中一个函数,即TEXTJOIN,从包含数字的单元格中剥离文本字符。
通用公式是:。
textjoin("", true, iferror(mid( 电池 , ROW(INDIRECT( "1:"&LEN( 电池 ))), 1) *1, ""))在Excel 365和2021年,这个也能用。
textjoin("", true, iferror(mid( 电池 , 序列(len( 电池 )), 1) *1, ""))乍一看,公式可能看起来有点吓人,但它们确实有效 :)
例如,要从A2中的数字中删除文本,可在B2中输入以下公式之一,然后根据需要向下复制到多个单元格。
在Excel 365 - 2019年。
=TEXTJOIN("", TRUE, IFERROR(MID(A2, ROW(INDIRECT( "1:"&LEN(A2))), 1) *1, "")
在Excel 2019中,它必须作为一个数组公式用Ctrl + Shift + Enter输入。 在动态数组Excel中,它作为一个普通公式用Enter键完成。
在Excel 365和2021年。
=textjoin("", true, iferror(mid(a2, sequence(len(a2)), 1) *1, "")
其结果是,所有文本字符被从单元格中删除,数字被保留。
这个公式如何运作。
为了更好地理解这个逻辑,让我们开始从内部调查这个公式。
你可以使用ROW(INDIRECT("1:"&LEN(string))或SEQUENCE(LEN(string))来创建一个与源字符串中的总字符数相对应的数字序列,然后将这些序列数字作为起始数字输入MID函数。 在B2中,公式的这一部分看起来如下。
mid(a2, {1;2;3;4;5;6;7;8;9;10;11;12;13;14;15}, 1)
MID函数从A2中提取每个字符,从第一个字符开始,并将它们作为一个数组返回。
{"2";"1";"0";" ";"S";"u";"n";"s";"e";"t";" ";"R";"o";"a";"d"}
这个数组被乘以1,数字值没有变化,而乘以一个非数字字符会导致#VALUE!错误。
{2;1;0;#值!#值!#值!#值!#值!#值!#值!#值!#值!#值!}。
IFERROR函数处理这些错误并将其替换为空字符串。
{2;1;0;"";"";"";"";"";"";"";"";"";"";"";""}
这个最终的数组被提供给TEXTJOIN函数,该函数将数组中的非空值连接起来( 忽略空 参数设置为TRUE),使用空字符串("")作为分隔符。
TEXTJOIN("", TRUE, {2;1;0;"";"";"";"";"";"";"";"";"";"";"";""})
提示:对于Excel 2016 - 2007,也存在一个解决方案,但公式要复杂得多。 你可以在这个教程中找到它:如何在Excel中提取数字。
从数字中删除文本的自定义函数
该解决方案适用于所有Excel版本
如果你使用的是旧版本的Excel,或者觉得上述公式太难记,那么没有什么能阻止你用更简单的语法和用户友好的名称来创建自己的函数,比如说 移除文本 用户定义的函数(UDF)可以用两种方式编写。
VBA代码 1:
在这里,我们逐一查看源字符串中的每个字符,并检查它是否是数字。 如果是数字,该字符将被添加到结果字符串中。
Function RemoveText(str As String ) Dim sRes As String sRes = "" For i = 1 To Len(str) If True = IsNumeric(Mid(str, i, 1)) Then sRes = sRes & Mid(str, i, 1) End If Next i RemoveText = sRes End FunctionVBA代码 2:
该代码创建了一个处理正则表达式的对象。 使用正则表达式,我们从源字符串中删除除数字0-9以外的所有字符。
Function RemoveText(str As String ) As String With CreateObject ( "VBScript.RegExp" ) .Global = True .Pattern = "[^0-9]" RemoveText = .Replace(str, "" ) End With End Function在小的工作表上,这两段代码都会有同样的表现。 在大的工作表上,函数被调用数百次或数千次,使用VBScript.RegExp的代码2会更快。
在工作簿中插入代码的详细步骤可以在这里找到:如何在Excel中插入VBA代码。
无论你选择哪种方法,从终端用户的角度来看,删除文本和留下数字的功能都是如此简单。
RemoveText(string)例如,要从A2单元格中删除非数字字符,B2中的公式是:。
=RemoveText(A2)
只要把它复制到这一栏,你就会得到这样的结果。
注意:本地公式和自定义函数都输出一个 数字字符串 要把它变成一个数字,可以把结果乘以1,或者加零,或者用VALUE函数包住公式。 例如::
=RemoveText(A2) + 0
=VALUE(RemoveText(A2))
如何在Excel中删除文本字符串中的数字
该解决方案可在Excel 365、Excel 2021和Excel 2019中使用。
从字母数字字符串中删除数字的公式与前面例子中讨论的公式基本相似。
对于Excel 365 - 2019年。
textjoin("", true, if(iserr(mid( 电池 , ROW(INDIRECT( "1:"&LEN( 电池 )), 1)*1), mid( 电池 , ROW(INDIRECT("1:"&LEN( 电池 ))), 1), ""))在Excel 2019中,记得要把它作为一个 阵列公式 通过同时按Ctrl + Shift + Enter键。
适用于Excel 365和2021年。
textjoin("", true, if(iserror(mid( 电池 , 序列(len( 电池 1)*1),MID( 电池 , 序列(len( 电池 )), 1), ""))例如,要从A2中的字符串中剥离数字,公式为:。
=TEXTJOIN("", TRUE, IF(ISERR(MID(A2, ROW(INDIRECT( "1:"&LEN(A2)), 1) *1), MID(A2, ROW(INDIRECT("1:"&LEN(A2)), 1), ""))
或
=textjoin("", true, if(iserror(mid(a2, sequence(len(a2)), 1) *1), mid(a2, sequence(len(a2)), 1), " ")
其结果是,所有数字都从单元格中被删除,而文本字符被保留。
如上面的截图所示,该公式将数字字符从字符串的任何位置剥离:开头、结尾和中间。 然而,有一个注意事项:如果一个字符串 以数字开头,后面是空格 ,该空格被保留,这就产生了一个前导空格的问题(如B2中)。
为了摆脱多余的 文本前的空格 ,用TRIM函数包住这个公式,像这样。
=trim(textjoin("", true, if(iserror(mid(a2, sequence(len(a2)), 1) *1), mid(a2, sequence(len(a2)), 1), "" ))
现在,你的结果绝对是完美的!
这个公式如何运作。
实质上,该公式的工作原理与前面的例子中解释的一样。 不同的是,从最后的数组送达TEXTJOIN函数,你需要删除数字,而不是文本。 为了让它完成,我们使用IF和ISERROR函数的组合。
正如你所记得的,MID(...)+0生成一个数字数组和代表相同位置的文本字符的#VALUE!错误。
{2;1;0;#值!#值!#值!#值!#值!#值!#值!#值!#值!#值!}。
ISERROR函数抓取错误,并将产生的布尔值数组传递给IF。
{false;false;false;true;true;true;true;true;true;true;true;true;true;true;true}。
当IF函数看到TRUE(一个错误)时,它在另一个MID函数的帮助下将相应的文本字符插入被处理的数组中。 当IF函数看到FALSE(一个数字)时,它用一个空字符串替换。
这个最终的数组被传递给TEXTJOIN,所以它将文本字符连接起来并输出结果。
从文本中删除数字的自定义函数
该解决方案适用于所有Excel版本
考虑到一个强大的公式应该保持简单,我将分享用户定义的函数(UDF)的代码,以剥去任何数字字符。
VBA代码 1:
Function RemoveNumbers(str As String ) Dim sRes As String sRes = "" For i = 1 To Len(str) If False = IsNumeric(Mid(str, i, 1)) Then sRes = sRes & Mid(str, i, 1) End If Next i RemoveNumbers = sRes End FunctionVBA代码 2:
Function RemoveNumbers(str As String ) As String With CreateObject ( "VBScript.RegExp" ) .Global = True .Pattern = "[0-9]" RemoveNumbers2 = .Replace(str, "" ) End With End Function与RemoveText函数的情况一样,第二段代码最好用在大型工作表中,以优化性能。
一旦代码被添加到你的工作簿中,你就可以使用这个自定义函数从一个单元格中删除所有的数字字符。
RemoveNumbers(string)在我们的案例中,B2中的公式是。
=RemoveNumbers(A2)
如果要修剪前面的空格,请像对待本地公式一样,将自定义函数嵌套在TRIM中。
=TRIM(RemoveNumbers(A2))
将数字和文本分割成不同的列
在你想把文本和数字分成两列的情况下,如果能用一个公式完成工作就更好了,同意吗? 为此,我们只需合并以下代码 移除文本 和 删除数字 的函数合并为一个函数,名为 分割文本数字 ,或者干脆 分割 ,或任何你喜欢的 :)
VBA代码 1:
Function SplitTextNumbers(str As String , is_remove_text As Boolean ) As String Dim sNum, sText, sChar As String sCurChar = sNum = sText = "" For i = 1 To Len(str) sCurChar = Mid(str, i, 1) If True = IsNumeric(sCurChar) Then sNum = sNum & sCurChar Else sText = sText & sCurChar End If Next i If True = is_remove_text Then SplitTextNumbers = sNum Else SplitTextNumbers = sText End If 结束职能VBA代码 2:
Function SplitTextNumbers(str As String , is_remove_text As Boolean ) As String With CreateObject ( "VBScript.RegExp" ) .Global = True If True = is_remove_text Then .Pattern = "[^0-9]" Else .Pattern = "[0-9]" End If SplitTextNumbers = .Replace(str, "" ) End With 结束 Function我们的新自定义函数需要两个参数。
SplitTextNumbers(string, is_remove_text)在哪里? is_remove_text 是一个布尔值,表示要剥离哪些字符。
- TRUE或1 - 移除文本并保留数字
- FALSE或0 - 删除数字并保留文本
对于我们的样本数据集,公式采取这种形式。
要删除非数字字符。
=SplitTextNumbers(A2, TRUE)
要删除数字字符。
=SplitTextNumbers(A2, FALSE)
提示:为了避免可能出现的前导空格问题,我建议在TRIM函数中总是包裹删除数字的公式。
=TRIM(SplitTextNumbers(A2, FALSE))
移除数字或文字的特殊工具
对于那些不喜欢把事情不必要地复杂化的人,我将展示我们自己在Excel中删除文本或数字的方法。
假设我们的终极套件被添加到你的Excel功能区,这就是你要做的。
- 关于 阿博比特数据 选项卡,在 文本 组,点击 移除 > 移除字符 .
提示:如果结果中包含一些领先的空格,修剪空格工具将立即消除它们。
这就是如何在Excel中删除字符串中的文本或数字字符。 感谢你的阅读,期待下周在我们的博客上见到你
可用的下载
在Excel中删除文本或数字--实例(.xlsm文件)
终极套房 - 试用版 (.exe文件)