TOP

VBA-पाठ 9. प्रक्रियाएँ और कार्य

किसी भी प्रोग्रामिंग भाषा में प्रक्रियाओं और कार्यों जैसी अवधारणाएँ होती हैं। उन्हें Excel के लिए अंतर्निहित प्रोग्रामिंग भाषा VBA में भी शामिल किया गया था।

  • फ़ंक्शन एक रूटीन है जो एक परिणाम देता है। फ़ंक्शन कॉल एक अभिव्यक्ति है और इसका उपयोग अन्य अभिव्यक्तियों में या असाइनमेंट स्टेटमेंट के दाईं ओर किया जा सकता है (VBA में "Function" के रूप में दर्शाया गया है);
  • एक प्रक्रिया कोई भी ऐसी दिनचर्या है जो कोई कार्य नहीं है। VBA में "Sub" के रूप में चिह्नित (शब्द "सबरूटीन" से)।

  • प्रक्रियाएं (Public - Public)

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

     Sub example()
     
     'के समान:
     Public Sub example()
    

    प्रक्रिया को केवल एक निश्चित मॉड्यूल में उपलब्ध कराने के लिए, Private कीवर्ड का उपयोग किया जाता है:

    Private Sub example()
    

    एक प्रक्रिया को दूसरी प्रक्रिया के मध्य से चलाना

    किसी प्रक्रिया को किसी अन्य प्रक्रिया के भीतर से निष्पादित करने के लिए, बस उसका नाम दर्ज करें।

    इसका एक बहुत ही सरल उदाहरण यहां दिया गया है:

    Private Sub warning()
        MsgBox "Caution !!!" '"चेतावनी!"
    End Sub
    
    Sub macro_test()
        If Range("A1") = "" Then
            warning '=> प्रक्रिया निष्पादित करें "warning"
        End If
        'वगैरह...
    End Sub
    

    बहस

    तर्क किसी प्रक्रिया से मानों को उप-प्रक्रिया में उपयोग करना संभव बनाते हैं (याद रखें कि डिफ़ॉल्ट रूप से, चर केवल उस प्रक्रिया से उपलब्ध होते हैं जिसमें वे घोषित किए गए थे)।

    Private Sub warning(var_text As String)
        MsgBox "Caution : " & var_text & " !"
    End Sub
    
    Sub macro_test()
        If Range("A1") = "" Then
            warning "empty cell"               '"खाली सेल"
        ElseIf Not IsNumeric(Range("A1")) Then
            warning "non-numerical value"      '"गैर-संख्यात्मक मान"
        End If
    End Sub
    

    प्रक्रिया "warning" में एक तर्क जोड़ा गया है, इस मामले में यह "String" (रिबन) प्रकार का एक चर "var_text" है:

    Private Sub warning(var_text As String)
    

    यह रूटीन एक तर्क लेता है, इसलिए इसे निष्पादित करने के लिए हमें "warning" के बाद एक मान डालना होगा:

    warning "empty cell"
    

    जब हम अनेक तर्क लिखना चाहते हैं तो उन्हें अल्पविराम से अलग करना चाहिए।

    वैकल्पिक तर्क

    डिफ़ॉल्ट रूप से, यदि प्रक्रिया में तर्क हैं, तो उन्हें प्रदान किया जाना चाहिए, और यदि वे प्रदान नहीं किए जाते हैं, तो प्रक्रिया निष्पादित नहीं की जाएगी।

    वैकल्पिक कीवर्ड का उपयोग करके एक अनिवार्य तर्क के बाद एक वैकल्पिक तर्क जोड़ा जा सकता है। उदाहरण:

    Private Sub dialog_boxes(last_name As String, Optional first_name, Optional age)
    

    इस प्रक्रिया को अब वैकल्पिक तर्क के साथ या उसके बिना निष्पादित किया जा सकता है, जैसा कि यहां दिया गया है:

     'उदाहरण 1: अंतिम नाम प्रदर्शित करें:
     dialog_boxes last_name1
       
     'उदाहरण 2: हम उपनाम और प्रथम नाम प्रदर्शित करते हैं:
     dialog_boxes last_name1, first_name1
       
     'उदाहरण 3: अंतिम नाम और आयु प्रदर्शित करें:
     dialog_boxes last_name1, , age1
       
     'उदाहरण 4: अंतिम नाम, प्रथम नाम और आयु प्रदर्शित करें:
     dialog_boxes last_name1, first_name1, age1
    

    तर्कों को सही क्रम में दर्ज किया जाना चाहिए।

    यह जांचने के लिए कि किसी प्रक्रिया में कोई वैकल्पिक तर्क मौजूद है या नहीं, हम IsMissing फ़ंक्शन का उपयोग करते हैं। यह फ़ंक्शन केवल कुछ फ़ंक्शन प्रकारों (प्रकार Varin) के साथ संगत है और यह महत्वपूर्ण है क्योंकि वैकल्पिक तर्कों का प्रकार घोषित नहीं किया गया था (अघोषित प्रकार = Varin)।

    यहां एक उदाहरण दिया गया है जो ऊपर चर्चा किए गए दो कोड स्निपेट का उपयोग करता है:

    Sub macro_test()
    
        Dim last_name1 As String, first_name1 As String, age1 As Integer
       
        last_name1 = Range("A1")
        first_name1 = Range("B1")
        age1 = Range("C1")
    
        'उदाहरण 1: अंतिम नाम प्रदर्शित करें:
        dialog_boxes last_name1
       
        'उदाहरण 2: हम उपनाम और प्रथम नाम प्रदर्शित करते हैं:
        dialog_boxes last_name1, first_name1
       
        'उदाहरण 3: अंतिम नाम और आयु प्रदर्शित करें:
        dialog_boxes last_name1, , age1
       
        'उदाहरण 4: अंतिम नाम, प्रथम नाम और आयु प्रदर्शित करें:
        dialog_boxes last_name1, first_name1, age1
    
    End Sub
    
    Private Sub dialog_boxes(last_name As String, Optional first_name, Optional age)
       
        If IsMissing(age) Then 'यदि आयु चर गायब है...
           
            If IsMissing(first_name) Then 'यदि वेरिएबल फर्स्ट_नाम गायब है, तो
            							  'केवल अंतिम नाम प्रदर्शित किया जाएगा
               MsgBox last_name
            Else 'अन्यथा, अंतिम नाम और प्रथम नाम प्रदर्शित किया जाएगा
               MsgBox last_name & " " & first_name
            End If
           
        Else 'यदि आयु चर मौजूद है...
    
            If IsMissing(first_name) Then 'यदि वेरिएबल फर्स्ट_नाम गायब है, तो
                                          'अंतिम नाम और उम्र प्रदर्शित की जाएगी
               MsgBox last_name & ", " & age & " years old"
            Else 'अन्यथा, अंतिम नाम, प्रथम नाम और उम्र प्रदर्शित की जाएगी
               MsgBox last_name & " " & first_name & ", " & age & " years old"
            End If
       
        End If
           
    End Sub
    

    देखना नीचे चित्र (उदाहरण 1):

    ByRef - ByVal

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

    उदाहरण:

    Sub macro_test()
        Dim var_number As Integer
        
        var_number = 30
        calcul_square var_number
       
        MsgBox var_number
    End Sub
    
    Private Sub calcul_square(ByRef var_value As Integer) 'ByRef वैकल्पिक है
                                                          '(डिफ़ॉल्ट मान है)
        var_value = var_value * var_value
    End Sub
    

    इसे स्पष्ट करने के लिए, नीचे एक उदाहरण दिया गया है कि यदि मैक्रो निष्पादित होना शुरू हो जाए तो क्या होगा:

     var_number = 30
     'वेरिएबल "var_number" का प्रारंभिक मान 30 है
    
     calcul_square var_number
     'उप-प्रक्रिया को तर्क के रूप में "var_number" के साथ चलाया जाता है
    
     Private Sub calcul_square(ByRef var_value As Integer)
     'वेरिएबल "var_value" कुछ हद तक वेरिएबल "var_number" तक त्वरित पहुंच के लिए कार्य करता है।
     'जिसका अर्थ है कि यदि वेरिएबल "var_value" बदला जाता है, तो वेरिएबल "var_number" भी बदल दिया जाएगा
     '(और उनका एक ही नाम होना ज़रूरी नहीं है)
     var_value = var_value * var_value
     'वेरिएबल "var_value" का मान बदल दिया गया है (और इसलिए "var_number" भी उसी समय बदल दिया गया है)
    
     End Sub
     'उप-प्रक्रिया का अंत
    
     MsgBox var_number
     'वेरिएबल "var_number" को बदल दिया गया है इसलिए 900 अब डायलॉग में प्रदर्शित होगा
    

    दूसरी विधि ByVal का उपयोग करना है।

    ByRef के विपरीत, जो एक संदर्भ (लेबल) पास करता है, ByVal एक मान पास करता है, जिसका अर्थ है कि तर्क के रूप में पारित मान को संशोधित नहीं किया गया है।

    नीचे आप देख सकते हैं कि पिछला कोड और ByVal कैसे काम करते हैं:

     var_number = 30
     'वेरिएबल "var_number" का प्रारंभिक मान 30 है
    
     calcul_square var_number
     'उप-प्रक्रिया को तर्क के रूप में "var_number" के साथ चलाया जाता है
    
     Private Sub calcul_square(ByVal var_value As Integer)
     'वेरिएबल "var_value" वेरिएबल "var_number" के मान की प्रतिलिपि बनाता है (2 वेरिएबल संबंधित नहीं हैं)
    
     var_value = var_value * var_value
     'वेरिएबल "var_value" का मान बदल गया है
    
     End Sub
     'उप-प्रक्रिया का अंत (इस उदाहरण में उप-प्रक्रिया का किसी भी चीज़ पर कोई प्रभाव नहीं पड़ता)
    
     MsgBox var_number
     'वेरिएबल "var_number" को नहीं बदला गया है और इसलिए डायलॉग बॉक्स में 30 प्रदर्शित किया जाएगा
    

    आपको क्या याद रखना चाहिए: जब वेरिएबल नहीं बदला जाना चाहिए तो ByVal का उपयोग करें।

    कार्य

    एक प्रक्रिया और एक फ़ंक्शन के बीच मुख्य अंतर यह है कि एक फ़ंक्शन एक मान लौटाता है।

    ये रहा एक सरल उदाहरण:

    Function square(var_number)
        square = var_number ^ 2 '"वर्ग" फ़ंक्शन "वर्गमूल" मान लौटाता है
    End Function
    
    Sub macro_test()
        Dim result As Double
        result = square(9.876) 'परिणाम चर को वह मान निर्दिष्ट किया गया है जिसकी गणना फ़ंक्शन द्वारा की गई थी
        MsgBox result 'परिणाम प्रदर्शित होता है (इस मामले में 9.876 का वर्ग)
    End Sub
    

    फ़ंक्शन का उपयोग Excel में किसी अन्य फ़ंक्शन की तरह ही वर्कशीट पर किया जा सकता है।

    उदाहरण के लिए, सेल A1 में दर्ज मान का वर्ग प्राप्त करने के लिए: