包含不带空格的文本的单元格中的数字总和

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 - 单元格中的多个数字作为文本字符串,需要识别是否小于某个值

从单元格中删除除数字以外的所有内容

单个单元格中的计数或总和(?)项目,与Excel中的列表中的条件匹配

vba去掉单元格中的'

根据“如果单元格中的字符串”条件删除熊猫列中的行

如何为数字文本着色?