AndAlso / OrElse в VBA

32

Я пытаюсь получить ленивую оценку с помощью "И" в своем макросе Excel, выполнив следующее:

If Not myObject Is Nothing *And* myObject.test() Then
    'do something'
Else
    'do something else'
End If

Я знаю, что ленивая оценка существует в VB.NET как AndAlso и OrElse, но не может найти ничего подобного в VBA. Если в VBA нет ленивой оценки, какой лучший способ структурировать код так, чтобы он оценивал то, что я ожидаю?

  • 6
    VBA, как обычный VB6, не имеет оценки короткого замыкания
  • 0
    Спасибо, я решил свою проблему без решения этой проблемы, но мне все еще интересно, что делать в этой ситуации. Я не удивлюсь, если я упущу что-то действительно очевидное, но я не могу найти хороший способ сделать это без переписывания кода, то есть иметь один и тот же код в двух других случаях.
Теги:

5 ответов

43
Лучший ответ

Единственное короткое замыкание (сортировки) находится в оценке выражения 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
9

Это старый вопрос, но этот вопрос все еще жив и здоров. Один обходной путь, который я использовал:

Dim success As Boolean       ' False by default.

If myObj Is Nothing Then     ' Object is nothing, success = False already, do nothing.
ElseIf Not myObj.test() Then ' Test failed, success = False already, do nothing.
Else: success = True         ' Object is not nothing and test passed.
End If

If success Then
    ' Do stuff...
Else
    ' Do other stuff...
End If

Это в основном инвертирует логику в исходном вопросе, но вы получаете тот же результат. Я думаю, что это более чистое решение, чем другие, которые используют только выражения If. Решение с использованием оператора Select является умным, но если вы хотите использовать альтернативу только с инструкциями If, я думаю, что это тот, который нужно использовать.

3

Или вы можете создать функцию, которая берет ваш объект в качестве параметра и возвращает значение boolean для любого из этих случаев. Это то, к чему я обычно привык.

то есть.

if Proceed(objMyAwesomeObject) then
       'do some really neat stuff here
else
       'do something else, eh
end if
...
end sub

private function Proceed(objMyAwesomeObject as Object)
     if not objMyAweseomeObject is nothing then
            Proceed = true
     elseif objMyAwesomeObject.SomeProperty = SomeValue then
            Proceed = true
     else
            Proceed = false
     endif
end function
  • 1
    Я не думаю, что это сработает. Если Not objMyAwesomeObject Is Nothing оценивается как True , то первый оператор ElseIf никогда не будет выполнен. Однако если Not objMyAwesomeObject Is Nothing = False ( objMyAwesomeObject Is Nothing = True), то первый оператор ElseIf будет выполнен и вызовет ошибку, потому что вы пытаетесь получить доступ к свойству objMyAwesomeObject которое Is Nothing .
0

Так как следующий синтаксис работает

If myObject.test() Then do something

Вы можете попробовать

If Not myObject Is Nothing Then If myObject.test() Then
    'do something'
Else
    'do something else'
End If

Конечно, если вы хотите "сделать что-то еще", если myObject Is Nothing, то это может не сработать.

0
If Not myObject Is Nothing Then
    If myObject.test() Then
        'do something'
    End If
Else
   'do something else'
End If

Я думаю, что вы должны это сделать.

Edit

Может быть, это

Dim bTestsFailed as Boolean
bTestsFailed = False

If Not myObject Is Nothing Then
    If myObject.test() Then
        'do something'
    Else
        bTestsFailed = True
    End If
Else
   bTestsFailed = True
End If

If bTestsFailed Then
    'do something else
End If

Не большой VBA?

  • 0
    Я думаю, что он хочет, чтобы условие else также выполнялось, если myObject Is Nothing, то есть вы должны дублировать Else 'do something else' .
  • 0
    @BenV, @Dick Я взял на себя смелость отредактировать ответ, чтобы (я считаю) правильный код. Я согласен с BenV
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню