खोज…
योग्यता संबंधी संदर्भ
किसी worksheet
, किसी range
या अलग-अलग cells
का संदर्भ देते समय, संदर्भ को पूरी तरह से योग्य बनाना महत्वपूर्ण है।
उदाहरण के लिए:
ThisWorkbook.Worksheets("Sheet1").Range(Cells(1, 2), Cells(2, 3)).Copy
पूरी तरह से योग्य नहीं है: Cells
संदर्भों में कार्यपुस्तिका और कार्यपत्रक उनके साथ संबद्ध नहीं है। एक स्पष्ट संदर्भ के बिना, सेल डिफ़ॉल्ट रूप से ActiveSheet
को संदर्भित करता है। तो यह कोड विफल हो जाएगा (गलत परिणाम) अगर किसी कार्यपत्रक के अलावा अन्य Sheet1
वर्तमान है ActiveSheet
।
इसे ठीक करने के लिए सबसे आसान तरीका एक का उपयोग करने के लिए है With
बयान इस प्रकार है:
With ThisWorkbook.Worksheets("Sheet1")
.Range(.Cells(1, 2), .Cells(2, 3)).Copy
End With
वैकल्पिक रूप से, आप वर्कशीट चर का उपयोग कर सकते हैं। (यदि आपके कोड को कई वर्कशीट को संदर्भित करने की आवश्यकता है, तो यह सबसे पसंदीदा तरीका होगा, जैसे डेटा को एक शीट से दूसरे में कॉपी करना।)
Dim ws1 As Worksheet
Set ws1 = ThisWorkbook.Worksheets("Sheet1")
ws1.Range(ws1.Cells(1, 2), ws1.Cells(2, 3)).Copy
एक और लगातार समस्या वर्कबुक को योग्य किए बिना वर्कशीट संग्रह को संदर्भित कर रही है। उदाहरण के लिए:
Worksheets("Sheet1").Copy
वर्कशीट Sheet1
पूरी तरह से योग्य नहीं है, और इसमें वर्कबुक का अभाव है। यदि कोड में कई कार्यपुस्तिकाएँ संदर्भित हैं, तो यह विफल हो सकता है। इसके बजाय, निम्न में से एक का उपयोग करें:
ThisWorkbook.Worksheets("Sheet1") '<--ThisWorkbook refers to the workbook containing
'the running VBA code
Workbooks("Book1").Worksheets("Sheet1") '<--Where Book1 is the workbook containing Sheet1
हालांकि, निम्नलिखित का उपयोग करने से बचें:
ActiveWorkbook.Worksheets("Sheet1") '<--Valid, but if another workbook is activated
'the reference will be changed
इसी तरह से range
ऑब्जेक्ट्स के लिए, यदि स्पष्ट रूप से योग्य नहीं है, तो range
वर्तमान में सक्रिय शीट को संदर्भित करेगी:
Range("a1")
के समान है:
ActiveSheet.Range("a1")
एक लूप में पंक्तियों या स्तंभों को हटाना
यदि आप लूप में पंक्तियों (या स्तंभों) को हटाना चाहते हैं, तो आपको हमेशा सीमा के अंत से शुरू होने वाले लूप और हर चरण में वापस जाना चाहिए। कोड का उपयोग करने के मामले में:
Dim i As Long
With Workbooks("Book1").Worksheets("Sheet1")
For i = 1 To 4
If IsEmpty(.Cells(i, 1)) Then .Rows(i).Delete
Next i
End With
आप कुछ पंक्तियों को याद करेंगे। उदाहरण के लिए, यदि कोड पंक्ति 3 को हटाता है, तो पंक्ति 4 पंक्ति 3 हो जाती है। हालाँकि, चर i
4 में बदल जाएगा। इसलिए, इस मामले में कोड एक पंक्ति को याद करेगा और दूसरे की जांच करेगा, जो पहले सीमा में नहीं था।
सही कोड होगा
Dim i As Long
With Workbooks("Book1").Worksheets("Sheet1")
For i = 4 To 1 Step -1
If IsEmpty(.Cells(i, 1)) Then .Rows(i).Delete
Next i
End With
ActiveWorkbook बनाम ThisWorkbook
ActiveWorkbook
और ThisWorkbook
कभी-कभी VBA के नए उपयोगकर्ताओं द्वारा पूरी तरह से समझने के बिना उपयोग किया जाता है, जो प्रत्येक वस्तु से संबंधित है, इससे रन-टाइम पर अवांछित व्यवहार हो सकता है। ये दोनों वस्तुएँ अनुप्रयोग ऑब्जेक्ट से संबंधित हैं
ActiveWorkbook
ऑब्जेक्ट उस कार्यपुस्तिका को संदर्भित करता है जो वर्तमान में एक्सेल एप्लिकेशन ऑब्जेक्ट के निष्पादन के समय सबसे ऊपर है। (उदा। वह कार्यपुस्तिका जिसे आप देख सकते हैं और उस बिंदु पर बातचीत कर सकते हैं जब यह ऑब्जेक्ट संदर्भित हो)
Sub ActiveWorkbookExample()
'// Let's assume that 'Other Workbook.xlsx' has "Bar" written in A1.
ActiveWorkbook.ActiveSheet.Range("A1").Value = "Foo"
Debug.Print ActiveWorkbook.ActiveSheet.Range("A1").Value '// Prints "Foo"
Workbooks.Open("C:\Users\BloggsJ\Other Workbook.xlsx")
Debug.Print ActiveWorkbook.ActiveSheet.Range("A1").Value '// Prints "Bar"
Workbooks.Add 1
Debug.Print ActiveWorkbook.ActiveSheet.Range("A1").Value '// Prints nothing
End Sub
ThisWorkbook
ऑब्जेक्ट उस कार्यपुस्तिका को संदर्भित करता है जिसमें कोड उस समय होता है जब इसे निष्पादित किया जा रहा होता है।
Sub ThisWorkbookExample()
'// Let's assume to begin that this code is in the same workbook that is currently active
ActiveWorkbook.Sheet1.Range("A1").Value = "Foo"
Workbooks.Add 1
ActiveWorkbook.ActiveSheet.Range("A1").Value = "Bar"
Debug.Print ActiveWorkbook.ActiveSheet.Range("A1").Value '// Prints "Bar"
Debug.Print ThisWorkbook.Sheet1.Range("A1").Value '// Prints "Foo"
End Sub
एकल दस्तावेज़ इंटरफ़ेस बनाम एकाधिक दस्तावेज़ इंटरफ़ेस
ज्ञात रहे कि Microsoft Excel 2013 (और उच्चतर) एकल दस्तावेज़ इंटरफ़ेस (SDI) का उपयोग करता है और Excel 2010 (और नीचे) एकाधिक दस्तावेज़ इंटरफ़ेस (MDI) का उपयोग करता है।
इसका मतलब यह है कि Excel 2013 (SDI) के लिए, एक्सेल के एकल उदाहरण में प्रत्येक कार्यपुस्तिका में अपना स्वयं का रिबन UI है:
Excel 2010 के विपरीत, Excel की एकल आवृत्ति में प्रत्येक कार्यपुस्तिका ने एक आम रिबन UI (MDI) का उपयोग किया:
यदि आप VBA कोड (2010 <-> 2013) को स्थानांतरित करना चाहते हैं तो यह कुछ महत्वपूर्ण मुद्दों को उठाता है जो रिबन के साथ इंटरैक्ट करते हैं।
Excel 2013 और उच्चतर के लिए सभी कार्यपुस्तिकाओं में समान स्थिति में रिबन UI नियंत्रण को अद्यतन करने के लिए एक प्रक्रिया बनाई जानी है।
ध्यान दें कि :
- सभी एक्सेल एप्लिकेशन-लेवल विंडो मेथड, इवेंट और प्रॉपर्टी अप्रभावित रहते हैं। (
Application.ActiveWindow
,Application.Windows
...) - Excel 2013 और उच्चतर (SDI) में कार्यपुस्तिका-स्तरीय विंडो विधियों, घटनाओं और गुणों के सभी अब शीर्ष स्तर की विंडो पर काम करते हैं।
Application.Hwnd
साथ इस शीर्ष स्तरीय विंडो के हैंडल को पुनः प्राप्त करना संभव है
अधिक विवरण प्राप्त करने के लिए, इस उदाहरण का स्रोत देखें: MSDN ।
यह भी मॉडल उपयोगकर्ता के साथ कुछ परेशानी का कारण बनता है। समाधान के लिए यहां देखें