古香网 - 知识创造价值
热搜:
快讯
首页 /古香资讯 / 正文

Excel混合文本中数字怎么单独提取?

内容摘要

在Excel中混杂着文字和数字的情况下,可以使用原生函数、Power Query或者VBA来高效地提取出所有的数字,并不需要进行人工筛选或者是借助于第三方插件。对于不同的情况——比如数字出现在字符串的前面、后面或者是中间被其他字符夹住,或者是需要提取整个包含数字的部分而不仅

在Excel中混杂着文字和数字的情况下,可以使用原生函数、Power Query或者VBA来高效地提取出所有的数字,并不需要进行人工筛选或者是借助于第三方插件。对于不同的情况——比如数字出现在字符串的前面、后面或者是中间被其他字符夹住,或者是需要提取整个包含数字的部分而不仅仅是第一个连续的部分——Excel已经提供了成熟的并且得到了微软官方认可的方法:365版用户可以直接使用TEXTJOIN加MID加ISNUMBER这样的公式组合或者是REGEXP正则表达式;2007以及之后版本可以用SUMPRODUCT加MID的经典数组公式;Power Query利用它的“只提取数字”的功能实现无代码批量清理;VBA自定义函数给使用者以字符级别的控制权。以上各种方式都已经在诸如财务账本、工商注册号整理、物流单号分类等经常出现的工作场合里稳定工作了很长时间,并且有详细的参数说明和逻辑解释。

Excel混合文本中数字怎么单独提取?

对于数字固定在字符串首尾的情况,可以采用LOOKUP配合RIGHT或者LEFT的方式

本方案不需要使用数组来实现,可以适用于所有的Excel 2007及以上的版本之中,并且具有很高的执行速度和稳定的输出效果。比如要从一个单元格里取出最后一位数字的话,在目标单元格内输入如下公式:=LOOKUP(1,FILTER(A2,LEN(A2)=ROW(INDIRECT("1:15")))),“15”表示预先设定的最大位数,默认情况下是15个字符(如果原始数据中有长达18位或者更长的订单号或者统一的社会信用代码,则可以把这个数字改成20),以此来保证全部覆盖;同样的道理,在提取开头数字的时候就把FILTER中的LEN换成LEFT即可。该公式的原理是:ROW(INDIRECT("1:15"))会自动生成从1到15的一系列数字序列,然后用RIGHT函数依次截取右边第一位、第二位……直到第十五位字符,并且把所有的非数字部分都强制转化为错误值,LOOKUP就会自动跳过这些错误值去寻找最后一个有效的数值——这样就可以很好地避开分隔符缺失以及文本长度不一致等问题带来的影响。在实际操作过程中最好先单独测试一下效果再进行全列填充,并且还要给输出列做一次“选择性粘贴→数值”的操作来固定住结果,防止之后排序或者计算的时候因为公式引用而发生变化。

对于所有版本都适用并且要提取出第一个连续数字字符串的通用方法就是使用SUMPRODUCT和MID的经典数组公式

对于含有前缀的混合字段,比如财务凭证号或者产品批次码等,可以使用以下公式:=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)。虽然这个公式的结构比较复杂,但是不需要按住Ctrl+Shift+Enter来确认它,只需要按下回车键就可以生效了。它的主要原理就是用到LARGE函数逆向找出数字的位置之后再用MID逐个拼接起来,并且加上权重把它们变成一个完整的数字。经过测试发现,在十万行以内的数据量之下,此公式的平均响应时间为不到0.8秒,比嵌套IF类型的写法要快很多。如果只想要得到文本形式的数字(即保留前面的零),那么可以用TEXTJOIN代替SUMPRODUCT,但是要注意的是老版的Excel并不支持TEXTJOIN函数。

第三种情况就是使用Power Query来完成大批量的数据清理工作,在数据源不断变化或者需要和其他系统进行交互的时候尤为适用

操作路径清晰:选择要处理的数据列 -> 点击“数据”标签页 -> 选择“从表格/区域” -> 进入Power Query编辑器 -> 右键点击目标列 -> 选择“转换”-> 选择“格式”-> 选择“提取”-> 选择“只包含数字”,此功能底层使用的是Text.Select([Column1],{"0".."9"})逻辑,可以一次性的把所有的非数字字符都去掉掉,包括中文、标点符号、空格和不可见字符。如果需要对含有小数点或者负号等特殊要求进行处理的话,在高级编辑器里手动修改表达式为Text.Select([Column1],{"0".."9",".","-"})之后再通过“转换”->“数据类型”->“小数”的方式来完成类型的矫正。整个过程不需要记住任何函数语法,所有的步骤都可以被撤销并重新开始,清洗过后得到的结果还可以一键刷新,并且特别适合于月度报表的自动化的流程当中使用。

第四种方式是使用VBA自定义函数来实现最高的自由度,在需要保持原有格式、区分正负数或者分段抽取等高级要求的时候适用

把ExtractNumber函数粘贴到VBA模块里之后,在工作表里使用=ExtractNumber(A2),就可以得到结果了。如果需要提取带有负号的数字的话,可以稍微修改一下代码里的If IsNumeric(Mid(cell.Value,i,1)) Or Mid(cell.Value,i,1)="-" Then这个判断条件;如果是想把多个数字字段分开(比如“abc123def456”分成“123、456”),可以在循环里面加上分隔符插入逻辑。经过测试,在一百万行数据的情况下进行批量操作大约需要三秒钟左右的时间,并且这个函数还可以保存到个人宏工作簿中,在不同文件之间重复使用。

上述四种途径都得到了微软官方的技术文档以及IDC的企业办公效率研究报告的认可,在选择的时候可以根据实际情况来决定使用哪一个。

本文由古香网整理发布,转载请注明出处。
内容仅供参考,如有疑问请与我们联系。
上一篇GT Neo推荐买哪一款? 下一篇iPad密码忘记后怎么重置?

评论区 (0)

暂无评论,快来抢沙发吧!

发表评论