编写一个包含比较运算符“=”的expression式作为子程序参数
我有一个Excel VBA中的子例程,它接受一个布尔值作为input。 如果单元格的值等于“是”,则布尔值应该为True
,否则为False
。
我已经知道我应该能够做到这样的事情:
Dim C as boolean If ActiveSheet.Range("A1") = "Yes" Then C = True End If dostuff(C)
但我宁愿更简洁。 我想要做这样的事情:
dostuff(ActiveSheet.Range("A1")="Yes")
我基本上要确保这个语句是作为一个逻辑expression式而不是一个赋值来评估的。
这会工作吗?
如果不是,那么在不使用if语句的情况下,最好/正确的方法是什么?
在VB中, =
只有在作为AssignmentStatements的标记或具有赋值的声明中出现时才是赋值。 (这个链接是针对VB.NET的,但是在这里适用于VBA。)
在所有其他情况下 – 只要=
出现在expression式 (或子expression式)中时,它总是被视为比较相等运算符并产生一个布尔值。
在这篇文章中,它被用作函数参数的expression式 。 因此它将按照要求工作。 不同的编码准则可能禁止这样的,但是这些与语义无关。
这些语法规则也解释了为什么在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)
是的,它会工作。 这将被视为一个考验,而不是一个任务。 这是每当在expression式中使用时=的运算符的语义(不像在C中,它有消除歧义的==运算符)