2011-03-24 11 views
27

मुझे वीबीए (एक्सेस 2003) में "कंपाइलर त्रुटि" पर 30 मिनट का परेशान होना पड़ा है, जो कि मैंने उप-परिभाषित किए गए तर्कों के आस-पास के ब्रैकेट्स के उपयोग के कारण ब्रैकेट के उपयोग के कारण किया है।वीबीए फ़ंक्शन कॉल में ब्रैकेट के उपयोग को नियंत्रित करने वाले नियम क्या हैं?

मैं ब्रैकेट आवश्यक/उचित/अनुचित/वर्जित होने पर एक सभ्य लेख/ट्यूटोरियल/निर्देश ढूंढने के लिए खोज कर रहा हूं, लेकिन कोई स्पष्ट दिशानिर्देश नहीं मिल रहा है।

+2

यहाँ इस विषय पर मेरी पसंदीदा पोस्ट: http://dailydoseofexcel.com/archives/2012/05/01/quick-vba-tip-parentheses/ –

उत्तर

21

Here से:

VBScript कॉल वक्तव्य का उपयोग करते हुए एक उपनेमका कॉल बयान के उपयोग कॉल करने के लिए वैकल्पिक है जब आप एक सबरूटीन कॉल करना चाहते हैं है। सब के साथ उपयोग किए जाने पर कॉल स्टेटमेंट का उद्देश्य आपको ब्रांड्स में तर्क सूची को संलग्न करने की अनुमति देता है। हालांकि, अगर कोई सबराउटिन किसी भी तर्क को पास नहीं करता है, तो कॉल कॉल का उपयोग करते हुए उप को कॉल करते समय भी आपको ब्रांड्स का उपयोग नहीं करना चाहिए।

Call MySubroutine 

एक सबरूटीन तर्क हैं, तो आप जब कॉल कथन का उपयोग कोष्ठक का उपयोग करना होगा। यदि एक से अधिक तर्क हैं, तो आपको तर्कों को अल्पविराम से अलग करना होगा।

Call MySubroutine(intUsageFee, intTimeInHours, "DevGuru") 

समारोह कॉलिंग वहाँ एक समारोह कॉल करने के लिए दो संभव तरीके हैं। आप या तो फ़ंक्शन को सीधे नाम से कॉल कर सकते हैं, या आप VBScript कॉल स्टेटमेंट का उपयोग करके इसे कॉल कर सकते हैं।

जब नाम से सीधे एक समारोह बुला और नाम द्वारा एक समारोह कॉलिंग जब वहाँ एक दिए गए मान के लिए कोई काम है, निम्न में से सभी कानूनी वाक्य रचना कर रहे हैं:

MyFunction 
MyFunction() 
MyFunction intUsageFee, intTimeInHours, "DevGuru" 

आप एक लौटे चाहते हैं मान, आप एक चर को फ़ंक्शन असाइन कर सकते हैं। ध्यान दें कि यदि एक या अधिक तर्क हैं, तो आपको कोष्ठक का उपयोग करना होगा।

returnval = MyFunction 
returnval = MyFunction() 
returnval = MyFunction(intUsageFee, intTimeInHours, "DevGuru") 
+7

धन्यवाद - ऐसा लगता है कि मेरी समस्या यह थी क्योंकि मेरा फ़ंक्शन कोई मान नहीं लौटा रहा है, लेकिन मैं अभी भी अपनी तर्क सूची के आसपास ब्रैकेट का उपयोग कर रहा था।यह एक अजीब वाक्यविन्यास निर्णय लगता है ... – HorusKol

3

आप Call MySub का उपयोग करते हैं आप मापदंडों के आसपास कोष्ठक का उपयोग करना चाहिए, लेकिन अगर आप कॉल को छोड़ देते हैं, तो आप कोष्ठकों जरूरत नहीं है।

5

मैं बस, जबकि एक उप जो के माध्यम से

CallMe(argument) 

1 तर्क लेता यह पता चला है के रूप में बुला एक "असंगत प्रकार के" अपवाद पता लगाना 10 मिनट बिताए, यह अवैध है, googling मुझे यहाँ और अंत में नेतृत्व

