关于VBA(PowerPoint环境)中AND逻辑运算符的条件求值是否支持短路特性的疑问
关于VBA(PowerPoint环境)中AND逻辑运算符的条件求值是否支持短路特性的疑问
嗨,这个问题问得特别典型,不少刚摸VBA的朋友都会在逻辑运算这里踩坑~我来给你理清楚:
首先明确一点:**VBA里的标准AND运算符是不支持“短路求值”**的——也就是说,不管前面的条件是真还是假,它都会把AND两边的所有条件全部评估一遍,再得出最终的布尔结果。这和咱们常见的Java、C#里的&&不一样,那些语言会在前面条件为假时直接跳过后面的判断。
结合你的例子来看:
当没有任何内容被选中时,ActiveWindow.Selection.Type肯定不等于ppSelectionShapes,这时候:
- 在Case 1的代码里:
With ActiveWindow.Selection If (.Type = ppSelectionShapes) AND (.ShapeRange.Count = 1) Then ' do things with just one shape selected End If End With
VBA会先判断.Type = ppSelectionShapes(结果为False),但它不会停下来,还会继续去执行.ShapeRange.Count的判断。可这时候当前选择根本不是形状,访问ShapeRange属性直接就会触发错误,程序崩掉。
- 而Case 2的嵌套If写法就安全得多:
With ActiveWindow.Selection If (.Type = ppSelectionShapes) Then If .ShapeRange.Count = 1 Then ' do things with just one shape selected End If End If End With
第一个If判断不通过时,直接跳过了后面的ShapeRange.Count判断,自然不会触发错误——这其实就是咱们手动实现了“短路”的效果。
另外纠正你一个小误解:False AND False的结果还是False,不是True哦~逻辑运算的结果依然符合布尔规则,只是VBA会把所有条件都计算完再得出结果,而不是提前终止。
最后补充个小技巧:如果你用的是Office 2010及以后的版本(对应VBA 7.0+),可以用AndAlso运算符替代AND,它是支持短路求值的。比如写成:
If (.Type = ppSelectionShapes) AndAlso (.ShapeRange.Count = 1) Then
这样前面条件为假时,后面的判断会直接跳过,既简洁又安全~
备注:内容来源于stack exchange,提问作者MyICQ
相关产品推荐
相关产品推荐

