【问题标题】:Is there a way to execute VBA code contained in a cell?有没有办法执行单元格中包含的 VBA 代码?
【发布时间】:2013-05-23 15:00:13
【问题描述】:

我正在 Excel 中构建一个宏来针对一组数据运行规则并输出每行是否通过规则。我希望能够在不更改宏的情况下添加、删除或更改规则。因此,我有一个 DATA 工作表和一个 RULES 工作表,宏生成 OUTPUT 工作表,然后填充它。

RULES 设置为在不同的行上枚举每个不同的规则。为此,我需要能够在 RULES 中输入与规则相关的实际 VBA 代码,然后我需要让宏查看 RULES 上的该列并执行单元格中的代码。

我的设置的简化示例-

  • DATA 有:ID、Dividend1、Dividend2、Divisor。 DATA 上有 n 行。
  • DATA 上的一行示例可能是 ID="123"、Dividend1=5、Dividend2=7、Divisor=35。
  • 规则有:名称、公式、阈值。为简单起见,只有 .
  • 让我们将其设置为 Name="Example", Formula=[见下文], Threshold="0.15"(阈值用于宏中的条件格式,在本例中未使用。)

我将使用公式的伪代码,只是为了消除到目前为止解释我的宏的一些不相关细节的需要。 RULES.Formula 应包含一行 VBA 代码,用于执行-

If CurrentDATARow.Dividend1 = Empty Then
    CurrentDATARow.Dividend2 / CurrentDATARow.Divisor
Else
    CurrentDATARow.Dividend1 / CurrentDATARow.Divisor
End If

所以,所有这些解释只是为了给这个问题提供上下文:我可以在宏的 VBA 中做什么,以使其读取 RULES.Formula 的内容并使其执行与其余代码内联的代码宏?

【问题讨论】:

  • 似乎您的做法是错误的...为什么不在 VBA 中将每个 Rule 建立为布尔值 Function,然后遍历您的行范围并针对所有行进行测试什么功能。然后,您可以轻松地修改一个或多个函数——就像在工作表单元格中操作文本一样容易。
  • 我可以看到你想要做什么,但我无法理解你的伪代码。它应该做什么?
  • 我会将测试存储为 Excel 工作表公式,并带有要插入的特定值的占位符。然后用单元格地址替换每行的占位符:使用 Evaluate 运行公式并返回结果。
  • @JonnyP 我也喜欢我的方法 :) 但如果它是针对非 VBA 用户的应用程序,那么 Tim 的方法会更好。
  • 只要您可以依靠用户搞乱工作表公式。根据我的经验,这可能是不合理的。给人们搞砸输入的方法,他们就会搞砸输入:)

标签: vba excel


【解决方案1】:

如果你有(比如说)

IF({dividend1}="",{dividend2}/{divisor},{dividend1}/{divisor}) 

存储在“规则”单元格中(注意不要包含“=”),您可以使用Replace() 将占位符替换为您正在检查的行中每个单元格的相关单元格地址。

然后使用类似的东西

Dim val

val=Sheet1.Evaluate(yourformulastring) 'evaluate vs. specific worksheet

If Not IsError(val) Then
    'check against thresholds etc
End If

如果评估导致错误,您可以使用 IsError(val) 进行测试,如图所示,否则它将返回公式的结果,您可以针对“阈值”值单元格进行测试。如果您在阈值单元格上设置背景颜色,则可以根据超出的阈值为每一行着色。

注意如果没有工作表限定符,Evaluate 将根据 ActiveSheet 计算公式,因此如果您不使用限定符,请确保在运行时正确的工作表处于活动状态。

【讨论】:

    【解决方案2】:

    您可以将测试/规则作为 Excel 工作表公式存储在命名范围中。然后你只需从单元格中调用它们。

    Ozgrid: Named Formulas

    如果你给我们一些示例数据和计算类型或规则,我可以给你几个例子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多