Call CallMe(argument) 

या

CallMe argument 

चाल किया था। तो आपको कॉल-कथन के बिना उप को कॉल करते समय ब्रैकेट का उपयोग नहीं करना चाहिए जो केवल 1 तर्क लेता है।

+0

+ _1 उपनाम –

7

मुझे कुछ अजीब व्यवहार मिला है जिसमें बिना किसी ब्रांड्स के फ़ंक्शन को कॉल किया गया है। Google ने मुझे यहाँ ले लिया।

sub test() 
    dim a as double 
    a = 1# 
    p(a) 'this won't change a's value 
    Debug.Print a '1 
    p a ' this is expected behavior 
    Debug.Print a '2 
    Call p(a) 'this is also valid 
    Debug.Print a '3 
end sub 

Function p(a as Double) 'default is byref 
    a = a + 1 
end function 

मेरा निष्कर्ष आप का उपयोग या तो कॉल या जब केवल एक पैरामीटर के साथ एक समारोह बुला, अन्यथा पैरामीटर संदर्भ द्वारा पारित नहीं किया गया है (यह अभी भी कहा जाता हो रहा है, के रूप में मैं पहले ही जाँच) कोष्ठक को छोड़ते हुए करना है ।

+0

के लिए ब्रांड्स वास्तव में 'ByVal' पारित करने के लिए एक तर्क को मजबूर करता है। – RubberDuck

44

वीबी (ए) में पैंथेस नियम के लिए सही तर्क है, और यह इस तरह से चला जाता है।

यदि किसी प्रक्रिया (फ़ंक्शन या उप) को तर्क के साथ बुलाया जाता है, और कॉल अन्य कथन या कीवर्ड के साथ एक पंक्ति पर है, तो तर्क कोष्ठक में संलग्न होना चाहिए। यह शेष रेखा से प्रक्रिया कॉल से संबंधित तर्कों को अलग करने के लिए। तो:

1: If CheckConditions(A, B, C) = DONT_PROCEED Then Exit Sub 

एक वैध रेखा है; चेककंडिशन के लिए कॉल को इंगित करने के लिए कोष्ठक की आवश्यकता होती है कि लाइन के अन्य बिट्स इसके तर्क हैं। इसके विपरीत, यह एक वाक्यविन्यास त्रुटि उत्पन्न करेगा:

2: If CheckConditions A, B, C = DONT_PROCEED Then Exit Sub 

क्योंकि पार्स करना असंभव है।

लाइन पर केवल बयान के रूप में एक प्रक्रिया कॉल के साथ

, कोष्ठक की जरूरत नहीं है, क्योंकि यह स्पष्ट है कि तर्क प्रक्रिया कॉल से संबंधित हैं:

3: SaveNewValues Value1, Value2, Value3 

इस सिंटैक्स त्रुटि में परिणाम है (के लिए ध्वनि कारणों नीचे चर्चा):

4: SaveNewValues(Value1, Value2, Value3) 

कोष्ठक या कोई कोष्ठकों (वास्तव में के बारे में भ्रम की स्थिति से बचने के लिए कोष्ठक नियम पूरी तरह से बचने के लिए), यह हमेशा एक अच्छा विचार इस तरह की कॉल के लिए कॉल कीवर्ड का उपयोग करने के लिए है; कोष्ठक

5: Call SaveNewValues(Value1, Value2, Value3) 

तो अगर आप आत्म निहित प्रक्रिया पूर्ववर्ती करने की आदत डालना कॉल कीवर्ड के साथ कहता है, तुम भूल कर सकते हैं: कि कि प्रक्रिया कॉल लाइन पर केवल बयान, नहीं है इस प्रकार की आवश्यकता होती है कोष्ठकों सुनिश्चित करता है नियम, क्योंकि आप हमेशा अपने तर्कों को कोष्ठक में संलग्न कर सकते हैं।

