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

时间:2015-01-16 13:02:35

标签: excel vba excel-vba cell formula

我在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不接受我这个选项。

这可能是不可能的吗?

我真的很感激任何帮助!

2 个答案:

答案 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)它需要数据验证,因为如果你将垃圾传递给变量PatternEvaluate方法将失败;相反,在Gareth的解决方案中,只评估ANDOR,否则代码将跳过 - >更稳定;

2)这不是100%直观的:虽然Gareth的解决方案可以解释给一个10岁的孩子(因为它非常直接地理解),但这个需要(正如我们刚才所做的)更深入的分析才能正确理解它能做什么。 I.E。:您需要一行代码来编写它,但是您/其他将来需要处理它的人需要5-10分钟和一杯咖啡才能理解该语句要检查的内容。