编辑 VBA UDF 以求和括号中的数字,同时忽略括号中的单词

Posted

技术标签:

【中文标题】编辑 VBA UDF 以求和括号中的数字,同时忽略括号中的单词【英文标题】:Edit VBA UDF to sum numbers in parenthesis while ignoring words in parenthesis 【发布时间】:2018-05-22 22:00:04 【问题描述】:

我有一个 UDF,它会在给定单元格中查找括号内的数字,然后对给定单元格中括号内的所有数字求和,它在 90% 的情况下都可以正常工作,但是当括号内的内容不是一个数字,即一个单词或短语,它将返回#VALUE!我正在尝试解决此问题,以便它会忽略括号内的单词等。也出于某种原因,有一个“。”括号后使得它使括号中的数字在“。”之前当它们不应该被忽略时被忽略。

上述问题的截图

函数如下

Public Function Addum(rng As Range) As Double
    Dim s As String, L As Long, temp As String
    Dim CH As String
    s = rng.Value
    L = Len(s)
    For i = 1 To L
        CH = Mid(s, i, 1)
        If CH Like "[0-9]" Or CH = "." Or CH = "(" Or CH = ")" Then
            temp = temp & CH
        Else
            temp = temp & " "
        End If
    Next i

    temp = Application.WorksheetFunction.Trim(temp)
    arr = Split(temp, " ")
    For Each a In arr
        If Left(a, 1) = "(" Then
            a = Mid(a, 2, Len(a) - 2)
            If IsNumeric(a) Then
                Addum = Addum + CDbl(a)
            End If
        End If
    Next a
End Function

这个问题不同于Excel: Sum numbers inside a text block in a cell 因为当括号内有单词并且有“。”时,我要求它工作。在括号之后。

提前感谢您提供的任何帮助!

【问题讨论】:

@ScottCraner - 这个问题是发布代码的来源 @TimWilliams 和其他两个答案中的任何一个都将忽略文本。 其中一个答案使用了正则表达式,我在 mac 上工作时遇到问题,另一个是数组公式,在此设置中也不起作用 @ScottCraner - 授予。看来 OP 正试图弄清楚如何修复他们拥有的代码...... 我重新打开了但是应该问一下,你有什么尝试自己调整代码的? 【参考方案1】:
Public Function Addum(rng As Range) As Double
    Dim s As String, temp As String, i As Long
    Dim CH As String, inParens As Boolean, q As String
    s = rng.Value
    For i = 1 To Len(s)
        CH = Mid(s, i, 1)
        If CH = "(" Then
            inParens = True
            q = ""
        ElseIf CH = ")" Then
            inParens = False
            temp = temp & " " & q
        Else
            If inParens Then q = q & _
               IIf(CH Like "[0-9]" Or CH = ".", CH, " ")
        End If
    Next i

    temp = Application.WorksheetFunction.Trim(temp)
    arr = Split(temp, " ")
    For Each a In arr
        If IsNumeric(a) Then Addum = Addum + CDbl(a)
    Next a
End Function

【讨论】:

这比我的方法要好得多............我从来没有考虑过测试是否在括号之间 @TimWilliams 有没有办法让它忽略日期,即 (9 /4) 最终会在最终答案中添加 13,而 (9/4/16) 会在最终答案中添加 29回答。 – 海登衬衫 是的,有可能 - 为什么不试一试?【参考方案2】:

这是一个后期绑定regexudf。

Function sumNums(str As String) As Double
    Dim n As Long
    Static rgx As Object, cmat As Object

    'with rgx as static, it only has to be created once; beneficial when filling a long column with this UDF
    If rgx Is Nothing Then
        Set rgx = CreateObject("VBScript.RegExp")
    End If

    sumNums = 0

    With rgx
        .Global = True
        .MultiLine = False
        .Pattern = "\(\d+(\.\d1,2)?\)"
        If .Test(str) Then
            Set cmat = .Execute(str)
            'sum the matches
            For n = 0 To cmat.Count - 1
                sumNums = sumNums + Abs(CDbl(cmat.Item(n)))
            Next n
        End If
    End With
End Function

对于excel-vba-mac 与regex 有问题的excel-vba-mac,这是我能想到的最简单的方法。

Option Explicit

Public Function Addum(str As String) As Double
    Dim i As Long, j As Long, tmp As Variant

    tmp = Split(str, Chr(40))

    For i = LBound(tmp) + 1 To UBound(tmp)
        If IsNumeric(Split(tmp(i), Chr(41))(0)) Then _
            Addum = Application.Sum(Addum, Split(tmp(i), Chr(41))(0))
    Next i

End Function

【讨论】:

以上是关于编辑 VBA UDF 以求和括号中的数字,同时忽略括号中的单词的主要内容,如果未能解决你的问题,请参考以下文章

当用户输入超过预期的参数时,强制 VBA 中的 UDF 显示 MsgBox?

Excel VBA UDF Count Ifs 与数据转换

我在 Excel VBA 中使用“InBetween”UDF,它适用于 43 行,然后停止工作

寻找用于 VBA 的功能最小化器

在 VBA UDF 中添加超链接

使用 UDF 的慢速宏、求解器和公式