2012-03-20 15 views
20

मैं एक खुद के प्रकार के साथ एक चर को परिभाषित किया है,वीबीए में एक प्रकार को कुछ भी नहीं सेट करें?

Dim point As DataPoint 

Public Type DataPoint 
    list as Collection 
    name as String 
    number as Integer 
End Type 

कहना और मैं एक ही बार में चर point के सभी मानों हटाना चाहते हैं। यदि यह एक वर्ग था, तो मैं केवल Set point = New DataPoint का उपयोग करता हूं, या Set point = Nothing सेट करता हूं, लेकिन अगर यह एक प्रकार है तो मैं कैसे आगे बढ़ सकता हूं?

उत्तर

23

मानक तरीका प्रत्येक सदस्य को अपने डिफ़ॉल्ट मान को अलग-अलग रीसेट करना है। यह वस्तुओं की तुलना में उपयोगकर्ता परिभाषित प्रकारों की एक सीमा है।

स्पष्ट करते हुए कहा के जोखिम को कम:

With point 
    Set .list = Nothing 
    .name = "" 
    .number = 0 
End With 

वैकल्पिक रूप से, आप एक "रिक्त" चर हर बार जब आप "स्पष्ट" यह करना चाहते हैं बनाते हैं और अपने चर को असाइन कर सकें।

Dim point As DataPoint 
Dim blank As DataPoint 

With point 
    Set .list = New Collection 
    .list.Add "carrots" 
    .name = "joe" 
    .number = 12 
End With 

point = blank 
' point members are now reset to default values 
+0

ठीक है, धन्यवाद। मुझे आशा थी कि पूरे वर्ग को परिभाषित करने या व्यक्तिगत रूप से सभी सदस्यों को रीसेट करने के अलावा इसका समाधान होगा। रिक्त-चर के संबंध में, यह एक उपयोगी विचार है। मैं इसका इस्तेमाल करने पर विचार करूंगा। – tyrex

+2

+1 रिक्त डेटा प्वाइंट –

+0

@FMan पर: यह एक संपूर्ण कक्षा को परिभाषित नहीं कर रहा है ... बस एक चर घोषित कर रहा है। –

25

आप इस तथ्य एक अंतर्निहित चर कि परिणाम रखती है VB में कार्यों से लाभ उठा सकते हैं, और कि डिफ़ॉल्ट रूप से डिफ़ॉल्ट प्रकार मान है।

public function GetBlankPoint() as DataPoint 
end function 

उपयोग:

point = GetBlankPoint() 
6

संपादित: अरे! JFC से पीटा: डी

यहाँ 1 पंक्ति में है कि प्राप्त करने के लिए एक विकल्प है;)

Dim point As DataPoint 
Dim emptyPoint As DataPoint 

Public Type DataPoint 
    list As Collection 
    name As String 
    number As Integer 
End Type 


Sub Sample() 
    '~~> Fill the point 
    Debug.Print ">"; point.name 
    Debug.Print ">"; point.number 
    point.name = "a" 
    point.number = 25 
    Debug.Print ">>"; point.name 
    Debug.Print ">>"; point.number 
    '~~> Empty the point 
    point = emptyPoint 
    Debug.Print ">>>"; point.name 
    Debug.Print ">>>"; point.number 
End Sub 

स्नैपशॉट

enter image description here

2

एक अन्य विकल्प आरक्षित शब्द का उपयोग करने के लिए "खाली है "जैसे:

.number = खाली

एकमात्र मुद्दा यह है कि आपको संख्या को पूर्णांक से भिन्नता में बदलने की आवश्यकता होगी।

0

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

' 
Public List as Collection 
Public Name as String 
Public Number as Long 

Private Sub Class_Initialize() 

'Here you can assign default values for the public members that you created if you want 

End Sub 
+0

मैं अक्सर सभी सदस्य चर रखने के लिए कक्षाओं के भीतर निजी प्रकार बनाते हैं। लाभ यह है कि मैं क्लास इंस्टेंस को फिर से बनाने के बिना टाइप वेरिएबल = रिक्त वैरिएबल सेट करके सभी सदस्य चर को साफ़ करने के लिए क्लास पर "रीसेट()" विधि को आसानी से कार्यान्वित कर सकता हूं। यह सभी व्यक्तिगत सदस्य चरों की प्रतिलिपि बनाने के बजाय "कॉपी()" विधि को वास्तव में सरल बनाने में भी सक्षम बनाता है, आपको बस एक निजी प्रकार परिवर्तक की प्रतिलिपि बनाने की आवश्यकता होती है। –

1

एक-लाइनर:

Function resetDataPoint() As DataPoint: End Function 

उपयोग:

point = resetDataPoint() 
+0

एक-लाइनर कॉपी-पास्टर का जवाब 20 मार्च 1212 को 14:10 बजे पता चला :) http://stackoverflow.com/a/9788459/6698332 – user6698332

2

का उपयोग करने के बाद आप वर्ग मॉड्यूल बनाते हैं और अपने प्रकार की तरह नामित

वाक्य रचना इस तरह somthing हो जाएगा वीबीए में कक्षाएं आम तौर पर एक अच्छा अभ्यास है यदि यह एकमात्र उद्देश्य समाधान नहीं है या कक्षा में बहुत से निजी अटारी नहीं हैं ibutes क्योंकि यदि आप ओओपी नियमों का पालन करना चाहते हैं और अपनी कक्षा को सुरक्षित रखना चाहते हैं, तो आपको कक्षा के सभी निजी विशेषताओं के लिए सभी चलो और संपत्तियां प्राप्त करनी चाहिए। यदि आपके पास 50 से अधिक निजी विशेषताओं हैं तो यह बहुत अधिक कोडिंग है।एक्सेल में कक्षाओं का उपयोग करने का एक और नकारात्मक पक्ष तथ्य यह है कि वीबीए पूरी तरह से ओओपी का समर्थन नहीं करता है। कोई polymorfism, overloading, आदि नहीं है) यहां तक ​​कि आप एक विरासत का उपयोग करना चाहते हैं, आप विरासत वर्ग में मूल वर्ग से सभी विशेषताओं और तरीकों की घोषणा करनी है।

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

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