Страницы: 1
RSS
Некорректно считает WorksheetFunction.SumIf
 
См. файл
Кто подскажет, почему WorksheetFunction.SumIf в UDF считает некорректно (суммирует 2 строки, вместо одной), а если на листе написать =СУММЕСЛИ($A$2:$A$13;"2.1";$C$2:$C$13), то всё корректно. Критерий суммирования 2.1
В столбце А критерии 2.1, 2.2, 2.3 и т.д, в столбце С суммы.

Код
Function SumByOneCell(sCr$, rCrRange As Range, rSumRng As Range, Optional sDelim$ = ", ")
    Dim x, s As String, dSum As Double
    
    For Each x In Split(sCr, sDelim)
        s = Trim(x)
        If Len(s) Then
            dSum = dSum + WorksheetFunction.SumIf(rCrRange, s, rSumRng) 'СУММЕСЛИ - не считает корректно
            'dSum = dSum + WorksheetFunction.SumIfs(rSumRng, rCrRange, s) 'СУММЕСЛИМН - не считает корректно
        End If
    Next
    SumByOneCell = dSum
End Function
Изменено: New - 13.02.2021 01:46:29
 
у меня в системе разделитель целой и дробной - точка
и везде сумма 189 800 (в т.ч. в Е22)
Код
Sub bb()
  Dim crrg As Range, smrg As Range, vrg As Range
  Set crrg = [a2:a13]: Set smrg = [c2:c13]: Set vrg = [b22]
  Debug.Print "cell=" & WorksheetFunction.SumIf(crrg, vrg, smrg)
  Debug.Print "dgt =" & WorksheetFunction.SumIf(crrg, 2.1, smrg)
  Debug.Print "str =" & WorksheetFunction.SumIf(crrg, "2.1", smrg)
End Sub
вывод такой: достает Excel своими интеллектуальными преобразованиями данных
нужно аккуратнее использовать тексты похожие на числа, а лучше - не использовать вообще
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Игорь, привет. У меня на листе вот так (см. картинку).
Твой код даёт вот это:
cell=189800
dgt =189800
str =189800

То есть кодом через SumIF - не посчитать корректно никак? (
Изменено: New - 13.02.2021 02:39:13
 
если рассматривать 2.1 и 2.10 как десятичные числа (а с точки зрения VBA это десятичные числа, а 2,1 - это список из 2-х чисел 2 и 1 )
то все правильно 2.1 = 2.10 и в итоге сумма из 2-х значений
а у Excel маниакальное стремление во всем, что вводит пользователь (при формате общий) пытаться уловить какое-то сходство с числами (датами)
никто не знает что там внутри SumIf написано
вывод:
избегать в своей практике использовать текст похожий на числа
а если такие данные пришли из вне - быть готовым к подобным сюрпризам
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Добавление к ответу Игоря.
Функции из контейнера Application.WorksheetFunction не локализованы.
Функция SumIf (и ее родственники) при сравнении значений ячеек пытается преобразовать текст в число, если это возможно по "американским" правилам (VBA тут не замешан). Таким образом, эту фунцию нельзя использовать, например, для обработки номеров кредитных карт, расчетных счетов и т.п.
Подобные темы обсуждались на форуме.
Изменено: sokol92 - 13.02.2021 12:43:02
Владимир
Страницы: 1
Наверх