Seçimden kaçınmanın bazı örnekleri
Dim'D değişkenlerini kullan
Dim rng as Range
Setdeğişkeni istenen aralığa getirin. Tek hücre aralığına başvurmanın birçok yolu vardır
Set rng = Range("A1")
Set rng = Cells(1,1)
Set rng = Range("NamedRange")
veya çok hücreli bir aralık
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)
Sen edebilirsiniz kısayol kullanmak Evaluateyöntemle, ancak bu daha az verimlidir ve genellikle üretim kodunda kaçınılmalıdır.
Set rng = [A1]
Set rng = [A1:B10]
Yukarıdaki örneklerin tümü, etkin sayfadaki hücrelere karşılık gelir . Özellikle etkin sayfa ile çalışmak istemiyorsanız, bir Worksheetdeğişkeni de karartmak daha iyidir
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
Eğer varsa do çalışmak isteyen ActiveSheet, netlik için o açık olmak en iyisidir. Ancak bazı Worksheetyöntemler etkin sayfayı değiştirirken dikkatli olun .
Set rng = ActiveSheet.Range("A1")
Yine, bu aktif çalışma kitabını ifade eder . Özellikle ActiveWorkbookveya ile çalışmak istemediğiniz sürece ThisWorkbook, bir Workbookdeğişkeni de karartmak daha iyidir .
Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")
Eğer varsa do çalışmak isteyen ActiveWorkbook, netlik için o açık olmak en iyisidir. Ancak WorkBook, aktif kitabı değiştirirken birçok yöntem dikkat edin.
Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")
ThisWorkbookNesneyi, çalışan kodu içeren kitaba başvurmak için de kullanabilirsiniz .
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")
Yaygın (kötü) bir kod parçası bir kitap açmak, bazı verileri almak ve tekrar kapatmaktır
Bu kötü:
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
Ve daha iyi olurdu:
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
Aralıklarınızı aralık değişkenleri olarak Subs ve s'lerinize aktarınFunction
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
Değişkenlere Yöntem ( Findve gibi Copy) de uygulamalısınız
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
Bir hücre aralığında döngü yapıyorsanız, önce aralık değerlerini bir varyant dizisine kopyalamak ve bunun üzerine döngü yapmak genellikle daha iyidir (daha hızlı)
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
Bu mümkün olan için küçük bir çeşnidir.
SelectVe / veyaActiveSheetetc vs kullanımının kaçınılmaz olduğunu unutmamak önemlidir . Bulduğum bir örnek: stackoverflow.com/questions/22796286/…