在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,因为如果你将垃圾传递给variablesPattern
, Evaluate
方法将失败; 在Gareth的解决scheme中,相反,只有AND
和OR
将被评估,否则代码将跳过 – >更多的稳定性;
2)这不是100%的直觉:加雷思的解决scheme可以解释给一个10岁的孩子(因为它非常非常直截了当地理解),这需要(就像我们刚刚做的)更深入的分析,以正确理解它是什么。 IE:你需要一行代码来写,但你/别的将来需要处理的东西需要5-10分钟,喝一杯咖啡才能理解语句要检查的内容。