如何实现“SUMIFS”在评价功能

问题描述 投票:0回答:1

我已经找到了宏来评估字符串。这是工作的罚款与大多数公式。但它不会evalute我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")

我习惯了丹麦的Excel - 所以它可能只是一些非常非常简单的我失踪。

excel vba sumifs evaluate
1个回答
0
投票

我觉得你应该给你为什么需要这个功能更多的信息,我敢肯定有希望成为实现比上面的代码任务的方式更好。

有许多原因的函数返回一个错误。最主要的是,你的公式语法是不正确的。所述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天就会看起来像什么困扰。

© www.soinside.com 2019 - 2024. All rights reserved.