2010-07-14 3 views
32

में मैं निम्न कार्य करके मेरी एक्सेल मैक्रो में के साथ एक आलसी मूल्यांकन पाने के लिए कोशिश कर रहा हूँ 'और':andalso/OrElse VBA

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

मैं जानता हूँ कि आलसी मूल्यांकन AndAlso और OrElse के रूप में VB.NET में मौजूद है लेकिन वीबीए में कुछ भी नहीं मिल सकता है। यदि वीबीए में आलसी मूल्यांकन मौजूद नहीं है, तो कोड को ढूढ़ने का सबसे अच्छा तरीका क्या है जिससे कि मैं जिस तरह से उम्मीद करूँगा उसका मूल्यांकन करेगा?

+6

सादा वीबी 6 जैसे वीबीए में शॉर्ट सर्किट मूल्यांकन नहीं है –

+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

मुझे लगता है कि अगर मेरा ऑब्जेक्ट कुछ भी नहीं है, तो वह और भी स्थिति को निष्पादित करना चाहता है, जिसका अर्थ है कि आपको 'अन्य' कुछ और करने के लिए डुप्लिकेट करना होगा। – BenV

+0

@ बेनवी, @ डिक मैंने सही कोड (मुझे विश्वास है) के जवाब को संपादित करने की स्वतंत्रता ली। मैं बेनवी – MarkJ

+0

@ मार्कज से सहमत हूं: मुझे लगता है कि वह कुछ और करना चाहता है यदि मेरा ऑब्जेक्ट कुछ भी नहीं है लेकिन 'myObject.test()' झूठा रिटर्न देता है। – BenV

2

या आप एक ऐसा फ़ंक्शन बना सकते हैं जो आपके ऑब्जेक्ट को पैरामीटर के रूप में ले ले और किसी भी मामले के लिए बूलियन लौटाता हो। मैं आमतौर पर यही करता हूं।

अर्थात

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

मुझे नहीं लगता कि यह काम करेगा। यदि 'objMyAwesomeObject नहीं है' कुछ भी नहीं है 'सत्य' का मूल्यांकन करता है, तो पहला 'ElseIf' कथन कभी निष्पादित नहीं होगा। हालांकि, अगर 'objMyAwesomeObject कुछ भी नहीं है' = झूठी ('objMyAwesomeObject कुछ भी नहीं है '= सही), तो पहला' 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 कुछ भी नहीं है, तो यह काम नहीं कर सकता चाहते हैं।