1

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

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

我的设置的简化示例-

  • DATA 有:ID、Dividend1、Dividend2、Divisor。DATA 上有 n 行。
  • DATA 上的一行示例可能是 ID="123"、Dividend1=5、Dividend2=7、Divisor=35。
  • 规则有:名称、公式、阈值。为简单起见,只有 .
  • 让我们设置为 Name="Example", Formula=[see below], 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 的内容并让它执行与宏的其余部分内联的代码?

4

2 回答 2

3

如果你有(说)

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 计算公式,因此如果您不使用限定符,请确保在运行时正确的工作表处于活动状态。

于 2013-05-23T17:28:43.007 回答
1

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

请参阅Ozgrid:命名公式

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

于 2013-05-23T15:48:22.880 回答