खोज…


योग्यता संबंधी संदर्भ

किसी 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 नियंत्रण को अद्यतन करने के लिए एक प्रक्रिया बनाई जानी है।

ध्यान दें कि :

  1. सभी एक्सेल एप्लिकेशन-लेवल विंडो मेथड, इवेंट और प्रॉपर्टी अप्रभावित रहते हैं। ( Application.ActiveWindow , Application.Windows ...)
  2. Excel 2013 और उच्चतर (SDI) में कार्यपुस्तिका-स्तरीय विंडो विधियों, घटनाओं और गुणों के सभी अब शीर्ष स्तर की विंडो पर काम करते हैं। Application.Hwnd साथ इस शीर्ष स्तरीय विंडो के हैंडल को पुनः प्राप्त करना संभव है

अधिक विवरण प्राप्त करने के लिए, इस उदाहरण का स्रोत देखें: MSDN

यह भी मॉडल उपयोगकर्ता के साथ कुछ परेशानी का कारण बनता है। समाधान के लिए यहां देखें



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