VBA फ़ंक्शन से परिणाम कैसे लौटाएं


277

मैं किसी फ़ंक्शन से परिणाम कैसे लौटाऊं?

उदाहरण के लिए:

Public Function test() As Integer
    return 1
End Function

यह एक संकलन त्रुटि देता है।

मैं इस फ़ंक्शन को पूर्णांक कैसे वापस करूँ?


जवाबों:


429

गैर-वस्तु वापसी प्रकारों के लिए, आपको अपने फ़ंक्शन के नाम का मान निर्दिष्ट करना होगा, जैसे:

Public Function test() As Integer
    test = 1
End Function

उदाहरण का उपयोग:

Dim i As Integer
i = test()

यदि फ़ंक्शन ऑब्जेक्ट प्रकार देता है, तो आपको Setइस तरह से कीवर्ड का उपयोग करना होगा :

Public Function testRange() As Range
    Set testRange = Range("A1")
End Function

उदाहरण का उपयोग:

Dim r As Range
Set r = testRange()

ध्यान दें कि फ़ंक्शन नाम पर वापसी मान प्रदान करने से आपके फ़ंक्शन का निष्पादन समाप्त नहीं होता है। यदि आप फ़ंक्शन से बाहर निकलना चाहते हैं, तो आपको स्पष्ट रूप से कहने की आवश्यकता है Exit Function। उदाहरण के लिए:

Function test(ByVal justReturnOne As Boolean) As Integer
    If justReturnOne Then
        test = 1
        Exit Function
    End If
    'more code...
    test = 2
End Function

प्रलेखन: http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx


32
पूर्णता के लिए यह ध्यान दिया जाना चाहिए कि जब आप एक वस्तु ( Rangeउदाहरण के लिए) वापस कर रहे हैं , तो आपको Setउसी तरह उपयोग करने की आवश्यकता है, यदि आप एक नियमित तरीके से ऑब्जेक्ट चर सेट कर रहे हैं। इसलिए, यदि, उदाहरण के लिए, "परीक्षण" एक ऐसा फ़ंक्शन था, जो एक रेंज लौटाता है तो रिटर्न स्टेटमेंट इस तरह दिखेगा set test = Range("A1")
Jay Carr

क्यों है @JayCarr?
साइकोडाटा

4
@PychoData - केवल इसलिए कि आप सामान्य रूप से एक वस्तु चर कैसे निर्धारित करते हैं, और इसके बिना setइसे करने से समस्याएं हो सकती हैं। मैं इसे बिना कर मुद्दों था, लेकिन अगर मैं का उपयोग करें setमैं नहीं :)।
Jay Carr

1
मुझे लगता है कि यह भी उल्लेखनीय है कि फ़ंक्शन का व्यवहार तब भिन्न होता है जब आप इसे किसी अन्य VBA फ़ंक्शन या उप से कॉल करने के साथ स्प्रेडशीट से कॉल करते हैं।
डग जेनकिंस

2
जब वीबीए के भीतर बुलाया जाता है तो फ़ंक्शन एक रेंज ऑब्जेक्ट लौटाएगा, लेकिन जब एक वर्कशीट से कॉल किया जाता है तो यह केवल मान लौटाएगा, इसलिए set test = Range("A1")इसके बिल्कुल बराबर है test = Range("A1").Value, जहां "टेस्ट" को रेंज के बजाय एक वेरिएंट के रूप में परिभाषित किया गया है।
डग जेनकिन्स

86

VBA फ़ंक्शन फ़ंक्शन नाम को एक प्रकार के चर के रूप में मानते हैं। इसलिए " return" कथन का उपयोग करने के बजाय , आप बस कहेंगे:

test = 1

नोटिस, हालांकि, यह फ़ंक्शन से बाहर नहीं निकलता है। इस बयान के बाद किसी भी कोड को भी निष्पादित किया जाएगा। इस प्रकार, आपके पास कई असाइनमेंट स्टेटमेंट हो सकते हैं जो विभिन्न मानों को असाइन करते हैं test, और जब भी आप फ़ंक्शन के अंत तक पहुंचते हैं, तो मूल्य वापस लौटाया जाएगा।


वास्तव में आपने अतिरिक्त जानकारी के साथ प्रश्न का स्पष्ट रूप से उत्तर दिया (जो संभावित रूप से नए से VBA आदमी के लिए एक और प्रश्न का कारण बन सकता है)। अच्छा काम जारी रखें
आदर्श

क्षमा करें, ऐसा लगता है कि आपने मेरे उत्तर के समान ही उत्तर दिया है, जो मेरे पास पहले था, लेकिन इस तथ्य को जोड़ते हुए कि यह फ़ंक्शन से बाहर नहीं निकलता है। यह एक अच्छा जोड़ है, मुझे लगा कि टिप्पणी के रूप में यह अधिक उपयुक्त होगा। मुझे यकीन नहीं है कि उचित शिष्टाचार क्या है, मुझे लगता है कि यह थोड़े असभ्य था, क्योंकि यह एक अच्छा जवाब है, लेकिन यह मुझे इसे पूर्ववत नहीं करने देगा।
दान

41

फ़ंक्शन नाम पर केवल रिटर्न मान सेट करना अभी भी जावा (या अन्य) स्टेटमेंट के समान नहीं हैreturn , क्योंकि जावा में, returnफ़ंक्शन को इस तरह से बाहर निकालता है:

