AndAlso/OrElse in VBA 在VBA中的AndAlso/OrElse

5 浏览
0 Comments

AndAlso/OrElse in VBA 在VBA中的AndAlso/OrElse

我正在尝试在我的Excel宏中使用\'And\'实现惰性求值,通过以下方式进行操作:\nIf Not myObject Is Nothing *And* myObject.test() Then\n \'做某事\'\nElse\n \'做其他事情\'\nEnd If\n\n我知道VB.NET中存在惰性求值的方式,如AndAlsoOrElse,但在VBA中找不到类似的东西。如果VBA中不存在惰性求值,最好的方式是如何构建代码,使其按照我期望的方式进行求值?

0
0 Comments

在VBA中,可以使用AndAlso和OrElse运算符来实现逻辑与和逻辑或的功能。然而,有时候在使用这些运算符时会遇到一些问题。

上面的代码展示了一种处理这个问题的方法。可以创建一个函数,该函数以对象作为参数,并根据条件返回一个布尔值。在主程序中,可以使用这个函数来判断是否执行某些操作。

然而,上面的代码存在一个问题。如果Not objMyAwesomeObject Is Nothing的结果为True,那么第一个ElseIf语句将永远不会执行。然而,如果Not objMyAwesomeObject Is Nothing的结果为False,那么第一个ElseIf语句将会执行,并且会引发一个错误,因为尝试访问一个为Nothing的对象的属性。

为了解决这个问题,可以对代码进行一些修改。可以将第一个ElseIf语句改为If语句,并且在其中添加对objMyAwesomeObject是否为Nothing的判断。这样,无论objMyAwesomeObject是否为Nothing,都会执行这个判断语句。

下面是修改后的代码:

if Proceed(objMyAwesomeObject) then
   'do some really neat stuff here
else
   'do something else, eh
end if
Private Function Proceed(objMyAwesomeObject As Object) As Boolean
   If Not objMyAwesomeObject Is Nothing And objMyAwesomeObject.SomeProperty = SomeValue Then
      Proceed = True
   Else
      Proceed = False
   End If
End Function

通过这种修改,可以确保在进行逻辑判断时不会引发错误,并且可以正确判断对象是否为Nothing以及对象属性的值是否符合条件。

0
0 Comments

在VBA中,有时需要根据一系列条件来判断程序的执行流程。常见的方式是使用If语句来进行条件判断。然而,使用传统的If语句存在一些限制,如无法同时判断多个条件,无法在条件判断中执行逻辑运算等。为了解决这些问题,VBA引入了AndAlso和OrElse运算符。

AndAlso运算符和And运算符类似,用于同时判断多个条件。与And运算符不同的是,AndAlso运算符在判断第一个条件为False时,会立即返回False,不再对后续条件进行判断。这样可以提高程序的执行效率。

OrElse运算符和Or运算符类似,用于判断多个条件中的任意一个是否为True。与Or运算符不同的是,OrElse运算符在判断第一个条件为True时,会立即返回True,不再对后续条件进行判断。这样可以提高程序的执行效率。

以上的代码示例中,使用了AndAlso运算符来同时判断两个条件。首先判断myObj是否为空,如果为空,则success的值已经是False,不需要进行后续判断;如果不为空,则继续判断myObj的test方法是否返回True。只有当两个条件都满足时,success的值才会变为True。

如果success的值为True,则执行相应的操作;如果success的值为False,则执行其他操作。

需要注意的是,上述代码中使用的是ElseIf语句。有一位用户提到在Word 2016 VBA中无法使用ElseIf语句,但实际上ElseIf是VBA的一部分,而不是特定宿主程序的一部分。因此,在任何宿主程序中,包括所有版本的Word,都可以使用ElseIf语句。如果在Word 2016 VBA中无法使用ElseIf语句,可能是其他地方出现了错误。

总结起来,AndAlso和OrElse运算符在VBA中的引入,解决了传统If语句在同时判断多个条件时的限制。通过使用这两个运算符,可以更加灵活和高效地进行条件判断和程序控制。

0
0 Comments

在VBA中,短路(short circuiting)仅在Case表达式的评估过程中发生,因此下面的冗长语句可以完成你所要求的功能:

Select Case True
    Case (myObject Is Nothing), Not myObject.test()
        MsgBox "no instance or test == false"
    Case Else
        MsgBox "got instance & test == true"
    End Select
End Sub

为了清晰起见,在Case中的逗号起到了“OrElse”的作用,但它从左到右检查条件,而不是从右到左。

“从右到左”听起来好像OrElse在VB.NET中从右到左评估条件。这是你的意思吗?因为我认为情况并非如此。

在VBA中,没有像VB.NET中的AndAlsoOrElse这样的运算符。这是因为在VBA中,逻辑运算符AndOr都会评估所有的条件,而不会在条件为真或假时停止评估。这导致了一些效率上的问题,特别是在条件较为复杂的情况下。

解决这个问题的方法是使用Select Case语句来模拟AndAlsoOrElse运算符的短路行为。在Case中,可以使用逗号来同时检查多个条件,从而实现短路行为。如果条件从左到右评估,并且在找到第一个为真的条件时停止评估其他条件。如果没有找到为真的条件,执行Case Else的代码块。

在VBA中模拟AndAlsoOrElse的短路行为需要使用Select Case语句,并在Case中使用逗号来同时检查多个条件。这样可以在找到第一个为真的条件时停止评估其他条件,从而提高效率。

0