Excel:解析单元格并创建函数
例如,我有一些单元格具有以下值: 5*A-2*B-4*C 在其他单元格中,我会将A、B和C的值放入其中。我想制作额外的单元格来计算值。例如,如果在一些单元格中,A的值是2,B的值是3,C的值是1,我想要一个额外的单元格,它将计算并将值0(这是5*2-2*3-4*1的结果)。可能的变量是A、B和C,但它们不必包含在每个单元格中(例如,某些单元格可能只有5*A-3*C) 可能吗?有人知道如何编写这个函数吗 另外,我无法在不同的单元格中手动拆分值,因为有数百个单元格Excel:解析单元格并创建函数,excel,Excel,例如,我有一些单元格具有以下值: 5*A-2*B-4*C 在其他单元格中,我会将A、B和C的值放入其中。我想制作额外的单元格来计算值。例如,如果在一些单元格中,A的值是2,B的值是3,C的值是1,我想要一个额外的单元格,它将计算并将值0(这是5*2-2*3-4*1的结果)。可能的变量是A、B和C,但它们不必包含在每个单元格中(例如,某些单元格可能只有5*A-3*C) 可能吗?有人知道如何编写这个函数吗 另外,我无法在不同的单元格中手动拆分值,因为有数百个单元格 谢谢。Saladin Akara的
谢谢。Saladin Akara的评论为您提供了最简单的解决方案。为A、B和C定义一些命名公式(请参见Excel帮助主题“使用名称”)。然后任何其他单元格都可以包含使用这些命名值的公式 如果这还不够,例如,如果您确实希望在单元格中查看和编辑公式,然后在其他单元格中计算公式的值,则可以使用Excel的内置计算器,而无需自己解析公式。最简单的方法是通过
应用程序
对象的评估
方法。(请再次参阅帮助。)Charles Williams在其网站上提供了计算Excel表达式的示例代码:
除此之外,您还可以使用
Application.Evaluate
对带有(标量)参数的表达式求值,而无需定义任何名称,也无需实际解析公式,方法是执行一些基本的字符串替换。网上有几个例子,但道格·詹金斯(Doug Jenkins)的一个很好的例子如下:萨拉丁·阿卡拉(Saladin Akara)的评论为您指出了最简单的解决方案。为A、B和C定义一些命名公式(请参见Excel帮助主题“使用名称”)。然后任何其他单元格都可以包含使用这些命名值的公式
如果这还不够,例如,如果您确实希望在单元格中查看和编辑公式,然后在其他单元格中计算公式的值,则可以使用Excel的内置计算器,而无需自己解析公式。最简单的方法是通过应用程序
对象的评估
方法。(请再次参阅帮助。)Charles Williams在其网站上提供了计算Excel表达式的示例代码:
除此之外,您还可以使用
Application.Evaluate
对带有(标量)参数的表达式求值,而无需定义任何名称,也无需实际解析公式,方法是执行一些基本的字符串替换。网上有几个例子,但Doug Jenkins的一个很好的例子如下:这可以通过VBA函数EVALUTE来完成
简单的例子:
Function ev(f As Variant, A As Range, B As Range, C As Range) As Variant
Dim s As String
s = f
s = Replace(s, "A", "~A~")
s = Replace(s, "B", "~B~")
s = Replace(s, "C", "~C~")
s = Replace(s, "~A~", A.Address)
s = Replace(s, "~B~", B.Address)
s = Replace(s, "~C~", B.Address)
ev = Evaluate(s)
End Function
例如,如果表达式在A2中,A、B、C的值在C2:E2中
=ev(A2,C2,D2,E2)
返回计算值
您可能希望使用ParamArray而不是a、B、C变量值来允许任意数量的变量
更完整的版本:
Function ev(expr As Variant, VarNames As Range, varValues As Range) As Variant
Dim s As String
Dim i As Long
s = expr
For i = 1 To VarNames.Columns.Count
s = Replace(s, VarNames.Cells(1, i), "~" & VarNames.Cells(1, i) & "~")
Next
For i = 1 To VarNames.Columns.Count
s = Replace(s, "~" & VarNames.Cells(1, i) & "~", varValues.Cells(1, i).Address)
Next
ev = Evaluate(s)
End Function
用法:
与上面相同的数据加上C1:E1中的变量名
=ev(A2,C1:E1,C2:E2)
这可以通过VBA函数EVALUTE完成 简单的例子:
Function ev(f As Variant, A As Range, B As Range, C As Range) As Variant
Dim s As String
s = f
s = Replace(s, "A", "~A~")
s = Replace(s, "B", "~B~")
s = Replace(s, "C", "~C~")
s = Replace(s, "~A~", A.Address)
s = Replace(s, "~B~", B.Address)
s = Replace(s, "~C~", B.Address)
ev = Evaluate(s)
End Function
例如,如果表达式在A2中,A、B、C的值在C2:E2中
=ev(A2,C2,D2,E2)
返回计算值
您可能希望使用ParamArray而不是a、B、C变量值来允许任意数量的变量
更完整的版本:
Function ev(expr As Variant, VarNames As Range, varValues As Range) As Variant
Dim s As String
Dim i As Long
s = expr
For i = 1 To VarNames.Columns.Count
s = Replace(s, VarNames.Cells(1, i), "~" & VarNames.Cells(1, i) & "~")
Next
For i = 1 To VarNames.Columns.Count
s = Replace(s, "~" & VarNames.Cells(1, i) & "~", varValues.Cells(1, i).Address)
Next
ev = Evaluate(s)
End Function
用法:
与上面相同的数据加上C1:E1中的变量名
=ev(A2,C1:E1,C2:E2)
您可以将总和放入单元格,如
=5*A-2*B-4*C
。您可以将总和放入单元格,如=5*A-2*B-4*C
。