Вот проблема, у меня есть камера, скажем,

WH, QC-NDE(0,75), CHL150-1(5,05), HMCT12P1(1), BS (0,2), QC-NDE(0,5), TIGPEC05 (17,25), SR, CHL150-1(23), HMCT12P1(42)), БС (1.5), КК, КК-Н (0,35), КК-ПСБС (0,75), INSP_FIN (1)

Я хотел бы добавить все числа в скобках (круглые скобки) слева направо, пока не достигнет первого CHL150-1.

И если перед CHL150-1 есть слово "SR", добавьте 72.

Таким образом, для приведенного выше примера возвращаемое значение будет 0,75 + 5,05 = 5,80, как показано жирным шрифтом.

TIGPEC05(17.25), SR, CHL150-1(23), HMCT12P1(42), BS (1.5), QC, QC-H (0.35), QC-NDE (0.75), INSP_FIN (1)

Значение, возвращаемое выше, будет 17.25 + 72 + 23 = 112.25.

И в идеале выбор условия запуска триггера может быть изменен. (например, изменить CHL150-1 на HMCT12P1)

Буду признателен за любую помощь. Предпочитаю формулу и UDF или их смесь. Спасибо!

2 ответа2

1
Public Function mysum(source As String, delim As String) As Double
source = "," & source & ","
delim = "," & delim & "("
If InStr(source, delim) > 0 Then
    source = Left(source, InStr(1 + InStr(source, delim), source, ","))
End If
If InStr(source, ",SR,") > 0 Then
    mysum = 72
End If
Do Until InStr(source, "(") = 0
    source = Mid(source, 1 + InStr(source, "("))
    mysum = mysum + Val(source)
    source = Mid(source, InStr(source, ")"))
Loop
End Function

где

  • источник - ячейка данных (содержащая "WH, QC-NDE (0.75), ..., INSP_FIN (1)")
  • delim - разделитель-разделитель ("CHL150-1", "HMCT12P1", ...)

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

"SR" и 72 также могут быть преобразованы из жестко закодированных констант в (необязательные) параметры.

Если вы хотите переименовать функцию, вы должны заменить ВСЕ вхождения в коде (4 раза).

Как пользоваться

0

Этот метод использует функцию Split

Option Explicit
Function SumSpecial(str As String) As Double
    Dim V, W
    Dim I As Long
    Dim D As Double
    Const strEnd As String = "CHL150-1"
    Const str72 As String = "SR"

V = Split(str, ",")

I = 0
Do
    W = Split(V(I), "(")
    If UBound(W) = 1 Then
        D = D + Val(W(1))
    End If
    If W(0) = str72 And _
        Split(V(I + 1), "(")(0) = strEnd Then
        D = D + 72
    End If
    I = I + 1
Loop Until W(0) = strEnd

SumSpecial = D

End Function

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .