将字符串当作公式来计算的 Excel 函数?

dra*_*n11 41 worksheet-function microsoft-excel

假设我有一个类似"11+5"或什至"=11+5"存储在单元格中的文本字符串。Excel 中是否有一个函数可以让我实际评估该字符串,就好像它是一个公式一样?

这对于我希望能够在 Excel 中编写“动态”公式的另一个项目很有帮助。

chr*_*sen 32

EVALUATE 可在所有当前版本的 VBA 中使用

您可以将其包含在您的 VBA 代码中,或将其包装成一个简单的 UDF 以使其可用作工作表函数

Function ev(r As Range) As Variant
    ev = Evaluate(r.Value)
End Function
Run Code Online (Sandbox Code Playgroud)

它基本上将传递的参数的值视为 Excel 公式,就像在单元格中输入一样

"11+5"并且"=11+5"会产生相同的结果


小智 18

=evaluate(put_reference[s]_here)
Run Code Online (Sandbox Code Playgroud)

这是一个半功能 - 它只能在名称管理器中使用。

这是您可以使用它的方式:

  • 指向一个单元格并打开名称管理器(从“公式”选项卡或通过单击 CTRL+F3)

    评估示例

  • 编写=evaluate(并单击您想要的单元格(最好保留相对引用)。

  • 完成公式 )

  • 给它一个 NAME - (在这个例子中我将称之为eva)。

  • 单击“确定”

现在,让我们假设您选择了 B1 并使所有这些都指向 A1。在 A1 中,您可以输入“ 1+1 ”,而在 B1 中您可以写入=eva- 一旦您按下 ENTER,B1 的值将是2. 由于名称管理器中的引用是相对的,您可以使用它=eva来获取从您想要的位置离开一个单元格的任何单元格的评估。(例如,在 B2 中,=eva将返回单元格 A2 的结果)


jle*_*ear 12

@karel 和 @Laurentiu Mirica 给出了一个很好的答案,有一个重要的警告:除非引用的单元格发生变化,否则评估函数不会重新计算。例如,单元格 C1 包含文本"A1+B1",D1 包含函数=eval。如果 A1 或 B1 中的值发生更改,则不会重新计算单元格 D1 。

eval问题的演示

这可以通过将 volatile 函数引入字符串或 eval 单元格来纠正。每次重新计算工作表时,这将强制重新计算。例如,单元格 C1 可以替换为=if(today(),"A1+B1",)。或者,D1 可以替换为=if(today(),eval,). 任何 volatile 函数都应该做。

第三种也是最简单的解决方案是将名称管理器中的半功能更改为 =if(today(),evaluate(c1),)

  • @jlear 的解决方案是最好的答案,因为它不需要 VBA,并且允许您在文本公式中使用引用而不会出现重新计算问题。请注意*相对引用*的使用(在定义名称时,当您的光标位于 B1 处时,A1 而不是 $A$1)。因此,再次选择单元格 B1,将名称“EvalLeft”定义为 `=IF(TODAY(), EVALUATE(A1))`,并将范围设置为 sheet1(并在您要使用的每个工作表中重新定义它,否则使用范围将其设置为工作簿,相对引用将始终查看 sheet1)。 (2认同)
  • **更新:** 同样在 Office 365 中,您现在可以使用 lambda 函数 `=LAMBDA(x, if(today(),evaluate(x),))` 定义命名函数,并像这样在工作簿中调用它`=评估(C1)`。无需摆弄相对命名范围。 (2认同)

小智 6

=indirect()
Run Code Online (Sandbox Code Playgroud)

如果您在单元格中使用它(与连接一起),它可能非常有用。

例如,此公式将在另一个工作表上显示单元格 B5 的值(其名称存储在此工作表的单元格 A2 中):

=INDIRECT(CONCATENATE(A2,"!B5"))
Run Code Online (Sandbox Code Playgroud)

要使 INDIRECT 工作,必须打开外部工作表。

  • INDIRECT 可以执行数学和函数,但只能作为创建单元格引用的一部分。它不能在问题中提出的一般意义上使用。 (10认同)