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

Use a cell value (text) as a part of a formula in Excel VBA

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

难道这不可能吗?

非常感谢任何帮助!

我希望在另一个 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 的解决方案,也有一个技巧可以通过使用 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 块,因为它更清楚你在做什么,如果用户插入无效的逻辑运算符或只是拼写错误,它也不会崩溃;如果你不想/不能稍微 re-design 你的代码,你应该考虑这个选项。

公式解释 - 提问者需要

Evaluate()Applicationobject的一个方法,意思是objectMS Excel。这个方法很简单:

input: string
output: evaluation of the string

它实际上用于 "evaluate" 用户插入的字符串 就像您在单元格中键入公式时所做的那样 。如果您在单元格中键入“=3+4”,您基本上是在键入 Application.Evaluate("3+4")。这将 return 你 7,因为它是你提供的字符串评估的结果。

这个built-in非常非常强大,因为它使用了一个非常统一的系统(MSExcel的系统)来解析和评估任何字符串Excel 可以评价。此外,评估始终使用英语(您可以使用英语函数 IF 但不能使用意大利语 SE,也不能使用德语 WENN 或法语 SI 因为该方法评估好像您的 Excel 是英文的 是独立于系统的。

另一方面,Chr(34) 只是 return 字符 "。这个字符很难在VBA中使用,因为它通常需要分隔字符串(例如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")"

所以,一旦我们有了 built-up 这个字符串,我们就将它传递给 Evaluate 方法:就像我们将 =AND("NO"="NO","YES"="NO") 写入 Excel 单元格一样。结果会怎样?显然它取决于您的变量,但在本例中它将是 FALSE,因此不会输入 If - Then 块,因为 return 值为 false。否则,它将被输入。

这不是 "wrong" 方法,但正如我所说,它只有两个可能的缺点:

1) 它需要数据验证,因为如果你将废话传递给变量 PatternEvaluate 方法将失败;相反,在 Gareth 的解决方案中,只会评估 ANDOR,否则代码将跳过 --> 更稳定;

2) 这不是 100% 直观:虽然 Gareth 的解决方案可以解释给 10 岁的孩子 child(因为它非常非常 straight-forward 难以理解),但这个需要(因为我们只是做了)更深入的分析以正确理解它的作用。 I.E.:你需要一行代码来编写它,但是 you/someone else 将来必须对其进行处理将需要 5-10 分钟和一杯咖啡来理解语句想要检查的内容。