包含不带空格的文本的单元格中的数字总和
Posted
技术标签:
【中文标题】包含不带空格的文本的单元格中的数字总和【英文标题】:Sum numbers in cell containing text without spaces 【发布时间】:2021-06-03 14:27:26 【问题描述】:我对 SO 和 google 进行了广泛的研究,但没有提出解决方案。 虽然这个问题之前可能已经问过,但我的情况略有不同
如果文本和数字之间有空格,该函数可以正常工作。但是,如果没有空格,则不起作用。
Function SumNumbers(rngS As Range, Optional strDelim As String = " ") As Double
Dim xNums As Variant, lngNum As Long
xNums = Split(rngS, strDelim)
For lngNum = LBound(xNums) To UBound(xNums) Step 1
SumNumbers = SumNumbers + Val(xNums(lngNum))
Next lngNum
End Function
我的单元格数据如下所示:su9m11w11.5th8
我尝试添加一个字母数组,但没有成功。欢迎帮助。
strDelim = Array("F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "U")
【问题讨论】:
你想要的输出是什么?另外,会不会有负数,比如:5xyz-10abc7
?
@JvdV 我想跳过字母并对数字求和。所以在这个例子中,我的输出应该是 39.5
此时没有负数。但是我猜,如果求和成功,负数会自动从总和中扣除正确吗?
【参考方案1】:
嗯,根据您的数据,您可以尝试:
Sub Test()
Dim StrIn As String: StrIn = "su9m11w11.5th8"
Debug.Print SumDigits(StrIn)
End Sub
Function SumDigits(str As String) As Double
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "[a-z]+"
SumDigits = Application.Evaluate(.Replace(str, "+") & ".0")
End With
End Function
这里我使用了一个正则表达式来替换所有从 a-z 到“+”的小写字符。然后可以计算结果字符串以返回总和。
编辑:
另一种方法是使用一个正则表达式,它会返回所有可能的(负)数,并将它们相加:
Function SumDigits(str As String) As Double
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "-?\d+(?:\.\d+)?"
If .Test(str) Then
For Each Match In .Execute(str)
SumDigits = SumDigits + Match
Next
End If
End With
编辑 2:
要返回平均值,我们应该捕获匹配子字符串的数量,然后除以该数量:
Function SumDigits(str As String, Optional avg As Boolean) As Double
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "-?\d+(?:\.\d+)?"
If .Test(str) Then
Set Matches = .Execute(str)
For Each Match In Matches
SumDigits = SumDigits + Match
Next
If avg Then SumDigits = SumDigits / Matches.Count
End If
End With
End Function
改用Debug.Print SumDigits(StrIn, True)
调用。
【讨论】:
该功能正常工作。你能解释一下这个方法吗,因为我不熟悉这种方法。想了解一下。感谢您的帮助和时间。 如果要求不高,有没有办法用同一个函数求平均值?【参考方案2】:这是一个 VBA 函数,用于生成嵌入数字的总和或平均值……它也可以处理负数。这是纯 Excel VBA,没有引用外部库:
Function SumEmbeddedNumbers#(s$, Optional bAverage As Boolean)
Dim i&, p&, max&, t&, pluses&
Dim b() As Byte, res() As Byte
Static keep() As Boolean
Const VALS$ = "0123456789.-"
If (Not Not keep) = 0 Then
ReDim keep(0 To 255)
For i = 1 To Len(VALS)
keep(Asc(Mid$(VALS, i, 1))) = 1
Next
End If
max = LenB(s)
ReDim res(0 To max)
b = StrConv(s, vbFromUnicode)
For i = 0 To Len(s) - 1
t = b(i)
If keep(t) Then
res(p) = t
p = p + 1
Else
If p Then
If res(p - 1) <> 43 Then
res(p) = 43
pluses = pluses + 1
p = p + 1
End If
End If
End If
Next
SumEmbeddedNumbers = Evaluate(Left$(StrConv(res, vbUnicode), p))
If bAverage Then SumEmbeddedNumbers = SumEmbeddedNumbers / (pluses + 1)
End Function
MsgBox SumEmbeddedNumbers("su9m11w11.5th8") '<---displays: 39.5
MsgBox SumEmbeddedNumbers("su9m11w11.5th8", True) '<---displays: 9.875
【讨论】:
以上是关于包含不带空格的文本的单元格中的数字总和的主要内容,如果未能解决你的问题,请参考以下文章
Excel 2013 - 单元格中的多个数字作为文本字符串,需要识别是否小于某个值