क्या मैं एक साथ VBA में एक चर घोषित और असाइन कर सकता हूं?


165

मैं VBA में नया हूं और जानना चाहता हूं कि क्या मैं निम्नलिखित घोषणा और असाइनमेंट को एक लाइन में बदल सकता हूं:

Dim clientToTest As String
clientToTest = clientsToTest(i)

या

Dim clientString As Variant
clientString = Split(clientToTest)

जवाबों:


239

दुर्भाग्य से वीबीए में कोई कमी नहीं है, निकटतम आप प्राप्त करेंगे एक शुद्ध दृश्य चीज है :निरंतरता चरित्र का उपयोग करें यदि आप इसे पठनीयता के लिए एक पंक्ति पर चाहते हैं;

Dim clientToTest As String:  clientToTest = clientsToTest(i)
Dim clientString As Variant: clientString = Split(clientToTest)

संकेत (अन्य उत्तरों / टिप्पणियों का सारांश): वस्तुओं के साथ भी काम करता है (Excel 2010):

Dim ws  As Worksheet: Set ws = ActiveWorkbook.Worksheets("Sheet1")
Dim ws2 As New Worksheet: ws2.Name = "test"

13
+1, मुझे याद है कि माइक्रोसॉफ्ट ने बिल्डअप के दौरान .NET को सुझाव दिया है कि VB6 डेवलपर्स खुद को VB.NET के लिए तैयार करने के लिए ऐसा करना शुरू करें।
जॉन एम गैंट जूल

यह VBA के बारे में मेरी सबसे बड़ी एकल शिकायत है; मैं शर्त लगाता हूं कि यह जूनियर प्रोग्रामर को VBA में इस शॉर्टकट को जोड़ने के लिए केवल एक दिन लगेगा अगर प्रबंधन इसे जोड़ने की परवाह करता है।
पीट एल्विन

21

आप निम्नलिखित के रूप में वस्तुओं के साथ ऐसा कर सकते हैं।

Dim w As New Widget

लेकिन स्ट्रिंग्स या वेरिएंट के साथ नहीं।


यह सही नहीं है, समग्र रूप से। आप किसी भी डेटा-टाइप (वैल्यू या ऑब्जेक्ट) के साथ एक ही लाइन पर एक वेरिएबल को घोषित और इनिशियलाइज़ कर सकते हैं, बस सेमी-कोलो के साथ "एक्शन" को अलग कर सकते हैं :। कुछ सीमाएँ हैं क्योंकि आप एक ही लाइन (यानी var1 = val1: var2 = val2) पर कई मूल्य घोषणाएँ नहीं कर सकते हैं । यह छिटपुट रूप से बग को हटा देगा और आपको इस प्रकार के असाइनमेंट को कभी-कभी करने की अनुमति देगा, लेकिन इस संकेतन द्वारा पूरी तरह से सुझाव नहीं दिया जाएगा।
गोल्डबिशप

2
@GoldBishop, हाँ, बृहदान्त्र का उपयोग करके एक पंक्ति में कई कथनों को आम तौर पर संयोजित किया जाता है (जैसा कि एलेक्स के ने कहा है)। मैं जो कह रहा हूं वह स्ट्रिंग्स या वेरिएंट के साथ काम नहीं करेगा (या शायद अन्य आदिम या तो) Dim x As New Tसिंटैक्स है, जो केवल वस्तुओं के साथ काम करता है।
जॉन एम गैंट

हां एक कंस्ट्रक्टर इनिशियलाइज़ेशन लाइन पर काम नहीं करेगा लेकिन यह वेरिएंट और स्ट्रिंग असाइनमेंट के साथ काम करेगा। मैं इसका उपयोग हर समय मान प्रकार और कुछ वस्तु प्रकार के लिए करता हूं। dim str as String: str = "value"और dim str as Worksheet: set str = ActiveWorkbook.worksheets("Sheet1")दोनों बार-बार काम करते हैं। हालांकि, अगर मैं एक वस्तु तात्कालिकता dim ws as New Worksheet: set ws = ActiveWorkbook.Worksheets("Sheet1")VBA में किसी भी अन्य अवैध संचालन की तरह त्रुटि होगा।
गोल्डबिशप

3
कोलन ट्रिक वैरिएंट और स्ट्रिंग असाइनमेंट के साथ काम करती है। Newकीवर्ड नहीं करता है। बस इतना ही कह रहा हूं।
जॉन एम गेंट

2
@ जॉनएमट्रेंट आपके उत्तर को स्पष्ट करना चाह सकता है, जैसा कि मैंने पढ़ा है, यह बताता है: कि आप कंस्ट्रक्टर इनिशियलाइज़ेशन और स्ट्रिंग / वेरिएंट वैल्यू टाइप के साथ समान-लाइन असाइनमेंट नहीं कर सकते। कुछ के लिए थोड़ा भ्रमित हो सकता है।
गोल्डबिशप

2

वास्तव में, आप कर सकते हैं, लेकिन इस तरह से नहीं।

Sub MySub( Optional Byval Counter as Long=1 , Optional Byval Events as Boolean= True)

'code...

End Sub

और आप सबवे को कॉल करते समय चर अलग से सेट कर सकते हैं, या उन्हें उनके डिफ़ॉल्ट मानों पर दे सकते हैं।


5
यह तर्क के लिए है, स्थानीय चर नहीं।
ivan_pozdeev

1

कुछ मामलों में एक वेरिएबल घोषित करने की पूरी आवश्यकता को Withस्टेटमेंट का उपयोग करके टाला जा सकता है ।

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

    Dim fd As Office.FileDialog
    Set fd = Application.FileDialog(msoFileDialogSaveAs)
    If fd.Show Then
        'use fd.SelectedItems(1)
    End If

इसे फिर से लिखा जा सकता है

    With Application.FileDialog(msoFileDialogSaveAs)
      If .Show Then
        'use .SelectedItems(1)
      End If
    End With

0

आप एक पंक्ति में नीचे दिखाए अनुसार मान और असाइन कर सकते हैं। मैंने सिंगल लाइन में घोषित और असाइन किए गए दो वेरिएबल्स का उदाहरण दिया है। यदि एकाधिक प्रकार के डेटा प्रकार समान हैं

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