Seçimden kaçınmanın bazı örnekleri
Dim
'D değişkenlerini kullan
Dim rng as Range
Set
değ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 Evaluate
yö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 Worksheet
değ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ı Worksheet
yöntemler etkin sayfayı değiştirirken dikkatli olun .
Set rng = ActiveSheet.Range("A1")
Yine, bu aktif çalışma kitabını ifade eder . Özellikle ActiveWorkbook
veya ile çalışmak istemediğiniz sürece ThisWorkbook
, bir Workbook
değ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")
ThisWorkbook
Nesneyi, ç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 Sub
s 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 ( Find
ve 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.
Select
Ve / veyaActiveSheet
etc vs kullanımının kaçınılmaz olduğunu unutmamak önemlidir . Bulduğum bir örnek: stackoverflow.com/questions/22796286/…