假设我有一个文本字符串,例如"11+5"
或甚至"=11+5"
存储在单元格中。Excel 中是否有一个函数可以让我真正评估该字符串,就像它是一个公式一样?
这对于我希望能够在 Excel 中编写“动态”公式的另一个项目很有帮助。
答案1
EVALUATE
在所有当前版本的 VBA 中均可用
您可以将其包含在 VBA 代码中,或将其包装到简单的 UDF 中,以使其可用作工作表函数
Function ev(r As Range) As Variant
ev = Evaluate(r.Value)
End Function
它基本上将传递的参数的值视为 Excel 公式,就像在单元格中输入一样
"11+5"
并"=11+5"
会产生相同的结果
答案2
=evaluate(put_reference[s]_here)
这是一个半函数 - 它可以仅有的在名称管理器中使用。
使用方法如下:
指向一个单元格,然后打开名称管理器(从“公式”选项卡或单击 CTRL+F3)
写入
=evaluate(
并单击您想要的单元格(最好保留相对引用)。完成公式
)
给它一个名称-(在这个例子中,我就叫它
eva
)。点击好的。
现在,假设您已选择 B1 并将所有这些引用到 A1。在 A1 中,您可以输入“1+1“并且在 B1 中写入=eva
- 一旦你按下 ENTER,B1 的值将为2
。由于名称管理器中的引用是相对的,你可以使用它=eva
来获取距离你想要的位置左边任何单元格的求值。(例如在 B2 中,=eva
将返回单元格 A2 的结果)
答案3
@karel 和 @Laurentiu Mirica 的出色回答有一个重要的警告:除非引用的单元格发生变化,否则评估函数不会重新计算。例如,单元格 C1 包含文本,"A1+B1"
而 D1 包含函数=eval
。如果 A1 或 B1 中的值发生变化,则单元格 D1不会重新计算。
可以通过在字符串或 eval 单元格中引入易失性函数来纠正此问题。每次重新计算工作表时,这都会强制重新计算。例如,单元格 C1 可以替换为=if(today(),"A1+B1",)
。或者,D1 可以替换为=if(today(),eval,)
。任何易失性函数都可以。
第三个也许是最简单的解决方案是将名称管理器中的半功能更改为=if(today(),evaluate(c1),)
答案4
2021 年的脚注——随着 LAMBDA 函数(在撰写本文时在 Office 365 测试版中)的引入,情况发生了一些变化,该函数可以将参数从工作表单元格传递给名称管理器函数evaluate
。
最小示例:对于EVAL
可用于单元格表达式的用户定义函数,我们可以在名称管理器中进行以下名称绑定:
EVAL
=LAMBDA(s, evaluate(s))