चयन से बचने के कुछ उदाहरण
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/…