खोज…


टिप्पणियों

यह लेख दिखाएगा कि VBA में एक पूर्ण कस्टम वर्ग कैसे बनाया जाए। यह एक DateRange ऑब्जेक्ट के उदाहरण का उपयोग करता है, क्योंकि एक प्रारंभिक और समाप्ति तिथि अक्सर कार्यों के लिए एक साथ पारित की जाती है।

एक संपत्ति को एक वर्ग में जोड़ना

एक Property प्रक्रिया बयान की एक श्रृंखला है जो एक मॉड्यूल पर एक कस्टम संपत्ति को पुनः प्राप्त या संशोधित करती है।

प्रॉपर्टी ऐक्सेसर्स के तीन प्रकार हैं:

  1. एक प्रक्रिया Get करें जो किसी संपत्ति का मूल्य लौटाती है।
  2. एक Let प्रक्रिया जो किसी ऑब्जेक्ट को (गैर- Object ) मान प्रदान करती है।
  3. एक Set प्रक्रिया जो एक Object संदर्भ प्रदान करती है।

प्रॉपर्टी ऐक्सेसर्स अक्सर जोड़े में परिभाषित होते हैं, प्रत्येक प्रॉपर्टी के लिए Get और Let / Set दोनों का उपयोग करते हैं। केवल Get प्रक्रिया के साथ एक संपत्ति केवल-पढ़ने के लिए होगी, जबकि केवल Let / Set प्रक्रिया के साथ एक संपत्ति केवल-लेखन होगी।

निम्नलिखित उदाहरण में, DateRange वर्ग के लिए चार संपत्ति DateRange को परिभाषित किया गया है:

  1. StartDate ( पढ़ें / लिखें )। किसी श्रेणी में पूर्व दिनांक का प्रतिनिधित्व करने वाला दिनांक मान। प्रत्येक प्रक्रिया मॉड्यूल चर के मान का उपयोग करती है, mStartDate
  2. EndDate ( पढ़ें / लिखें )। तिथि मान एक सीमा में बाद की तारीख का प्रतिनिधित्व करता है। प्रत्येक प्रक्रिया मॉड्यूल चर, mEndDate के मूल्य का उपयोग mEndDate
  3. DaysBetween ( केवल पढ़ने के लिए )। परिकलित पूर्णांक मान दो तिथियों के बीच दिनों की संख्या का प्रतिनिधित्व करता है। क्योंकि केवल एक Get प्रक्रिया है, इस संपत्ति को सीधे संशोधित नहीं किया जा सकता है।
  4. RangeToCopy ( केवल-लेखन )। किसी मौजूदा DateRange ऑब्जेक्ट के मानों की प्रतिलिपि बनाने के लिए उपयोग की जाने वाली Set प्रक्रिया।
Private mStartDate As Date                ' Module variable to hold the starting date
Private mEndDate As Date                  ' Module variable to hold the ending date
  
' Return the current value of the starting date
Public Property Get StartDate() As Date
    StartDate = mStartDate
End Property

' Set the starting date value. Note that two methods have the name StartDate
Public Property Let StartDate(ByVal NewValue As Date)
    mStartDate = NewValue
End Property
  
' Same thing, but for the ending date
Public Property Get EndDate() As Date
    EndDate = mEndDate
End Property
  
Public Property Let EndDate(ByVal NewValue As Date)
    mEndDate = NewValue
End Property

' Read-only property that returns the number of days between the two dates
Public Property Get DaysBetween() As Integer
    DaysBetween = DateDiff("d", mStartDate, mEndDate)
End Function

' Write-only property that passes an object reference of a range to clone
Public Property Set RangeToCopy(ByRef ExistingRange As DateRange)

Me.StartDate = ExistingRange.StartDate
Me.EndDate = ExistingRange.EndDate

End Property

एक वर्ग के लिए कार्यशीलता जोड़ना

क्लास मॉड्यूल के अंदर कोई भी सार्वजनिक Sub , Function या Property को ऑब्जेक्ट संदर्भ के साथ कॉल करने से पहले बुलाया जा सकता है:

Object.Procedure

DateRange वर्ग में, अंतिम तिथि में कई दिनों को जोड़ने के लिए एक Sub का उपयोग किया जा सकता है:

