在Excel VBA中使用单元格值(文本)作为公式的一部分

在Excel VBA中执行macros时出现问题,看起来很简单,但是我无法find答案。

我想要的是根据具体单元格的值来更改公式; 该单元格位于C7中,可以具有文本OR或文本AND。 公式的一部分是(被CritEUs和CritSKUsstringvariables):

If CritEUs = "NO" (OR/AND) CritSKUs = "NO" Then .... (whatever) 

所以我想改变OR / AND取决于C7中的值,我试图使用INDIRECT,但我认为它只适用于数字,以及以下(作为工作表variables):

 Dim Pattern As String Pattern = W.Range("C7").Value If CritEUs = "NO" " & Pattern & " CritSKUs = "NO" Then 

但Excel不接受我这个选项。

难道这不可能?

我真的很感激任何帮助!

我希望在另一个if语句中处理这个问题,然后嵌套下一个if语句,如下所示:

 Sub Example() Dim Pattern As String Pattern = W.Range("C7").Value If Pattern = "AND" Then If CritEUs = "NO" And CritSKUs = "NO" Then 'Do Something' End If ElseIf Pattern = "OR" Then If CritEUs = "NO" Or CritSKUs = "NO" Then 'Do Something' End If End If End Sub 

即使我非常喜欢 Gareth的解决scheme,但是通过使用Application.Evaluate()方法来执行你想要的(即评估条件)还有一个技巧。 这将是:

 If Application.Evaluate(Pattern & "(" & Chr(34) & CritEUs & Chr(34) & "=" & Chr(34) & "NO" & Chr(34) & "," & Chr(34) & CritSKUs & Chr(34) & "=" & Chr(34) & "NO" & Chr(34) & ")") Then 

…其中string是一个expression式,例如=AND(whatever = "NO", whateverelse = "NO")=OR(whatever = "NO", whateverelse = "NO") (取决于variables的值Pattern ),无论系统语言是什么,都可以通过MS Excel应用程序进行评估。

但正如我所说,我个人更喜欢嵌套的if块作为Garethbuild议,因为它更清楚你在做什么,它不能崩溃,如果用户插入一个无效的逻辑运算符或只是拼写错误; 你应该考虑这个选项,如果你不想/不能稍微重新devise你的代码。

公式说明 – 要求提问者

Evaluate()Application对象的一个​​方法,这意味着对象MS Excel 。 这种方法非常简单:

 input: string output: evaluation of the string 

它实际上用来评估用户插入的string, 就像在公式中input一个单元格一样 。 如果你input一个单元格“= 3 + 4”,你基本上是inputApplication.Evaluate("3+4") 。 这将返回你7 ,因为这是你提供的string评估的结果。

这个内置function非常强大,因为它使用了一个非常整合的系统(MS Excel)来parsing和评估Excel可以评估的任何string 。 此外,评估总是以英语进行(您可以使用英语函数IF但不使用意大利语SE ,也不使用德语WENN或法语SI因为该方法评估您的Excel似乎是英语系统独立的。

另一方面, Chr(34)只是返回字符" ,这个字符在VBA中很难使用,因为它通常需要分隔string(例如a = "first" & "second" ,然而,你需要这个字符在要评估的string内部,所以我只是用Chr(34)调用它来避免编译器的混淆。

概要:

string正在像这样构build:

 Pattern & "(" & Chr(34) & CritEUs & Chr(34) & "=" & Chr(34) & "NO" & Chr(34) & "," & Chr(34) & CritSKUs & Chr(34) & "=" & Chr(34) & "NO" & Chr(34) & ")" 

存在…

 Pattern = AND or OR Chr(34) = " 

…我们正在build造的弦乐将会是这样的(只是一个可能的结果):

 "AND("NO"="NO","YES"="NO")" 

所以,一旦我们build立了这个string,我们将它传递给Evaluate方法:就像我们在Excel单元格中写入=AND("NO"="NO","YES"="NO") 。 结果会是什么? 显然这取决于你的variables,但在这种情况下,它将是FALSE ,所以If - Then块将不会被input,因为返回值是假的。 否则,它将被input。

这不是一个“错误”的方法,但正如我所说,它只有两个可能的缺点:

1)它需要数据validation,因为如果你将垃圾传递给variablesPatternEvaluate方法将失败; 在Gareth的解决scheme中,相反,只有ANDOR将被评估,否则代码将跳过 – >更多的稳定性;

2)这不是100%的直觉:加雷思的解决scheme可以解释给一个10岁的孩子(因为它非常非常直截了当地理解),这需要(就像我们刚刚做的)更深入的分析,以正确理解它是什么。 IE:你需要一行代码来写,但你/别的将来需要处理的东西需要5-10分钟,喝一杯咖啡才能理解语句要检查的内容。