Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法执行单元格中包含的VBA代码?_Vba_Excel - Fatal编程技术网

有没有办法执行单元格中包含的VBA代码?

有没有办法执行单元格中包含的VBA代码?,vba,excel,Vba,Excel,我正在Excel中构建一个宏,以针对一组数据运行规则,并输出每一行是否通过规则。我希望能够在不改变宏的情况下添加、删除或更改规则。因此,我有一个数据工作表和一个规则工作表,宏生成输出工作表,然后填充它 设置规则,以便在不同的行上枚举每个不同的规则。为此,我需要能够在“规则”中输入与规则相关的实际VBA代码,然后我需要让宏查看“规则”列并在单元格中执行代码 我的设置的简化示例- 数据有:ID、Dividend1、Dividend2、除数。数据上有n行。 数据行的示例可能是ID=123、Divide

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

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

我的设置的简化示例-

数据有:ID、Dividend1、Dividend2、除数。数据上有n行。 数据行的示例可能是ID=123、Dividend1=5、Dividend2=7、divisior=35。 规则有:名称、公式、阈值。为了简单起见,只有一个。 让我们将其设置为Name=Example,Formula=[见下文],Threshold=0.15 Threshold用于宏中的条件格式设置,在本例中未使用。 我将在公式中使用伪代码,这样就不需要解释到目前为止宏中一些不相关的细节。公式应包含一行执行以下操作的VBA代码-

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

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

您可以将测试/规则作为Excel工作表公式存储在指定范围内。然后你就从牢房里给他们打电话


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

您可以将测试/规则存储为命名范围内的Excel工作表公式。然后你就从牢房里给他们打电话

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

如果你说

IF({dividend1}="",{dividend2}/{divisor},{dividend1}/{divisor}) 
存储在规则单元格注释中的不包括=,可以使用“替换”将占位符替换为要检查的行中每个单元格的相关单元格地址

然后使用类似

Dim val

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

If Not IsError(val) Then
    'check against thresholds etc
End If
如果计算结果出现错误,您可以使用IsErrorval进行测试,如图所示,否则它将返回公式的结果,您可以使用阈值单元格进行测试。如果在阈值单元格上设置背景色,则可以根据超出阈值的行对每一行进行着色

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

如果您有话要说

IF({dividend1}="",{dividend2}/{divisor},{dividend1}/{divisor}) 
存储在规则单元格注释中的不包括=,可以使用“替换”将占位符替换为要检查的行中每个单元格的相关单元格地址

然后使用类似

Dim val

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

If Not IsError(val) Then
    'check against thresholds etc
End If
如果计算结果出现错误,您可以使用IsErrorval进行测试,如图所示,否则它将返回公式的结果,您可以使用阈值单元格进行测试。如果在阈值单元格上设置背景色,则可以根据超出阈值的行对每一行进行着色


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

看起来您这样做是错误的。。。为什么不在VBA中将每个规则建立为一个布尔函数,然后在您的行范围内迭代,并针对所有函数测试每个规则呢。然后,您可以轻松地修改一个或多个函数,就像操作工作表单元格中的文本一样简单。我可以看到您试图执行的操作,但我无法理解您的伪代码。它应该做什么?我会将测试存储为Excel工作表公式,并为要插入的特定值设置占位符。然后用单元格地址替换每行的占位符:使用Evaluate运行公式并返回结果。@JonnyP我也喜欢我的方法:但如果它是针对非VBA用户的应用程序,那么Tim的方法会更好。只要你能相信用户不会弄乱工作表公式。根据我的经验,这可能是不合理的。给人们一种方法来破坏一个输入,他们就会破坏这个输入:看起来你走错了方向。。。为什么不在VBA中将每个规则建立为一个布尔函数,然后在您的行范围内迭代,并针对所有函数测试每个规则呢。然后,您可以轻松地修改一个或多个函数,就像操作工作表单元格中的文本一样简单。我可以看到您试图执行的操作,但我无法理解您的伪代码。它应该做什么?我会将测试存储为Excel工作表公式,并为要插入的特定值设置占位符
进来。然后用单元格地址替换每行的占位符:使用Evaluate运行公式并返回结果。@JonnyP我也喜欢我的方法:但如果它是针对非VBA用户的应用程序,那么Tim的方法会更好。只要你能相信用户不会弄乱工作表公式。根据我的经验,这可能是不合理的。给人们一种方法来破坏输入,他们就会破坏输入: