亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當第一個為false時,VBA“和”運算符是否會評估第二個參數?

當第一個為false時,VBA“和”運算符是否會評估第二個參數?

浮云間 2019-11-20 10:47:35
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,但是and之后的語句仍在評估中。這使我在運行時出現下標超出范圍錯誤。VBA是否真的繼續評估And的第二個參數,即使第一個參數為假?
查看完整描述

3 回答

?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

正如DOK提到的:不,VBA沒有短路評估。


從技術上講,使用2條If-then語句而不是使用AND運算符會更有效,但是除非您多次這樣做,否則您不會注意到節省的地方,因此請選擇可讀性更高的內容。而且,如果您想真正掌握技術,VBA的處理多個If-then語句的速度也要比處理這些語句快Select Case。


VBA古怪:)


查看完整回答
反對 回復 2019-11-20
?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

答案是肯定的,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


查看完整回答
反對 回復 2019-11-20
?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

您正在尋找的被稱為“ 短路評估 ”。


VBA沒有它。


您可以在此處看到可能適合您情況的方法。


這是選擇參與有一個替代的方法Select Case為If。還有一個使用nested的示例Ifs。


查看完整回答
反對 回復 2019-11-20
  • 3 回答
  • 0 關注
  • 621 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號