Як підсумувати числа в дужках всередині клітини, доки не буде виконано певний стан? [зачинено]


0

Ось проблема, я отримав камеру, скажімо,

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), BS (1.5), QC, QC-H (0.35) ), QC-NDE (0,75), INSP_FIN (1)

Я хотів би додати всі цифри в дужках (круглі дужки) зліва направо, поки не досягне першого CHL150-1.

А якщо є слово "SR" перед CHL150-1, додайте 72.

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

TIGPEC05 ( 17.25 ), SR , CHL150-1 ( 23 ), HMCT12P1 (42), B-S (1,5), QC, QC-H (0,35), QC-NDE (0,75), INSP_FIN (1)

Значення, повернене вище, буде замість 17,25 + 72 + 23 = 112,25.

І в ідеалі вибір того, який стан для ініціювання кінця може бути змінений. (наприклад, змінити CHL150-1 на HMCT12P1)

Буду вдячний за будь-яку допомогу. Віддають перевагу формулі і UDF або суміші обох. Дякую!

Відповіді:


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 рази).

How to use


Akina, Як користуватися цією функцією? Поставте приклад у відповідь !!
Rajesh S

Відкрийте редактор VBA (Alt-F11). Вставити - модуль. Вставте вказаний вище код. Закрийте редактор VBA. Тепер ви можете використовувати цю функцію в цьому wirkbook як загальний вбудований. Її можна знайти в "Функціях, визначених користувачем" у головному формулі або у повному списку функцій за алфавітом.
Akina


Akina, я добре розбираюся з програмуванням / VBA & amp; інші, і я знаю, як створити код. Моє питання полягало в тому, як використовувати UDF у формулі? Як ваша UDF = mysum (діапазон) або що ??
Rajesh S

Наприклад C1 = mysum(A1, B1) де A1 містить довгий рядок, а B1 містить "термінатор", який ви хочете використовувати. Or C1 = mysum(A1, "CHL150-1") якщо потрібно використовувати статичне значення термінатора.
Akina

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

Це теж працює, але те, що може бути поліпшено, полягає в тому, що: Const strEnd As String = "CHL150-1" потрібно повторно відредагувати у випадку зміни параметра (наприклад, замість CHL152-1). Але це теж добре працює! Оцініть ваші добрі внески! =]
hahafwkit

@hahafwkit Просто змініть цю змінну з певної константи у функції, на аргумент (або Optional аргумент) у виклику функції. Оскільки ви не вказали, що елемент буде мінливим у вашому початковому питанні, він не був закодований як такий, але змінити його тривіально.
Ron Rosenfeld
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.