我已经找到了宏来评估字符串。这是工作的罚款与大多数公式。但它不会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 - 所以它可能只是一些非常非常简单的我失踪。
我觉得你应该给你为什么需要这个功能更多的信息,我敢肯定有希望成为实现比上面的代码任务的方式更好。
有许多原因的函数返回一个错误。最主要的是,你的公式语法是不正确的。所述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天就会看起来像什么困扰。