AndAlso / OrElse в VBA - PullRequest
       19

AndAlso / OrElse в VBA

40 голосов
/ 14 июля 2010

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

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

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

Ответы [ 7 ]

50 голосов
/ 14 июля 2010

Единственное короткое замыкание (в некотором роде) находится в пределах 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
11 голосов
/ 12 декабря 2013

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

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 голосов
/ 13 марта 2012

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

т.е.

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
2 голосов
/ 09 июня 2015

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

If myObject.test() Then do something

Тогда синтаксис с одной линией может быть использован для короткого замыкания оценки. Ниже первый оператор If гарантирует, что myObject является чем-то. В противном случае он даже не попытается оценить второй If.

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

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

0 голосов
/ 24 февраля 2019

Может помочь хитрость вокруг пропущенных значений:

Dim passed, wrongMaxPercent, wrongPercent, rightMinPercent, rightPercent
wrongPercent = 33
rightPercent = 55

'rightMinPercent = 56
wrongMaxPercent = 40

passed = (Len(wrongMaxPercent) = 0 Or wrongPercent < wrongMaxPercent) And _
         (Len(rightMinPercent) = 0 Or rightPercent >= rightMinPercent)
0 голосов
/ 22 августа 2018

Улучшение этого ответа на другой вопрос о той же основной проблеме, вот что я решил сделать:

dim conditionsValid as boolean

conditionsValid = myObject Is Nothing
if conditionsValid then conditionsValid = myObject.test()
if conditionsValid then conditionsValid = myObject.anotherTest() 

if conditionsValid then
   'do something'
else
   'do something else'
end if

Я думаю, что этот код более понятен, чем другие предложенные ответы, и вам (обычно) не нужна отдельная переменная для каждой проверки, которая является улучшением по сравнению с первоначальным ответом на другой вопрос. Кстати, каждое новое условие добавляет только одну строку кода.

0 голосов
/ 14 июля 2010
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 отлично?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...