龙空技术网

Excel VBA 提取单元格字符串中的数字并求和/兼聊原始数据的问题

VBA编程实战 156

前言:

当前你们对“vbs 转换字符串为数字”大致比较讲究,我们都需要了解一些“vbs 转换字符串为数字”的相关文章。那么小编在网摘上网罗了一些关于“vbs 转换字符串为数字””的相关资讯,希望咱们能喜欢,看官们快快来学习一下吧!

本文于2023年8月1日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!

内容提要

字符串内数字求和原始数据的问题

大家好,我是冷水泡茶,今天在知乎上看到一个问题:

我想起我们于2023年05月06日分享过的文章:提取数字,我们用VBA编写了一个自定义函数GetNum(),可以把字符串中的数字给提取出来。

针对今天这个问题,我们可以把提取出来的数字相加,就会得出结果,我们一起来看一下吧:

自定义函数:SumNumbers,字符串内数字求和

Function SumNumbers(str As String, Optional negativeNum As Integer = 0, Optional maxLen As Integer = 10)    '函数提取str中的所有数字,并求和    '默认不识别负号    '默认最大长度10位    Dim regEx As Object    Dim Result As Double    k = 0    Set regEx = CreateObject("VBScript.RegExp")    With regEx        .Global = True        If negativeNum = 0 Then            .Pattern = "\d+(\.\d+)?"         Else            .Pattern = "-?\d+(\.\d+)?"         End If    End With    Set matches = regEx.Execute(str)   '进行匹配,匹配结果存到Matches    For i = 0 To matches.Count - 1     '循环,根据参数取得匹配结果                 If Len(CStr(matches.Item(i).Value)) <= maxLen Then            Result = Result + CDbl(matches.Item(i).Value)        End If    Next    SumNumbers = ResultEnd Function

代码解析:

1、函数参数:

(1)negativeNum,输入整数,默认为0,表示不识别负号“-”,即如果有负数,会被识别为正数。输入除0以外的其他数字,则识别负号“-”,即如果有负数,会被识别为负数。

(2)maxLen,数字的最大长度,默认为10。主要目的是剔除电话号码、银行账号之类的长数字,这种数字相加是没有意义的,当然如果确实要把所有数字求和,可以把maxLen设得大一点。

2、运用正则表达式识别字符串中的数字。根据的negativeNum 取值采用不同的Pattern。

3、匹配完成后,循环的matches每一个item,把长度小于等于maxLen的值转化为Double类型的数值,再相加,得出函数值。

其他

1、其实我并没有回答那位提问者的问题,我觉得他可能是想要一个内置函数的公式,说实话,我一时半会还不能搞出来,加之已有人回答了用函数公式的解决方法,看那一长串的公式就有点犯晕。

2、我想到用我自己的方法,就是VBA函数来解决,问主是WPS,可能也不太合适。

3、如果是我要处理这些数据的话,我可能会把单元格字符串中所有的数字一个一个地提取出来,然后再汇总,就这样笼统地一汇总,感觉不是那么踏实,万一提取的数字提取错了呢?那求和的结果不就是错了?根本看不出来。

4、最后,说到原始数据的问题,我猜问主的数据可能有两种情况:一是人工输入的,那么这样的输入是很不专业的,应该把文字与数字分开录入,这样汇总那就方便多了。二是从某个业务系统中导出来的,那么,在业务系统的设计中,也应该把文字与数字分开,如果确实只能把几个数字糅合到一个字段中,在生成这些字段的时候,要把数字加上界定字符,比如“张三【20】李四【30】”这样,在EXCEL中处理起来会方便一些,无论是用公式,还是用分列都会容易很多。

标签: #vbs 转换字符串为数字