编写一个包含比较运算符“=”的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中,它有消除歧义的==运算符)