Excel:解析单元格并创建函数

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的

例如,我有一些单元格具有以下值:

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的评论为您提供了最简单的解决方案。为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