编写包含比较运算符的表达式" ="作为子程序参数

时间:2015-09-16 22:31:47

标签: excel vba excel-vba

我在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语句的情况下执行此操作的最佳/正确方法是什么?

2 个答案:

答案 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)