Редактировать VBA UDF, чтобы суммировать числа в скобках, игнорируя слова в скобках - PullRequest
0 голосов
/ 23 мая 2018

У меня есть UDF, который будет искать в данной ячейке числа внутри скобок, а затем суммировать все числа внутри скобок в данной ячейке, это хорошо работает в 90% случаев, но когда внутри скобок есть что-то, что нечисло, то есть слово или фраза, он вернет # ЗНАЧЕНИЕ!Я пытаюсь исправить это, чтобы он игнорировал слова и т. Д., Находящиеся внутри скобок.Также по какой-то причине, имея "."после круглых скобок делает так, чтобы числа в скобках перед «.»игнорируются, когда они не должны быть.

снимок экрана описанных выше проблем

screenshot of problems explained above

Функция выглядит следующим образом

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:Суммируйте числа внутри текстового блока в ячейке , потому что я спрашиваю, чтобы он работал, когда в скобках присутствуют слова, а когда есть "."после скобок.

Заранее благодарим за любую помощь, которую вы можете оказать!

Ответы [ 2 ]

0 голосов
/ 23 мая 2018
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
0 голосов
/ 23 мая 2018

Здесь указано позднее udf.

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+(\.\d{1,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

Для , у которого проблемы с это самое простое, что я мог придумать.

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

enter image description here

...