Как реализовать 'sumifs' в функции оценки - PullRequest
0 голосов
/ 01 февраля 2019

Я нашел макрос для оценки строк.Это работает нормально с большинством формул.Но это не обнулит мои формулы sumifs.

VBA для WM_Eval () выглядит так:

Function wm_Eval(myFormula As String, ParamArray variablesAndValues() As 
Variant) As Variant
Dim i As Long

'
' replace strings by values
'
For i = LBound(variablesAndValues) To UBound(variablesAndValues) Step 2
    myFormula = RegExpReplaceWord(myFormula, variablesAndValues(i), 
variablesAndValues(i + 1))
Next

'
' internationalisation
'
myFormula = Replace(myFormula, Application.ThousandsSeparator, "")
myFormula = Replace(myFormula, Application.DecimalSeparator, ".")
myFormula = Replace(myFormula, 
Application.International(xlListSeparator), ",")

'
' return value
'
wm_Eval = Application.Evaluate(myFormula)
End Function

Если я набираю wm_Eval ("1 + 1"), он работает как шарм,Но если я это сделаю:

="sumifs(b2:b10,a2:a10,"&D2&">=2"&D2&")" where d2=" it returns #Value.

So the formula it should evaluate would be: sumifs(b2:b10,a2:a10,">=2")

Я привык к Danish Excel - так что это может быть что-то очень простое, что мне не хватает.

1 Ответ

0 голосов
/ 04 февраля 2019

Мне кажется, вы должны дать больше информации о том, зачем вам нужна эта функция, так как я уверен, что будет лучший способ выполнить задачу, чем приведенный выше код.

Есть рядиз причин, функция возвращает ошибку.Главный из них заключается в том, что ваш синтаксис формулы неверен.Функция wm_Eval() требует аргумента формулы, а затем пары переменных и значений параметров.Вы не включили код для своей функции RegExpReplaceWord(), но я думаю, что она выполняет какую-то замену значений для переменных псевдо-формул.Не видя эту часть вашего кода, трудно догадаться по синтаксису, но макет принципа будет выглядеть примерно так:

= wm_Eval ("SUMIFS (A1: A4, B1:B4, {a}) "," {a} ","> = 1 ")

, где {a} заменяется на"> = 1 "

Тип данныхтакже проблема, как вы можете видеть в следующем синтаксисе:

= wm_Eval ("SUMIFS (A1: A4, B1: B4, {a})", "{a}", 1)

Я не хочу быть слишком жестоким, но этот код довольно плохо сконструирован, и нет никакой возможности проанализировать все разные формулы с различными переданными параметрами.Да, это работает для SUM, но это потому, что вы не передаете пары переменная-значение.Я бы держался подальше от этого решения и придумал бы что-нибудь более надежное.Например, если вы хотите собрать строковые версии своей формулы, почему бы просто не передать диапазон, содержащий формулу, и отработать ее оттуда?

Я могу вам сказать, что я написал процедуру для анализа значений изформулы.Он длинный и сложный, и на его разработку ушло много-много часов, включая некоторые вызовы и ловушки WINAPI, поэтому у вас впереди много работы, если вы хотите продолжить свой текущий подход.

Однако, я думаю,Я должен показать вам, как работает ваша текущая функция, поэтому я смоделировал функцию RegExpReplaceWord() и прокомментировал этот код интернационализации:

Public Function wm_Eval(myFormula As String, ParamArray variablesAndValues() As Variant) As Variant
    Dim i As Long

    '
    ' replace strings by values
    '
    For i = LBound(variablesAndValues) To UBound(variablesAndValues) Step 2
        myFormula = RegExpReplaceWord(myFormula, variablesAndValues(i), variablesAndValues(i + 1))
    Next

    '
    ' internationalisation
    '
'    myFormula = Replace(myFormula, Application.ThousandsSeparator, "")
'    myFormula = Replace(myFormula, Application.DecimalSeparator, ".")
'    myFormula = Replace(myFormula, Application.International(xlListSeparator), ",")

    '
    ' return value
    '
    wm_Eval = Application.Evaluate(myFormula)
End Function

Private Function RegExpReplaceWord(myFormula As String, variable As Variant, value As Variant) As String

    If VarType(value) = vbString Then
        value = """" & value & """"
    End If

    RegExpReplaceWord = Replace(myFormula, variable, value)
End Function

Итак, в ячейке вашего рабочего листа вы можете добавить функциикак показано в приведенных выше блоках цитат.

Таким образом, я не буду продолжать ваш текущий подход, или вы будете сталкиваться с таким количеством ошибок, что ваши потерянные 3 дня будут казаться ничем.

...