Public Sub AddDays(ByVal NoDays As Integer)
    mEndDate = mEndDate + NoDays
End Sub

एक Function अगले महीने के अंत के अंतिम दिन वापस आ सकता है (ध्यान दें कि GetFirstDayOfMonth वर्ग के बाहर दिखाई नहीं देगा क्योंकि यह निजी है):

Public Function GetNextMonthEndDate() As Date
    GetNextMonthEndDate = DateAdd("m", 1, GetFirstDayOfMonth())
End Function

Private Function GetFirstDayOfMonth() As Date
    GetFirstDayOfMonth = DateAdd("d", -DatePart("d", mEndDate), mEndDate)
End Function

प्रक्रिया किसी भी प्रकार के तर्कों को स्वीकार कर सकती है, जिसमें वर्ग की वस्तुओं के संदर्भ शामिल हैं।

निम्न उदाहरण का परीक्षण करता है कि क्या वर्तमान DateRange ऑब्जेक्ट की प्रारंभिक तिथि और समाप्ति तिथि है जिसमें किसी अन्य DateRange ऑब्जेक्ट की शुरुआत और समाप्ति तिथि शामिल है।

Public Function ContainsRange(ByRef TheRange As DateRange) As Boolean
    ContainsRange = TheRange.StartDate >= Me.StartDate And TheRange.EndDate <= Me.EndDate
End Function

कोड चलाने वाले ऑब्जेक्ट के मूल्य तक पहुंचने के तरीके के रूप में Me नोटेशन के उपयोग पर ध्यान दें।

क्लास मॉड्यूल स्कोप, इंस्टेंसिंग और री-यूज़

डिफ़ॉल्ट रूप से, एक नया वर्ग मॉड्यूल एक निजी वर्ग है, इसलिए यह केवल VBProject के भीतर तात्कालिकता और उपयोग के लिए उपलब्ध है जिसमें इसे परिभाषित किया गया है। आप एक ही प्रोजेक्ट में कहीं भी क्लास घोषित कर सकते हैं, उसका उपयोग कर सकते हैं:

'Class List has Instancing set to Private
'In any other module in the SAME project, you can use:

Dim items As List
Set items = New List

लेकिन अक्सर आप उन कक्षाओं को लिखेंगे जिन्हें आप परियोजनाओं के बीच मॉड्यूल की नकल के बिना अन्य परियोजनाओं में उपयोग करना चाहते हैं। यदि आप ProjectA में List नामक एक वर्ग को परिभाषित करते हैं, और ProjectB में उस वर्ग का उपयोग करना चाहते हैं, तो आपको 4 क्रियाएं करने की आवश्यकता होगी:

  1. गुण विंडो में ProjectA में Private से PublicNotCreatable तक List वर्ग की इंस्टेंसिंग संपत्ति बदलें

  2. ProjectA में एक सार्वजनिक "फ़ैक्टरी" फ़ंक्शन बनाएँ जो एक List वर्ग का एक उदाहरण बनाता है और देता है। आमतौर पर फैक्ट्री फंक्शन में क्लास इंस्टेंस के इनिशियलाइजेशन के लिए तर्क शामिल होंगे। फैक्ट्री फ़ंक्शन की आवश्यकता होती है क्योंकि क्लास का उपयोग ProjectB द्वारा किया जा सकता है लेकिन ProjectB सीधे ProjectA की क्लास का एक उदाहरण नहीं बना सकता है।

     Public Function CreateList(ParamArray values() As Variant) As List
         Dim tempList As List
         Dim itemCounter As Long
         Set tempList = New List
         For itemCounter = LBound(values) to UBound(values) 
             tempList.Add values(itemCounter)
         Next itemCounter
         Set CreateList = tempList
     End Function
    
  3. में ProjectB के लिए एक संदर्भ जोड़ने ProjectA का उपयोग कर Tools..References... मेनू।

  4. ProjectB , ProjectA से फ़ैक्टरी फ़ंक्शन का उपयोग करते हुए एक चर घोषित करें और इसे एक List निर्दिष्ट करें

     Dim items As ProjectA.List
     Set items = ProjectA.CreateList("foo","bar")
    
     'Use the items list methods and properties
     items.Add "fizz"
     Debug.Print items.ToString()
     'Destroy the items object
     Set items = Nothing
    


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow