Проблема связана с функцией EXACT
, которая WorksheetFunction
не раскрывает.
Для неэкспонированных функций Excel распространенным обходным решением является преобразование выражения в строку и вызов функции Evaluate
. Примитивная рутина будет выглядеть так:
Public Function SumProductExact(rng As Range, testItem As String) As Long
Dim evalExpr As String
On Error GoTo EH
evalExpr = "=SUMPRODUCT(--(EXACT(" & rng.Address & ", """ & testItem & """)))"
SumProductExact = Evaluate(evalExpr)
Exit Function
EH:
SumProductExact = -1
End Function
и будет называться так:
Debug.Print SumProductExact(Sheet1.Range("A1:A10"), "Apple")
Но вряд ли стоит идти на эти длины для относительно тривиальной функции, поэтому вы можете просто написать свою собственную функцию CountIf
для точного соответствия. Возможно, вы захотите расширить это, чтобы обслуживать сравнения других типов, например даты, но в основном это будет выглядеть так:
Public Function CountIfExact(rng As Range, testItem As Variant) As Long
Dim v As Variant
Dim c As Long
On Error GoTo EH
For Each v In rng.Value2
If v = testItem Then c = c + 1
Next
CountIfExact = c
Exit Function
EH:
CountIfExact = -1
End Function
который будет называться следующим образом:
Debug.Print CountIfExact(Sheet1.Range("A1:A10"), "Apple")