Почему SumProduct нельзя использовать в Excel VBA - PullRequest
0 голосов
/ 12 сентября 2018

Сценарий

Я пытаюсь использовать COUNTIF в своем коде VBA для подсчета общего количества похожих строк в диапазоне.Но понял, COUNTIF не чувствителен к регистру.Например: я хочу посчитать, сколько Apple в диапазоне.Но иногда, если в этом диапазоне есть яблоко, это тоже считается.Код как ниже.Рассмотрим Range(poRange) что-то вроде C1:C100 и Trim(mainpage.po.value) как Apple

iVal = Application.WorksheetFunction.CountIf(Range(poRange), Trim(mainPage.po.Value))

Таким образом, я решил использовать другой метод, который

iVal = Application.WorksheetFunction.SumProduct(--(EXACT(Range(poRange), Trim(mainPage.po.Value))))

Но на этот раз я не смог запуститьмой VBA из-за ошибки времени компиляции 'Sub or Function not defined'

Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Я использовал одно из вышеуказанных решений, и оно решило проблему. Весь код как показано ниже

Public c As Integer

Sub findVal()
Call SumProductExact(Sheet1.Range("A1:A10"), "Apple")
MsgBox c ' You can use this c value for other calculations

End Sub

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)
    c = SumProductExact
    Exit Function

EH:
    SumProductExact = -1
End Function

Обратите внимание, что в приведенном выше коде используется статический диапазон A1: A10 и статическое имя Apple. Вы можете изменить его на динамический диапазон и имя в соответствии с вашими потребностями.

0 голосов
/ 12 сентября 2018

Проблема связана с функцией 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...