इस मामले को वीबी (ए) (और कई अन्य भाषाओं) में अतिरिक्त भूमिका कोष्ठक द्वारा भ्रमित किया जाता है: वे अभिव्यक्तियों के लिए मूल्यांकन प्राथमिकता भी इंगित करते हैं। यदि आप किसी भी अन्य संदर्भ में ब्रांड्स का उपयोग करते हैं लेकिन प्रक्रिया कॉल तर्क संलग्न करने के लिए, वीबी (ए) को परिणामी सरल मान के लिए कोष्ठक में अभिव्यक्ति का मूल्यांकन करने का प्रयास करेगा।

इस प्रकार, उदाहरण में 4, जहां तर्कों को घेरने के लिए ब्रांड्स अवैध हैं, वीबी (ए) इसके बजाय कोष्ठक में अभिव्यक्ति का मूल्यांकन करने का प्रयास करेगा। चूंकि (वैल्यू 1, वैल्यू 2, वैल्यू 3) एक अभिव्यक्ति नहीं है जिसका मूल्यांकन किया जा सकता है, एक वाक्यविन्यास त्रुटि उत्पन्न होती है।

यह भी बताता है कि बायरफ को पारित करने वाले चर के साथ कॉल क्यों किया जाता है यदि तर्क कोष्ठक में संलग्न किया गया है।

6: p a 

और

जैसा कि ऊपर चर्चा, 6 सही है: ऊपर के उदाहरण है, जहां समारोह पी ByRef पैरामीटर एक साथ कहा जाता है, वहाँ पी करने के लिए इन दो कॉल के बीच एक बड़ा अंतर है वाक्यविन्यास: कॉल अपनी रेखा पर अकेला है, इसलिए तर्कों को घेरने के लिए ब्रांड्स का उपयोग नहीं किया जाना चाहिए।

7 में, तर्क किसी भी तरह से कोष्ठक में संलग्न है, जिससे वीबी (ए) को एक सरल मूल्य पर संलग्न अभिव्यक्ति का मूल्यांकन करने के लिए प्रेरित किया जाता है। निश्चित रूप से ByVal पास करने की बहुत परिभाषा है। कोष्ठक सुनिश्चित करते हैं कि एक पॉइंटर के बजाय, एक का मान पास हो गया है, और एक को अनमोडिफाइड छोड़ दिया गया है।

यह भी बताता है कि क्यों ब्रांड्स नियम हमेशा प्रभावित नहीं होता है।

8: MsgBox "Hello World!" 

और

9: MsgBox ("Hello World!") 

दोनों सही हैं, भले ही कोष्ठकों नियम तय है कि 9 गलत किया जाना चाहिए: स्पष्ट उदाहरण एक MsgBox कॉल है। यह निश्चित रूप से है, लेकिन ऐसा होता है कि वीबी (ए) कोष्ठक में अभिव्यक्ति का मूल्यांकन करता है। और स्ट्रिंग शाब्दिक सटीक समान स्ट्रिंग का मूल्यांकन करता है, ताकि वास्तविक कॉल 8 हो। दूसरे शब्दों में: स्थिर या स्ट्रिंग शाब्दिक तर्कों के साथ एकल-तर्क प्रक्रियाओं को कॉल करने के साथ समान परिणाम होते हैं या बिना किसी कोष्ठक के होते हैं। (यही कारण है कि मेरे MsgBox कॉल भी कॉल कीवर्ड द्वारा पहले हैं।)

अंत में, ऑब्जेक्ट तर्कों को पार करते समय यह अजीब टाइप मिस्चैच त्रुटियों और अजीब व्यवहार को बताता है। आइए मान लें कि आपके एप्लिकेशन में हाइलाइट कंटेंट प्रक्रिया है जो टेक्स्टबॉक्स को तर्क के रूप में लेती है (और, आप कभी अनुमान नहीं लगाएंगे, इसे सामग्री को हाइलाइट करते हैं)। आप टेक्स्टबॉक्स में सभी टेक्स्ट का चयन करने के लिए इसे कॉल करते हैं। आप तीन वाक्य रचना सही मायनों में इस प्रक्रिया कॉल कर सकते हैं:

10: HighlightContent txtName 
11: HighlightContent (txtName) 
12: Call HighlightContent(txtName) 

