Страницы: 1
RSS
Цифры из текста по условию и в сумму!
 
Добрый всем день!
Подскажите с реализацией задачи, есть столбец с данными:
Возм 6232 (какой-то текст с цифрами всегда разный) и в конце K.132.56
Какой-то текст с цифрами
Какой-то текст с цифрами
Возм 6232 (какой-то текст с цифрами всегда разный) и в конце K.102.03
Какой-то текст с цифрами
Возм 6232 (какой-то текст с цифрами всегда разный) и в конце K.92.31
И так далее чередуется в произвольном порядке.

К. и цифры это размер комиссии.
Задача просуммировать комиссии по всему столбцу.
Как получить комиссию из конкретной ячейки, заменить точку на запятую и преобразовать текст в число я сделал:
=ЗНАЧЕН(ПОДСТАВИТЬ(ПСТР(D13;НАЙТИ("К.";D13)+2;20);".";",";1))
А вот как теперь отобрать строки которые начинаются с "Возм 6232" и просуммировать эти комиссии?
Надо по идее формулой массива, но что-то я так и не смог справиться.
Пример во вложении.
 
Формула массива:
Код
=СУММПРОИЗВ(--(ЛЕВСИМВ(D13:D18;9)="Возм 6232");ЕСЛИОШИБКА(ЗНАЧЕН(ПОДСТАВИТЬ(ПСТР(D13:D18;НАЙТИ("К.";D13:D18)+2;20);".";",";1));0))
Изменено: Equio - 04.09.2017 14:46:06
 
Цитата
как теперь отобрать строки которые начинаются с "Возм 6232" и просуммировать эти комиссии?
Код
Sub Tablica()
Dim i As Long
Dim iLastRow As Long
Dim iComission As String
Dim iSumma As Double
 iLastRow = Cells(Rows.Count, 4).End(xlUp).Row
  With CreateObject("VBScript.RegExp")
      .Global = True
      .IgnoreCase = True
      .Pattern = "^Возм 6232.+(К\.\d{2,3}\.\d+)"
    For i = 13 To iLastRow
      If .test(Cells(i, 4)) Then
        iComission = .Execute(Cells(i, 4))(0).submatches(0)
        iSumma = iSumma + Replace(Split(iComission, ".", 2)(1), ".", ",")
      End If
    Next
  End With
     Range("D5") = iSumma
End Sub
 
Спасибо огромное за помощь первый вариант подходит на все 100%. Макрос тоже пригодится, запишу его в копилку знаний :)
 
еще вариант в виде функции в D5 :без Submatches,со считыванием в массив

 
Код
Function vvv#(r As Range)
       Dim z: z = r.Value
With CreateObject("VBScript.RegExp"): .Pattern = "\d+\.\d+"
  For i = 1 To UBound(z): t = z(i, 1)
     If .test(t) Then vvv = vvv + Replace(.Execute(t)(0), ".", ",")
  Next
End With
End Function
Изменено: sv2013 - 04.09.2017 18:29:20
 
Еще вариант формулы массива:
Код
=СУММ(ЕСЛИОШИБКА(--ПОДСТАВИТЬ(СЖПРОБЕЛЫ(ПРАВБ(ПОДСТАВИТЬ(ЕСЛИ(ЛЕВБ(D13:D18;9)="Возм 6232";D13:D18);"К.";ПОВТОР(" ";50));50));".";",");0))
Изменено: Bema - 04.09.2017 19:01:04
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
sv2013,
А где у вас в коде условие ТС
Цитата
отобрать строки которые начинаются с "Возм 6232" и просуммировать эти комиссии?
 
Формула массива (ввод тремя клавишами):
=СУММ(ЕСЛИ(ЛЕВБ(D13:D18;9)="Возм 6232";--ПОДСТАВИТЬ(ПСТР(D13:D18;ПОИСК("К.";D13:D18)+2;9);".";",")))
 
Ну и еще вариант до кучи  :) (в xlsx, т.е. с 2007 - просто "ЕСЛИОШИБКА")
Страницы: 1
Наверх