我在Excel VBA中执行宏时遇到问题,看起来很简单,但我无法找到答案。
我想要的是根据具体细胞的值改变公式;单元格位于C7中,可以包含文本OR或文本AND。公式的一部分是(作为CritEUs和CritSKUs字符串变量):
If CritEUs = "NO" (OR/AND) CritSKUs = "NO" Then .... (whatever)
所以我想根据C7中的值更改OR / AND,我尝试使用INDIRECT,但我认为它仅适用于数字,以及以下(作为W工作表变量):
Dim Pattern As String
Pattern = W.Range("C7").Value
If CritEUs = "NO" " & Pattern & " CritSKUs = "NO" Then
但是Excel不接受我这个选项。
这可能是不可能的吗?
我真的很感激任何帮助!
答案 0 :(得分:3)
我希望在另一个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
答案 1 :(得分:1)
即使我非常喜欢 Gareth的解决方案,也可以通过使用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
...其中字符串是一个表达式,例如=AND(whatever = "NO", whateverelse = "NO")
或=OR(whatever = "NO", whateverelse = "NO")
(取决于变量Pattern
的值),可以由MS Excel应用程序评估,无论是系统语言是什么。
但正如我所说,我个人更喜欢Gareth建议的嵌套if块,因为它更清楚你正在做什么,如果用户插入一个无效的逻辑运算符或只是拼写错误就不会崩溃;如果您不想/不能稍微重新设计代码,您应该考虑这个选项。
公式解释 - 要求提供者
Evaluate()
是Application
对象的一种方法,它表示对象MS Excel
。这种方法非常简单:
input: string
output: evaluation of the string
它实际上用于“评估”用户插入的字符串,就像在单元格中键入公式时一样。如果您键入单元格“= 3 + 4”,则基本上键入Application.Evaluate("3+4")
。这将返回7
,因为它是您提供的字符串评估的结果。
这个内置功能非常强大,因为它使用一个非常统一的系统(MS Excel之一)来解析和评估 Excel可以评估的任何字符串。此外,评估始终使用英语(您可以使用英语函数IF
但不能使用意大利语SE
,也不能使用德语WENN
或法语SI
,因为该方法可以评估好像您的Excel是英文是系统无关的。
另一方面,Chr(34)
只是返回字符"
。在VBA中使用此字符是 hard ,因为它通常需要分隔字符串(例如a = "first" & "second"
。但是,您需要在字符串内部使用此字符进行评估所以我只是用Chr(34)
调用它来避免混淆编译器。
内容:
正在构建字符串:
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) = "
...我们正在构建的字符串将是这种类型(只是可能的结果):
"AND("NO"="NO","YES"="NO")"
因此,一旦我们构建了这个字符串,我们就将其传递给Evaluate
方法:就像我们将=AND("NO"="NO","YES"="NO")
写入Excel单元格一样。结果会是什么?显然它取决于你的变量,但在这种情况下它将是FALSE
,因此不会输入If - Then
块,因为返回值为false。否则,它将被输入。
这不是一种“错误”的方法,但正如我所说,它只有两个可能的缺点:
1)它需要数据验证,因为如果你将垃圾传递给变量Pattern
,Evaluate
方法将失败;相反,在Gareth的解决方案中,只评估AND
和OR
,否则代码将跳过 - >更稳定;
2)这不是100%直观的:虽然Gareth的解决方案可以解释给一个10岁的孩子(因为它非常直接地理解),但这个需要(正如我们刚才所做的)更深入的分析才能正确理解它能做什么。 I.E。:您需要一行代码来编写它,但是您/其他将来需要处理它的人需要5-10分钟和一杯咖啡才能理解该语句要检查的内容。