我在Excel VBA中有一个子程序,它以布尔值作为输入。如果单元格的值等于"是",则布尔值应为True
,否则为False
。
我已经知道我应该可以这样做:
Dim C as boolean
If ActiveSheet.Range("A1") = "Yes" Then
C = True
End If
dostuff(C)
但我希望更简洁。我想做这样的事情:
dostuff(ActiveSheet.Range("A1")="Yes")
我基本上想确保将语句评估为逻辑表达式而不是赋值。
这样可行吗?
如果没有,那么在不使用if语句的情况下执行此操作的最佳/正确方法是什么?
答案 0 :(得分:1)
是的,它会起作用。它将被视为一项测试,而不是一项任务。这是在表达式中使用时=运算符的语义(与C不同,它具有用于消歧的==运算符..)
答案 1 :(得分:1)
在VB中,=
只有 作为AssignmentStatements的标记或带有赋值的声明中的赋值。 (该链接适用于VB.NET,但它在这里适用于VBA。)
在所有其他情况下 - 只要{em>表达式(或子表达式)中出现=
- 它总是被视为比较相等运算符并产生一个布尔值。
在帖子中,它在表达式中找到,用作函数的参数;因此它将按照需要工作。不同的编码指南可能会禁止这样做,但那些与语义无关。
这些语法规则也解释了为什么人们不能在VB中“链分配”。
因此它按预期工作:
dostuff(ActiveSheet.Range("A1") = "Yes")
'[-- function call ---------------------]
' [-- expression ---------------]
' ^-- '=' as comparison
编写代码的另一种方法,如果不喜欢参数中的比较:
Dim C as boolean = ActiveSheet.Range("A1") = "Yes"
'[-- declaration with assignment -----------------]
' ^-- '=' for assignment
' [-- expression ---------------]
' ^-- '=' as comparison
dostuff(C)