См. файл Кто подскажет, почему 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
у меня в системе разделитель целой и дробной - точка и везде сумма 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 своими интеллектуальными преобразованиями данных нужно аккуратнее использовать тексты похожие на числа, а лучше - не использовать вообще
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
если рассматривать 2.1 и 2.10 как десятичные числа (а с точки зрения VBA это десятичные числа, а 2,1 - это список из 2-х чисел 2 и 1 ) то все правильно 2.1 = 2.10 и в итоге сумма из 2-х значений а у Excel маниакальное стремление во всем, что вводит пользователь (при формате общий) пытаться уловить какое-то сходство с числами (датами) никто не знает что там внутри SumIf написано вывод: избегать в своей практике использовать текст похожий на числа а если такие данные пришли из вне - быть готовым к подобным сюрпризам
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Добавление к ответу Игоря. Функции из контейнера Application.WorksheetFunction не локализованы. Функция SumIf (и ее родственники) при сравнении значений ячеек пытается преобразовать текст в число, если это возможно по "американским" правилам (VBA тут не замешан). Таким образом, эту фунцию нельзя использовать, например, для обработки номеров кредитных карт, расчетных счетов и т.п. Подобные темы обсуждались на форуме.