【问题标题】:Is it possible to execute a formula inside a variable?是否可以在变量内执行公式?
【发布时间】:2019-10-02 08:05:26
【问题描述】:

我想知道在 VBA 中是否可以将变量的内容用作“代码”。例如:

x = 23

formula= "43,025*X^-0,452"

Value = ExecuteContentOf(formula)

我在 excel 中使用了功率曲线来计算代表 4 个不同 x、y 值的最佳曲线的公式。 (1,40) (7, 20) (30,10) (60,6)

结果是一个图形,里面有公式。 Excel 会自动计算。使用 VBA,我可以从对象标题中提取公式的文本。

我们的结果是 = 43,025*C2^-0,452

现在我想自己在 VBA 中使用它,将 C2 更改为其他变量(不是单元格),所以 y= 43,025*x^-0,452。 由于公式在字符串中.. 是否可以告诉 VBA 来解释它?

我正在寻找与 Javascript 上的 EVAL 函数相同的功能

【问题讨论】:

  • 这可以通过将公式改为公共函数来完成。
  • 您需要它适用于不同的公式还是仅适用于这个特定的公式? @Plutian 的解决方案可能是最优雅的,并且适用于这两种情况。
  • 我正在寻找与 Javascript 上的 Eval 函数相同的行为

标签: excel vba


【解决方案1】:

不清楚是否需要在运行时从对象标题中提取公式,或者是否可以对其进行硬编码。

硬编码将是微不足道的。 Application.Evaluate 将为您提供与 Javascript 中的 EVAL 函数非常相似的功能。

x = 23
formula= "43,025*" & x & "^-0,452"
Value = Application.Evaluate(formula)

但是,如果您想在运行时动态获取公式,这是一个单独的问题,因为您需要在字符串中找到范围引用并将其替换为新变量。如果每次都是相同的参考。那会很简单。

我会把这个任务留给你。如果您需要帮助,请说明您的确切要求,我会更新我的答案。

【讨论】:

  • @hammet 没问题。很高兴我能帮上忙。
【解决方案2】:

以下函数和调用该函数的子函数将您的公式插入到具有指定范围作为参数的单元格中。您可以将其设置为任何单元格。

Sub evaluate()
Dim x As Range
Dim blah As String
Set x = Sheets("Sheet1").Range("A2")
blah = Formulaz(x)
Range("A3").Formula = blah
End Sub

Public Function Formulaz(x As Range)
Formulaz = "=43.025 *" & x.Address & "^-0.452"
End Function

要将其更改为采用字符串,您可以简单地修改如下:

Dim x As String
Dim blah As String
x = Range("A2").Value
blah = Formulaz(x)
Range("A3").Formula = blah
End Sub

Public Function Formulaz(x As String)
Formulaz = "=43.025 *" & x & "^-0.452"
End Function

这会产生相同的结果(将公式插入单元格并显示解决方案),但它将单元格的值作为参数。

正如 OP 所说,这不是所需要的,也许这样效果更好:

Sub evaluate()
Dim x As String
Dim blah As String
x = "5"
blah = Formulaz(x)
Debug.print blah
End Sub

Public Function Formulaz(x As String)
Formulaz = 43.025 * x ^ -0.452
End Function

它返回以 x 作为参数传递的表达式的值。 x = 5 的输出将是 20.78674 作为字符串存储在 Blah 中。

【讨论】:

  • 这不是我需要的,抱歉。
  • @hammet 你能详细说明一下吗?它可以满足您在问题中所说的需要。这种方法可以很容易地适应不同的输出和输入。
  • @hammet 答案已更新,更接近您的要求。如果这仍然不是您需要的,请考虑编辑您的问题。
猜你喜欢
  • 2014-01-02
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
相关资源
最近更新 更多