मंद और vba में सेट के बीच क्या अंतर है


82

मुझे क्षमा करें क्योंकि मैं VBA में नौसिखिया हूं।

कभी-कभी मैं उपयोग करता हूं

Dim r as Range
r = Range("A1")

अन्य बार मैं उपयोग करता हूं

Set r = Range("A1")

अंतर क्या है? और मुझे कब उपयोग करना चाहिए?

जवाबों:


78

setऑब्जेक्ट रेफरेंस का संदर्भ देने तक उपयोग करने का कोई कारण नहीं है । केवल उस संदर्भ में इसका उपयोग करना अच्छा है। अन्य सभी सरल डेटा प्रकारों के लिए, बस असाइनमेंट ऑपरेटर का उपयोग करें। यह dim(आयाम) सभी चर हालांकि एक अच्छा विचार है :

सरल डेटा प्रकार के उदाहरण होगा integer, long, boolean, string। ये केवल डेटा प्रकार हैं और इनके अपने तरीके और गुण नहीं हैं।

Dim i as Integer
i = 5

Dim myWord as String
myWord = "Whatever I want"

A का उदाहरण objecta Range, a Worksheet, or a होगा Workbook। इनकी अपनी विधियाँ और गुण हैं।

Dim myRange as Range
Set myRange = Sheet1.Range("A1")

यदि आप बिना अंतिम पंक्ति का उपयोग करने का प्रयास करते हैं Set, तो VB एक त्रुटि देगा। अब जब आपके पास एक objectघोषित है तो आप इसके गुणों और विधियों का उपयोग कर सकते हैं।

myString = myRange.Value

3
क्या मैं यह जान सकता हूं कि आपने इसे समझने के लिए किस ट्यूटोरियल या पुस्तक का उल्लेख किया है?
राम

18
यह उत्तर वास्तव में "क्यों" नहीं समझाता
kizzx2

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

यह पहले चर के आईएनजी के Setबिना उपयोग करने के लिए ठीक है Dim?
संक्रांति

64

हालाँकि, मुझे नहीं लगता कि यह वही है जो आप वास्तव में पूछ रहे हैं।

कभी-कभी मैं उपयोग करता हूं:

    Dim r as Range
    r = Range("A1")

यह कभी काम नहीं करेगा। आपके बिना Setरनटाइम एरर # 91 ऑब्जेक्ट वेरिएबल या ब्लॉक वेरिएबल सेट नहीं होगा । ऐसा इसलिए है क्योंकि आपको ऑब्जेक्ट संदर्भ के लिए चर मान निर्दिष्ट करने के लिए उपयोग करना चाहिएSet । फिर ऊपर कोड काम करेगा

मुझे लगता है कि नीचे दिया गया कोड दिखाता है कि आप वास्तव में क्या पूछ रहे हैं। मान लीजिए कि हम एक प्रकार की घोषणा नहीं करते हैं और इसके बजाय rएक Variantप्रकार होने देते हैं।

Public Sub test()
    Dim r
    debug.print TypeName(r)

    Set r = Range("A1")
    debug.print TypeName(r)

    r = Range("A1")
    debug.print TypeName(r)
End Sub

तो, चलो, यहाँ क्या होता है।

  1. r वेरिएंट के रूप में घोषित किया जाता है

    `Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
    
  2. rRangeयुक्त सेल "A1" पर सेट है

    Set r = Range("A1") ' TypeName(r) returns "Range"
    
  3. rकी डिफ़ॉल्ट संपत्ति के मूल्य पर सेट है ।Range("A1")

    r = Range("A1") ' TypeName(r) returns "String"
    

इस स्थिति में, किसी श्रेणी की डिफ़ॉल्ट संपत्ति है .Value, इसलिए कोड की निम्नलिखित दो पंक्तियाँ समतुल्य हैं।

r = Range("A1")
r = Range("A1").Value

डिफ़ॉल्ट ऑब्जेक्ट गुणों के बारे में अधिक जानने के लिए, कृपया चिप पियरसन की "एक कक्षा का डिफ़ॉल्ट सदस्य" देखें


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

अन्य बार मैं उपयोग करता हूं

Set r = Range("A1")

यह पहली बार घोषित किए बिना काम नहीं करेगा कि rएक वस्तु Rangeया Variantवस्तु है ... Dimकथन का उपयोग करते हुए - जब तक कि आपके पास Option Explicitसक्षम नहीं है , जो आपको चाहिए। हमेशा। अन्यथा, आप उन पहचानकर्ताओं का उपयोग कर रहे हैं जिन्हें आपने घोषित नहीं किया है और वे सभी स्पष्ट रूप से वेरिएंट के रूप में घोषित किए गए हैं ।


@PierreClaverie हां :) यह डिम और सेट के
वुल्फ

1
अगर आप जानते हैं तो @Wolf को यकीन नहीं है, लेकिन GBA पर अब VBA भाषा रेफरी बनी हुई है। github.com/OfficeDev/VBA-content/blob/master/VBA/…
रबरडाक

@RubberDuck मैं जागरूक नहीं था (मैं vb * के लिए नया हूं), इस नोट को जोड़ने के लिए धन्यवाद।
वुल्फ

आप स्वागत करते हैं। मुझे पता है कि VBA और पुराने VB6 डॉक्स इन दिनों ढूंढना मुश्किल हो सकता है।
रबरडुक

8

मंद: आप एक चर को परिभाषित कर रहे हैं (यहाँ: r एक प्रकार की श्रेणी है)

सेट करें: आप संपत्ति सेट कर रहे हैं (यहां: r का मान सेट करें रेंज ("A1") - यह एक प्रकार नहीं है, लेकिन एक मूल्य है)।

आपको वस्तुओं के साथ सेट का उपयोग करना होगा, अगर आर एक सरल प्रकार (जैसे इंट, स्ट्रिंग) थे, तो आप बस लिखेंगे:

Dim r As Integer
r=5


2

यदि एक चर को एक वस्तु के रूप में परिभाषित किया जाता है, जैसे मंद myfldr As Folder, तो इसे "सेट" कीवर्ड का उपयोग करके एक मान दिया जाता है।


1

Dim आयाम के लिए छोटा है और स्थानीय चर घोषित करने के लिए VBA और VB6 में उपयोग किया जाता है।

दूसरी ओर सेट करें, चर घोषणाओं से कोई लेना-देना नहीं है। Setकीवर्ड के लिए प्रयोग किया जाता है आवंटित एक नई वस्तु को एक वस्तु चर।

आशा है कि आपके लिए अंतर स्पष्ट करता है।


0

SET स्टेटमेंट पर VBA की मदद के अनुसार, यह ऑब्जेक्ट के संदर्भ को सेट करता है। यदि आप किसी प्रॉपर्टी को बदलते हैं तो वास्तविक ऑब्जेक्ट भी बदल जाएगा।

Dim newObj as Object
Set var1=Object1(same type as Object)
Set var2=Object1(same type as Object)
Set var3=Object1(same type as Object)
Set var4=Object1(same type as Object)
Var1.property1=NewPropertyValue

अन्य वर्स गुण भी बदलते हैं, इसलिए:

Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NewpropertyValue`

वास्तविक सभी संस्करण समान हैं!

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