2017-02-23 5 views
5

मैंने अभी तीन सप्ताह पहले वीबीए सीखना शुरू किया था, इसलिए मेरे कोड की आलोचना करने में संकोच न करें।वीबीए - आईआईएफ स्टेटमेंट सीडीएटी (संस्करण)

मैं IIF कथन का उपयोग करने के लिए क्या यदि बयान के अंदर है क्या करना चाहते हैं:

Dim rng_ModPlanStart as range 
Dim QueryDate as Variant 

Set rng_ModPlanStart = ThisWorkbook.ActiveSheet.Range("AH2:AH" & LastCell) 
rng_ModPlanStart(1).Offset(-1, 0).Value = "Module Planned Start" 

    For Each cl In rng_ModPlanStart 
     QueryDate = Application.VLookup(ActiveSheet.Range("E" & cl.Row), Sheets("Chamber Schedule").Range("B:U"), 20, False) 
     If Not ((IsError(QueryDate))) Then 
     cl.Value = DateDiff("d", CDate(QueryDate), Date) 
     End If 
    Next cl 

लेकिन मैं जब की तरह

IIF(IsError(QueryDate), "", DateDiff("d", CDate(QueryDate), Date)) 

IIF उपयोग करने के लिए क्योंकि VBA QueryDate सोचता है की कोशिश कर रहा कोई त्रुटि मिलती है एक तारीख नहीं है ... यह सीडीएटी फ़ंक्शन द्वारा सही होना चाहिए? मैं क्या खो रहा हूँ?

+0

संस्करण सबकुछ हो सकता है। क्या आपने कभी इसकी सामग्री जांच ली है? – RuDevel

उत्तर

6

आप इस के लिए IIf (या लगभग किसी भी IMHO के लिए) का उपयोग नहीं करना चाहते हैं। समस्या यह है कि IIf एक "कथन" नहीं है - यह फ़ंक्शन है। इसका मतलब है कि सभी पैरामीटर का मूल्यांकन से पहले किया गया है, वे IIf फ़ंक्शन पर पास किए गए हैं। इसलिए, यह (क्रम में) का मूल्यांकन करता है:

IsError(QueryDate) 
"" 
DateDiff("d", CDate(QueryDate), Date) 'This is still evaluated if IsError returns True. 

इसका मतलब है कि आप एक रनटाइम त्रुटि मिल जाएगा क्योंकि आप DateDiff कि क्या QueryDate एक त्रुटि है की परवाह किए बिना बुला लिया जाएगा।

IIf अन्य भाषाओं में एक टर्नरी अभिव्यक्ति की तरह नहीं है, इसलिए आप इसे गार्ड क्लॉज के लिए उपयोग नहीं कर सकते हैं।

+0

दिलचस्प, मुझे यह नहीं पता था। पूरी तरह से स्पष्टीकरण के लिए धन्यवाद! –

5

वीबीए के लॉजिकल ऑपरेटरों की तरह, IIF में short-circuiting semantic (सी और परिवार के विपरीत) नहीं है। इसलिए त्रुटि केस को If Then else कथन के साथ समान तरीके से संभाला नहीं जाता है।

IIF(IsError(QueryDate), "", DateDiff("d", CDate(QueryDate), Date)) 

यहाँ तक कि अगर IsError रिटर्न सच है, दूसरे मामले जिसमें शामिल CDate(QueryDate) मूल्यांकन किया जाएगा, एक रन-टाइम त्रुटि हो जाती है।

+1

धन्यवाद! मुझे लगता है मैंने सोचा कि यह कुशल लग रहा था लेकिन मैं गलत था! –