मान लें कि आपका उपयोगकर्ता पाठ बॉक्स में "जॉन" में प्रवेश किया है और आपके आवेदन HighlightContent कॉल करते हैं। क्या होगा, कौन सी कॉल काम करेगी?

10 और 12 सही हैं; जॉनबॉक्स को टेक्स्टबॉक्स में हाइलाइट किया जाएगा। लेकिन 11 वाक्य रचनात्मक रूप से सही है, लेकिन परिणामस्वरूप संकलन या रनटाइम त्रुटि होगी। क्यूं कर? क्योंकि कोष्ठक जगह से बाहर हैं। इससे वीबी (ए) को कोष्ठक में अभिव्यक्ति के मूल्यांकन का प्रयास करने के लिए संकेत मिलेगा। और किसी ऑब्जेक्ट के मूल्यांकन का नतीजा अक्सर इसकी डिफ़ॉल्ट संपत्ति का मूल्य होगा; इसके अलावा, इस मामले में। इसलिए 11 की प्रक्रिया को कॉल करने से टेक्स्टबॉक्स ऑब्जेक्ट को प्रक्रिया में पास नहीं किया जाएगा, लेकिन एक स्ट्रिंग मान "जॉन" होगा। एक टाइप मिस्चैच में परिणाम। -

+5

+1 एक महान उत्तर के लिए, लेकिन मैं अभी भी इस बात से सहमत नहीं हूं कि ब्रांडेसिस नियम "पूरी तरह तार्किक" है ... मैं कुछ सरल संभालने के लिए एक बेवकूफ तरीका कल्पना नहीं कर सकता! – Emma

+1

'डॉट्स' कब होते हैं? (मेरी शब्दावली को सही करने के लिए स्वतंत्र महसूस करें) 'myCollection.add obj' और ' myCollection.item (obj) ' क्या ये दोनों करने के सही तरीके नहीं हैं? लेकिन कंस्ट्रैसिस नियम अलग हैं, और मुझे नहीं पता क्यों। – bmende

+0

कुछ समय के लिए मुझे कुछ परेशान किया गया है। यह अभी भी थोड़ा मूर्ख लगता है। अन्य भाषाओं में ब्रांड्स फ़ंक्शन कॉल को ब्रांड्स के साथ कोई समस्या नहीं है और कोई "कॉल" कीवर्ड नहीं है। लेकिन अब जब मैं नियमों को जानता हूं तो मैं WTFITMWTSL को समझने का प्रयास करने में समय बर्बाद नहीं करूँगा !, मदद के लिए धन्यवाद। बी^जे – riderBill

2

1 डिफ़ॉल्ट रूप से, कोष्ठकों जब प्रक्रियाओं या कार्यों बुला का उपयोग नहीं करते:

MsgBox "Hello World" 

2 - आप एक समारोह कॉल कर रहे हैं, और इसके परिणाम में रुचि रखते हैं, तो आप कोष्ठकों के साथ अपने तर्कों संलग्न करना होगा :

Dim s As String 
Dim l As Long 
s = "Hello World" 
l = Len(s) 

3 - यदि आप एक प्रक्रिया के साथ कॉल कीवर्ड का उपयोग करना चाहते हैं, तो आप कोष्ठकों (जैसे के साथ बहस संलग्न करना चाहिए जब आप एक चर में परिणाम आवंटित करने के लिए या एक अभिव्यक्ति में समारोह का उपयोग करना चाहते):

Call MsgBox("Hello World") 

4 - आप एक ByRef तर्क (डिफ़ॉल्ट) ByVal पारित होने के लिए मजबूर करने के लिए चाहते हैं, तो कोष्ठकों के साथ ByRef तर्क संलग्न:

Sub Test 
    Dim text As String 
    text = "Hello World" 

    ChangeArgument((text)) 

    MsgBox text 
End Sub 

Sub ChangeArgument(ByRef s As String) 
    s = "Changed" 
End Sub 

यह प्रदर्शित करता है "नमस्ते दुनिया"

संबंधित मुद्दे