Excel:从文本字符串中提取数字

  • Share This
Michael Brown

本教程展示了如何通过使用公式和提取工具从Excel中的各种文本字符串中提取数字。

当涉及到提取给定长度的文本字符串的一部分时,Excel提供了三个Substring函数(左、右和中)来快速处理该任务。 当涉及到从字母数字字符串中提取数字时,Microsoft Excel提供了......什么都没有。

要在Excel中从一个字符串中得到一个数字,需要一点聪明才智,一点耐心,以及一堆不同的函数相互嵌套。 或者,你可以运行提取工具,通过鼠标点击就可以完成工作。 下面你会发现这两种方法的全部细节。

    如何从文本字符串的末尾提取数字

    当你有一列字母数字字符串,其中数字在文本之后,你可以使用下面的公式来得到它。

    右图( 电池 , LEN( 电池 ) - max(if(isnumber(mid( 电池 , ROW(INDIRECT("1:"&LEN( 电池 )), 1) *1)=FALSE, ROW(INDIRECT("1:"& LEN( 电池 ))), 0)))

    我们将在稍后讨论该公式的逻辑。 现在,只需替换为 电池 的单元格(本例中为A2),并在同一行的任何空单元格(如B2)中输入该公式。

    =RIGHT(A2, LEN(A2) - MAX(IF(ISNUMBER(MID(A2, ROW(INDIRECT("1:"&LEN(A2)), 1) *1)=FALSE, ROW(INDIRECT("1:"&LEN(A2)), 0) ))

    这个公式只从结尾处获取数字,如果一个字符串在开头或中间也有数字,它们将被忽略。

    提取是通过属于文本函数类别的RIGHT函数进行的。 该函数的输出始终为 文本 在我们的案例中,结果是一个 数字子串 ,就Excel而言,这也是文本,而不是数字。

    如果你需要的结果是一个 (你可以在进一步的计算中使用),然后将公式包入VALUE函数中,或者执行不改变结果的算术运算,例如,乘以1或加上0。 要捕捉不包含单个数字的字符串中的错误,请使用IFERROR函数。 例如,。

    =IFERROR(VALUE(RIGHT(A2, LEN(A2) - MAX(IF(ISNUMBER(MID(A2, ROW(INDIRECT("1:"&LEN(A2)), 1)*1)=FALSE, ROW(INDIRECT("1:"&LEN(A2)), 0)))), "" )

    =IFERROR(RIGHT(A2, LEN(A2) - MAX(IF(ISNUMBER(MID(A2, ROW(INDIRECT("1:"&LEN(A2)), 1) *1)=FALSE, ROW(INDIRECT("1:"&LEN(A2)) ), 0)) +0, "")

    注意:在动态数组Excel(Office 365和2021)中,你以通常的方式用回车键输入公式。 在Excel 2019和更早的版本中,它只能作为数组公式使用,所以记得按Ctrl + Shift + Enter来完成它。

    这个公式如何运作。

    要从一个字母数字字符串中提取数字,首先要知道从哪里开始提取。 字符串中最后一个非数字字符的位置是在这个棘手的公式帮助下确定的。

    MAX(IF(ISNUMBER(MID(A2, ROW(INDIRECT("1:"&LEN(A2)), 1)*1)=FALSE, ROW(INDIRECT("1:"&LEN(A2)), 0)

    为了理解这个逻辑,让我们从内部调查一下。

    ROW(INDIRECT("1:"&LEN(A2))组合创建了一个与源字符串(A2)中的字符总数相对应的数字序列,我们将这些序列数字作为起始数字提供给MID。

    mid(a2, {1;2;3;4;5;6;7;8}, 1)

    MID函数从A2中提取每一个单独的字符,并作为一个数组返回。

    {"0";"5";"-";"E";"C";"-";"0";"1"}

    由于MID是一个文本函数,它的输出总是文本(你可以注意到,所有的字符都用引号括起来)。 为了把数字的1变成数字,我们把数组乘以1(双重否定-MID()会有同样的效果)。 这个操作的结果是一个数字数组和代表非数字字符的#VALUE!错误。

    isnumber({0;5;#value!;#value!;#value!;#value!;0;1})

    ISNUMBER函数对数组中的每个元素进行评估,并以布尔值的形式给出判断--数字为TRUE,其他为FALSE。

    {真;真;假;假;假;真;真}。

    这个数组进入IF函数的逻辑测试,数组中的每个元素都与FALSE进行比较。

    IF({TRUE;TRUE;FALSE;FALSE;FALSE;TRUE;TRUE}=FALSE, ROW(INDIRECT("1:"&LEN(A2)), 0)

    对于每个FALSE(非数字值),另一个ROW(INDIRECT())函数返回其在字符串中的相对位置。 对于每个TRUE(数字值),返回一个零。 所得数组看起来如下。

    {0;0;3;4;5;6;0;0}

    剩下的就很简单了。 MAX函数找到上述数组中最高的数字,也就是字符串中最后一个非数字值的位置(在我们的例子中是6)。 简单地说,从LEN返回的字符串总长度中减去这个位置,然后将结果传给RIGHT,让它知道要从字符串的右边提取多少个字符。

    右(a2, len(a2) - 6)

    完成了!

    如何从文本字符串的开头提取数字

    如果你正在处理数字后出现文本的记录,你可以通过使用这个通用公式从字符串的开头提取数字。

    LEFT( 电池 , match(false, isnumber(mid( 电池 , ROW(INDIRECT("1:"&LEN( 电池 )+1)), 1) *1), 0) -1)

    用A2中的原始字符串,用以下公式得到数字。

    =LEFT(A2, MATCH(FALSE, ISNUMBER(MID(A2, ROW(INDIRECT("1:"&LEN(A2)+1)), 1) *1, 0) -1)

    无论中间或末尾有多少个数字,都只提取起始数字。

    注意:在Excel 365和Excel 2021中,由于支持动态数组,普通公式可以正常工作。 在Excel 2019和更早的版本中,你应该按Ctrl + Shift + Enter来明确地使其成为一个 阵列公式 .

    这个公式如何运作。

    在这里,我们再次使用ROW、INDIRECT和LEN函数的组合来创建一个数字序列,等于源字符串中的字符总数加1(这个额外字符的作用稍后会变得清晰)。

    ROW(INDIRECT("1:"&LEN(A2)+1))

    MID和ISNUMBER的工作与前面的例子相同--MID提取单个字符,ISNUMBER将其转换为逻辑值。 由此产生的TRUE和FALSE数组作为一个查找数组进入MATCH函数。

    match(false, {true;true;false;false;false;false;true;true;false}, 0)

    MATCH计算了第一个FALSE的相对位置,给我们提供了字符串中第一个非数字字符的位置(A2中的3)。 为了提取前面的数字,我们从第一个文本字符的位置上减去1,并将差值送至 num_chars 的参数。

    LEFT(A2, 3-1)

    现在,回到由ROW(INDIRECT()+1))生成的序列中的一个 "额外 "字符。 正如你已经知道的,这个序列为MID函数提供了起点。 如果没有+1,MID将提取与原始字符串中完全相同的字符。 如果字符串只包含数字,ISNUMBER将只返回TRUE而MATCH需要至少一个FALSE。 为了确保这一点,我们添加一个更多的字符到字符串的总长度,MID函数会将其转换为一个空字符串。 例如,在B7中,MID返回这个阵列。

    {"1"; "2"; "3"; "4";""}

    注意:与RIGHT函数的情况一样,LEFT也返回一个 数字子串 要获得数字而非数字字符串的结果,请将该公式嵌套在VALUE函数中,或将结果乘以1,如第一个例子所示。

    如何从字符串的任何位置获取数字

    如果你的任务意味着要从一个字符串的任何地方提取数字,你可以利用MrExcel论坛上发表的以下令人费解的公式。

    =SUMPRODUCT(MID(0&A2, LARGE(INDEX(ISNUMBER(--MID(A2, ROW(INDIRECT("1:"&LEN(A2)), 1)) * ROW(INDIRECT("1:"&LEN(A2)), 0), ROW(INDIRECT("1:"&LEN(A2))))+1, 1) * 10^ROW(INDIRECT("1:"&LEN(A2)) )/10)

    其中A2是原始文本字符串。

    分解这个公式需要一篇单独的文章,所以你可以简单地把它复制到你的工作表中,以确保它真的有效 :)

    然而,在检查结果时,你可能会注意到一个无关紧要的缺点--如果源字符串不包含数字,公式会返回0,如上面截图中的第6行。 为了解决这个问题,你可以将公式包裹在IF语句中,其逻辑测试会检查源字符串是否包含任何数字。 如果包含,公式会提取数字,否则会返回一个空的字符串。

    =IF(SUM(LEN(A2)-LEN(SUBSTITUTE(A2, {"0","1","2","3","4","5","6","7","8","9"}, "")))>0, SUMPRODUCT(MID(0&A2, LARGE(INDEX(ISNUMBER(--MID(A2,ROW(INDIRECT("$1:$"&LEN(A2))),1))* ROW(INDIRECT("$1:$"&LEN(A2))),0), ROW(INDIRECT("$1:$"&LEN(A2))))+1,1) * 10^ROW(INDIRECT("$1:$"&LEN(A2)))/10),"")

    正如下面的截图所示,改进后的公式运行得非常好(这要归功于我们的Excel大师Alex的改进)。

    与之前所有的例子不同,这个公式的结果是 要确定这一点,只需注意B列中右对齐的数值和被截断的前导零。

    提示:在Excel 365 - Excel 2019中,借助TEXTJOIN函数有一个更简单的解决方案。 请参阅如何删除文本并保留数字。

    用Ultimate Suite从文本字符串中提取数字

    正如你刚才所看到的,没有一个琐碎的Excel公式可以从文本字符串中提取数字。 如果你在理解公式或为你的数据集调整公式方面有困难,你可能会喜欢这个简单的方法来从Excel的字符串中获取数字。

    使用我们的终极套件添加到你的Excel功能区,这就是你如何从任何字母数字字符串中快速检索数字。

    1. 转到 阿博比特数据 标签> 文本 组,并点击 萃取物 :

    2. 选择所有带有源字符串的单元格。
    3. 在提取工具的窗格中,选择 提取数字 单选按钮。
    4. 根据你希望结果是公式还是数值,选择 作为公式插入 框,或不加选择(默认)。

      我的建议是,如果你想让提取的数字在源字符串发生任何变化时自动更新,就选择这个框。 如果你想让结果独立于原始字符串(例如,如果你打算在以后删除源数据),那么就不要选择这个框。

    5. 点击 插入结果 按钮,完成

    就像前面的例子一样,提取的结果是 数字 也就是说,你可以自由地计算、求和、求平均,或用它们进行任何其他计算。

    在这个例子中,我们选择将结果插入为 价值 而且,该插件完全按照要求做了。

    如果 作为公式插入 复选框被选中,你会看到一个 公式 想知道是哪一个吗? 请下载Ultimate Suite的试用版,自己看看吧 :)

    可用的下载

    Excel提取号码--样本工作簿(.xlsx文件)

    终极套房 - 试用版 (.exe文件)

    Michael Brown is a dedicated technology enthusiast with a passion for simplifying complex processes using software tools. With more than a decade of experience in the tech industry, he has honed his skills in Microsoft Excel and Outlook, as well as Google Sheets and Docs. Michael's blog is dedicated to sharing his knowledge and expertise with others, providing easy-to-follow tips and tutorials for improving productivity and efficiency. Whether you're a seasoned professional or a beginner, Michael's blog offers valuable insights and practical advice for getting the most out of these essential software tools.