在 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()
是Application
object的一个方法,意思是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) 它需要数据验证,因为如果你将废话传递给变量 Pattern
, Evaluate
方法将失败;相反,在 Gareth 的解决方案中,只会评估 AND
和 OR
,否则代码将跳过 --> 更稳定;
2) 这不是 100% 直观:虽然 Gareth 的解决方案可以解释给 10 岁的孩子 child(因为它非常非常 straight-forward 难以理解),但这个需要(因为我们只是做了)更深入的分析以正确理解它的作用。 I.E.:你需要一行代码来编写它,但是 you/someone else 将来必须对其进行处理将需要 5-10 分钟和一杯咖啡来理解语句想要检查的内容。
我在 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()
是Application
object的一个方法,意思是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) 它需要数据验证,因为如果你将废话传递给变量 Pattern
, Evaluate
方法将失败;相反,在 Gareth 的解决方案中,只会评估 AND
和 OR
,否则代码将跳过 --> 更稳定;
2) 这不是 100% 直观:虽然 Gareth 的解决方案可以解释给 10 岁的孩子 child(因为它非常非常 straight-forward 难以理解),但这个需要(因为我们只是做了)更深入的分析以正确理解它的作用。 I.E.:你需要一行代码来编写它,但是 you/someone else 将来必须对其进行处理将需要 5-10 分钟和一杯咖啡来理解语句想要检查的内容。