2010-07-14 2 views
32

Я пытаюсь получить ленивые оценки с «А» в моем макросе Excel, выполнив следующие действия:AndAlso/OrElse в VBA

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

Спасибо, я решил свою проблему без решения этого вопроса, но мне все еще любопытно, что делать в этой ситуации. Я не удивлюсь, если я упустил что-то действительно очевидное, но я не могу найти хороший способ сделать это без перезаписи кода, т. Е. Иметь тот же код в двух разных случаях. – Luis

ответ

42

Единственное короткое замыкание (из рода) находится в пределах 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 
-1
If Not myObject Is Nothing Then 
    If myObject.test() Then 
     'do something' 
    End If 
Else 
    'do something else' 
End If 

Я думаю, что так вам и нужно.

Редактировать

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

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 'делать что-то еще'. – BenV

+0

@BenV, @Dick Я взял на себя смелость отредактировать ответ на (верю) правильный код. Я согласен с BenV – MarkJ

+0

@MarkJ: Я думаю, он также хочет, чтобы «что-то еще» произошло, если myObject не ничего, но 'myObject.test()' возвращает False. – BenV

2

Или вы можете создать функцию, которая берет ваш объект в качестве параметра и возвращает значение 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 
+0

Я не думаю, что это сработает. Если 'Not objMyAwesomeObject Is Nothing' оценивает' True', то первый оператор 'ElseIf' никогда не будет выполняться. Однако, если 'Not objMyAwesomeObject Is Nothing' = False (' objMyAwesomeObject Is Nothing' = True), то первый оператор 'ElseIf' будет выполняться и будет вызывать ошибку, потому что вы пытаетесь получить доступ к свойству в' objMyAwesomeObject', который ' Ничего. – neizan

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, я думаю, что это тот, который нужно использовать.

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, то это может не работать.