चयन से बचने के कुछ उदाहरण
Dim'D वैरिएबल का उपयोग करें
Dim rng as Range
Setआवश्यक रेंज के लिए चर। एकल-कक्ष श्रेणी को संदर्भित करने के कई तरीके हैं
Set rng = Range("A1")
Set rng = Cells(1,1)
Set rng = Range("NamedRange")
या एक मल्टी-सेल रेंज
Set rng = Range("A1:B10")
Set rng = Range("A1", "B10")
Set rng = Range(Cells(1,1), Cells(10,2))
Set rng = Range("AnotherNamedRange")
Set rng = Range("A1").Resize(10,2)
आप शॉर्टकट को विधि का उपयोग कर सकते हैं Evaluate, लेकिन यह कम कुशल है और आमतौर पर उत्पादन कोड से बचा जाना चाहिए।
Set rng = [A1]
Set rng = [A1:B10]
उपरोक्त सभी उदाहरण सक्रिय शीट पर कोशिकाओं को संदर्भित करते हैं । जब तक आप विशेष रूप से केवल सक्रिय शीट के साथ काम करना चाहते हैं, तब तक एक Worksheetचर को भी डिम करना बेहतर है
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Set rng = ws.Cells(1,1)
With ws
Set rng = .Range(.Cells(1,1), .Cells(2,10))
End With
यदि आप स्पष्टता के साथ काम करना चाहते हैं ActiveSheet, तो स्पष्ट होना सबसे अच्छा है। लेकिन ध्यान रखना, क्योंकि कुछ Worksheetतरीके सक्रिय शीट को बदलते हैं।
Set rng = ActiveSheet.Range("A1")
फिर, यह सक्रिय कार्यपुस्तिका को संदर्भित करता है । जब तक आप विशेष रूप से ActiveWorkbookया के साथ ही काम करना चाहते हैं, तब तक ThisWorkbookएक Workbookचर को भी डिम करना बेहतर है।
Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")
यदि आप स्पष्टता के साथ काम करना चाहते हैं ActiveWorkbook, तो स्पष्ट होना सबसे अच्छा है। लेकिन ध्यान रखना, क्योंकि कई WorkBookतरीके सक्रिय पुस्तक को बदलते हैं।
Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")
आप ThisWorkbookचल रहे कोड वाली पुस्तक को संदर्भित करने के लिए ऑब्जेक्ट का उपयोग भी कर सकते हैं ।
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")
कोड का एक सामान्य (खराब) टुकड़ा एक किताब खोलना, कुछ डेटा प्राप्त करना और फिर बंद करना है
ये गलत है:
Sub foo()
Dim v as Variant
Workbooks("Book1.xlsx").Sheets(1).Range("A1").Clear
Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
v = ActiveWorkbook.Sheets(1).Range("A1").Value
Workbooks("SomeAlreadyOpenBook.xlsx").Activate
ActiveWorkbook.Sheets("SomeSheet").Range("A1").Value = v
Workbooks(2).Activate
ActiveWorkbook.Close()
End Sub
और बेहतर होगा:
Sub foo()
Dim v as Variant
Dim wb1 as Workbook
Dim wb2 as Workbook
Set wb1 = Workbooks("SomeAlreadyOpenBook.xlsx")
Set wb2 = Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
v = wb2.Sheets("SomeSheet").Range("A1").Value
wb1.Sheets("SomeOtherSheet").Range("A1").Value = v
wb2.Close()
End Sub
रेंज चर के रूप में अपने Subएस और Functionएस के लिए सीमाएं पास करें
Sub ClearRange(r as Range)
r.ClearContents
'....
End Sub
Sub MyMacro()
Dim rng as Range
Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:B10")
ClearRange rng
End Sub
आपको चर (जैसे ) Findऔर विधियों को भी Copyचर पर लागू करना चाहिए
Dim rng1 As Range
Dim rng2 As Range
Set rng1 = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10")
Set rng2 = ThisWorkbook.Worksheets("SomeSheet").Range("B1:B10")
rng1.Copy rng2
यदि आप कक्षों की एक सीमा पर लूपिंग कर रहे हैं तो रेंज वैल्यू को कॉपी करने के लिए वेरिएंट एरे को पहले और बेहतर तरीके से कॉपी करना बेहतर (तेज) है।
Dim dat As Variant
Dim rng As Range
Dim i As Long
Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10000")
dat = rng.Value ' dat is now array (1 to 10000, 1 to 1)
for i = LBound(dat, 1) to UBound(dat, 1)
dat(i,1) = dat(i,1) * 10 'or whatever operation you need to perform
next
rng.Value = dat ' put new values back on sheet
यह संभव है के लिए एक छोटी सी कसाव है।
Selectऔर / याActiveSheetआदि पूरी तरह से अपरिहार्य हैं। यहाँ एक उदाहरण है जो मैंने पाया: stackoverflow.com/questions/22796286/…