public int test(int x) {
    if (x == 1) {
        return 1; // exits immediately
    }

    // still here? return 0 as default.
    return 0;
}

यदि आप अपने फ़ंक्शन के अंत में रिटर्न मान सेट नहीं कर रहे हैं , तो VB में, सटीक समकक्ष दो लाइनें लेता है । तो, VB में सटीक कोरोलरी इस तरह दिखाई देगी:

Public Function test(ByVal x As Integer) As Integer
    If x = 1 Then
        test = 1 ' does not exit immediately. You must manually terminate...
        Exit Function ' to exit
    End If

    ' Still here? return 0 as default.
    test = 0
    ' no need for an Exit Function because we're about to exit anyway.
End Function 

चूंकि यह मामला है, इसलिए यह जानना भी अच्छा है कि आप विधि में किसी अन्य चर की तरह रिटर्न चर का उपयोग कर सकते हैं। ऐशे ही:

Public Function test(ByVal x As Integer) As Integer

    test = x ' <-- set the return value

    If test <> 1 Then ' Test the currently set return value
        test = 0 ' Reset the return value to a *new* value
    End If

End Function 

या, वापसी चर कैसे काम करता है (लेकिन जरूरी नहीं कि आपको वास्तव में कोड कैसे होना चाहिए) का एक चरम उदाहरण है - वह जो आपको रात में बनाए रखेगा:

Public Function test(ByVal x As Integer) As Integer

    test = x ' <-- set the return value

    If test > 0 Then

        ' RECURSIVE CALL...WITH THE RETURN VALUE AS AN ARGUMENT,
        ' AND THE RESULT RESETTING THE RETURN VALUE.
        test = test(test - 1)

    End If

End Function

2
"यह जानना भी अच्छा है कि आप किसी अन्य चर की तरह रिटर्न चर का उपयोग कर सकते हैं" ज्यादातर सही है - लेकिन उदाहरण के लिए यदि वापसी का प्रकार है Variantऔर आपका लक्ष्य एक सरणी वापस करना है तो कुछ ऐसा ReDim test(1 to 100)होगा जो त्रुटि को ट्रिगर करेगा। इसके अलावा, भले ही यह है संभव जैसी बुनियादी प्रकार के इलाज के लिए Integersकी तरह है कि यह कुछ हद तक unidiomatic माना जाता है। यह कोड को पढ़ने में कठिन बनाता है। VBA प्रोग्रामर लाइनों के लिए स्कैन करते हैं जो फ़ंक्शन नाम को यह समझने के लिए असाइन करते हैं कि फ़ंक्शन क्या करता है। नियमित रूप से फ़ंक्शन नाम का उपयोग करना अनावश्यक रूप से इसे अस्पष्ट करता है।
जॉन कोलमैन

@ जॉन कॉमनमैन, दोनों बिंदुओं पर पूरी तरह सहमत हैं। किसी भी तरह से अंतिम उदाहरण अनुशंसित पद्धति में से एक नहीं होना चाहिए। लेकिन, विषय का सवाल यह है कि किसी चर को कैसे लौटाया जाए, और इसलिए यह वीबी के रिटर्न परिणाम की पूरी व्याख्या पर एक प्रयास है, और विस्तार से कि वे कैसे काम करते हैं। निश्चित रूप से अंतिम मामला सिफारिश नहीं है। (मैं निश्चित रूप से एक उदाहरण से अधिक कोड नहीं होगा।) तो, आपके अंक अच्छी तरह से, और अच्छे जोड़ हैं। धन्यवाद।
15 नवंबर को LimaNightHawk

यह है छोटा सा कार्यों के लिए उपयोगी है, और कुछ है कि किसी भी VBA प्रोग्रामर, के बारे में पता होना चाहिए तो मैं आपको यह उल्लेख के साथ कोई समस्या नहीं थी। मैंने सिर्फ सोचा था कि एक चेतावनी शामिल की जानी चाहिए।
जॉन कोलमैन

धन्यवाद समझाते हुए कि कैसे Exit Functionसंबंधित हैreturn
ऑस्टिन डी

@ जॉन्कोलेमैन, जाहिर है, आप ReDim test(1 to 100)केवल एक त्रुटि को ट्रिगर किए बिना नहीं कर सकते क्योंकि 'परीक्षण' को एक सरणी के रूप में घोषित नहीं किया गया है! और किसी भी अन्य कारण से नहीं! आप किसी फ़ंक्शन को एक सरणी के रूप में घोषित नहीं कर सकते। इसे एक के रूप में घोषित करें Variant, फिर इस फ़ंक्शन के अंदर बस अपना आउटपुट ऐरे (यह डायनामिक या स्टेटिक हो सकता है) बनाएं testऔर फिर इस ऐरे को testरिटर्न वैल्यू के रूप में असाइन करें । इसे और अधिक हेरफेर करने के लिए, ReDimइसे पसंद करने के लिए , आपको किसी वैरिएबल, उदाहरण के लिए लौटाए गए मान को असाइन करना होगा, Dim x as Variantऔर कॉल करना होगा x = test, जिसके बाद xआपने क्या testकिया है!
जीन

-6

नीचे दिया गया कोड वैरिएबल में रिटर्न वैल्यू को स्टोर करता है retValऔर फिर MsgBoxवैल्यू को प्रदर्शित करने के लिए इस्तेमाल किया जा सकता है:

Dim retVal As Integer
retVal = test()
Msgbox retVal
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.