You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Excel中提取字符串内指定格式数字并求和的实现方案咨询

Excel中提取字符串内指定格式数字并求和的实现方案咨询

嘿,我懂你现在的困扰啦——你需要在Excel里从格式有点松散的字符串里提取出2位或3位的整数,然后把它们加起来,而且你已经搞定了LibreOffice和Google Sheets的解法,唯独卡在Excel这儿了对吧?我来给你分享几个可行的方案,分不同Excel版本来说哈~

先明确下你的需求细节:字符串里的目标数字是2位或3位的整数,它们可能被空格、逗号或者字母分隔开,比如像例子里的Michał200 Monika300要提取200和300求和,Daniel 200, Rafał100要提取200和100求和这类场景。


针对Excel 365/2021(支持动态数组与正则函数)的解法

这个版本的Excel有了更强大的函数支持,可以用正则结合XML筛选的方式快速实现:

=SUM(--FILTERXML("<t><s>"&REGEXREPLACE(A1,"[^\d]+","</s><s>")&"</s></t>","//s[string-length()>=2 and string-length()<=3 and number(.)=.]"))

我给你拆解下这个公式的逻辑:

  1. REGEXREPLACE(A1,"[^\d]+","</s><s>"):把字符串里所有非数字的内容替换成</s><s>,这样原本被分隔的数字就会被包裹在<s>标签里
  2. 给处理后的内容加上首尾的<t><s></s></t>,凑成一个合法的XML结构,方便后续筛选
  3. FILTERXML(..., "//s[string-length()>=2 and string-length()<=3 and number(.)=.]"):筛选出符合要求的节点——长度在2-3位之间,并且确实是有效数字(避免空节点或者不符合长度的内容)
  4. --把筛选出来的文本格式数字转换成数值,最后用SUM求和

拿你例子里的Anna200,Marek 300, J. Nowak 100来测试,这个公式会准确算出600,完全符合预期~


针对旧版Excel(无动态数组/正则函数支持)的解法

如果你的Excel版本比较旧,没法用上面的动态数组公式,有两种选择:

方案1:自定义VBA函数(推荐,更简单可靠)

你可以写一个自定义函数,用正则表达式来提取数字并求和,步骤如下:

  1. 按下Alt + F11打开VBA编辑器
  2. 插入一个新模块(右键点击工作簿名称→插入→模块)
  3. 把下面的代码粘贴进去:
Function Sum23Digits(rng As Range) As Double
    Dim regEx As Object
    Dim matches As Object
    Dim match As Object
    Dim total As Double
    
    ' 创建正则对象
    Set regEx = CreateObject("VBScript.RegExp")
    ' 设置匹配规则:匹配2-3位的整数,确保是独立的数字(避免被更长数字的部分匹配)
    regEx.Pattern = "\b\d{2,3}\b"
    regEx.Global = True ' 开启全局匹配,提取所有符合规则的数字
    
    ' 执行匹配
    Set matches = regEx.Execute(rng.Value)
    
    ' 遍历匹配结果求和
    For Each match In matches
        total = total + CDbl(match.Value)
    Next match
    
    Sum23Digits = total
End Function
  1. 保存并回到Excel界面,在需要求和的单元格里输入=Sum23Digits(A1)(A1是目标字符串所在单元格),就能得到结果啦

这个方法不管字符串格式多松散,都能准确提取2-3位的整数求和,实用性很强。

方案2:数组公式(无需VBA,但逻辑较复杂)

如果你不想用VBA,可以用数组公式实现,但需要按Ctrl + Shift + Enter来确认输入(旧版Excel的数组公式要求):

=SUM(IF((ISNUMBER(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),3)))*(LEN(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),3))=3),--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),3),0)+IF((ISNUMBER(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),2)))*(LEN(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),2))=2)*(NOT(ISNUMBER(--MID(A1,ROW(INDIRECT("1:"&LEN(A1)))-1,1)))),--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),2),0))

这个公式的逻辑是分别提取3位和2位的有效数字,再求和,不过要注意它可能会在某些极端场景下出现重复匹配的问题,所以更推荐上面的VBA方案。


备注:内容来源于stack exchange,提问作者Adam Lenart

火山引擎 最新活动