excel - reminder - vba不等於




當第一個參數為假時,VBA“And”運算符是否會計算第二個參數? (4)

VBA確實有一種類似短路的行為。 通常Null通過表達式傳播,例如。 3 + NullNullTrue And NullNull 。 然而:

? False And Null
False

這看起來像短路行為 - 發生了什麼? 當連接的另一個參數( And )為False0時, Null不會傳播 - 結果只是False0 。 如果它是左或右參數並不重要。 如果析取( Or )的另一個參數為True或非零整數(浮點值將使用此規則舍入為整數),則同樣適用。

因此,在AndOr參數中不能防止副作用和錯誤,但是Null傳播可以“短路”。 此行為似乎是從SQL繼承的。

Function Foo(thiscell As Range) As Boolean
  Foo = thiscell.hasFormula And (InStr(1, UCase(Split(thiscell.formula, Chr(40))(0)), "bar") > 0)
End Function

此函數用於在(。)之前測試某個子字符串(在本例中為bar)的存在。

我遇到問題的情況是當傳入函數的單元格為空時,thisCell.hasFormula為false,但是仍然正在評估和之後的語句。 這給了我運行時超出範圍錯誤的下標。

VBA是否真的繼續評估And的第二個參數,即使第一個參數是假的?


您正在尋找的是“ 短路評估 ”。

VBA沒有它。

您可以here看到可能適合您的情況的方法。

在那裡選擇的方法涉及用一個Select Case代替If 。 還有一個使用嵌套Ifs的示例。


正如DOK所說 :不,VBA沒有短路評估。

使用2個If-then語句而不是使用AND運算符在技術上更有效,但除非你多次這樣做,否則你不會注意到節省,所以選擇更具可讀性的東西。 如果你想獲得真正的技術,VBA也會比Select Case更快地處理多個If-then語句。

VBA很古怪:)


答案是肯定的,VBA沒有進行短路評估。

這不僅僅是風格問題; 它在這種情況下會產生很大的不同:

If i <= UBound(Arr, 1) And j <= UBound(Arr, 2) And Arr(i, 1) <= UBound(Arr2, 1) Then
    Arr2(Arr(i, 1), j) = Arr(i, j)
End If

......這是不正確的。 更恰當的是:

If i <= UBound(Arr, 1) And j <= UBound(Arr, 2) Then
    If Arr(i, 1) <= UBound(Arr2, 1) Then
        Arr2(Arr(i, 1), j) = Arr(i, j)
    End If
End If

或者,如果您厭惡嵌套ifs:

If i > UBound(Arr, 1) Or j > UBound(Arr, 2) Then
    ' Do Nothing
ElseIf Arr(i, 1) > UBound(Arr2, 1) Then
    ' Do Nothing
Else
    Arr2(Arr(i, 1), j) = Arr(i, j)
End If




operators