Einige Beispiele zur Vermeidung von Auswahl
Verwenden Sie Dim
'd Variablen
Dim rng as Range
Set
die Variable auf den gewünschten Bereich. Es gibt viele Möglichkeiten, sich auf einen Einzelzellenbereich zu beziehen
Set rng = Range("A1")
Set rng = Cells(1,1)
Set rng = Range("NamedRange")
oder ein Mehrzellenbereich
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)
Sie können die Verknüpfung zur Evaluate
Methode verwenden, dies ist jedoch weniger effizient und sollte im Produktionscode generell vermieden werden.
Set rng = [A1]
Set rng = [A1:B10]
Alle obigen Beispiele beziehen sich auf Zellen auf dem aktiven Blatt . Wenn Sie nicht speziell nur mit dem aktiven Blatt arbeiten möchten, ist es besser, auch eine Worksheet
Variable zu dimmen
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
Wenn Sie mit dem arbeiten möchten ActiveSheet
, ist es aus Gründen der Klarheit am besten, explizit zu sein. Aber seien Sie vorsichtig, da einige Worksheet
Methoden das aktive Blatt ändern.
Set rng = ActiveSheet.Range("A1")
Dies bezieht sich wiederum auf die aktive Arbeitsmappe . Sofern Sie nicht speziell nur mit dem ActiveWorkbook
oder arbeiten möchten ThisWorkbook
, ist es besser, auch eine Workbook
Variable zu dimmen .
Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")
Wenn Sie mit dem arbeiten möchten ActiveWorkbook
, ist es aus Gründen der Klarheit am besten, explizit zu sein. Aber seien Sie vorsichtig, da viele WorkBook
Methoden das aktive Buch verändern.
Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")
Sie können das ThisWorkbook
Objekt auch verwenden , um auf das Buch zu verweisen, das den laufenden Code enthält.
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")
Ein häufiger (schlechter) Code besteht darin, ein Buch zu öffnen, einige Daten abzurufen und dann wieder zu schließen
Das ist schlecht:
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
Und wäre besser wie:
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
Übergeben Sie Bereiche als Bereichsvariablen an Ihre Sub
s und Function
s
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
Sie sollten auch Methoden (wie Find
und Copy
) auf Variablen anwenden
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
Wenn Sie einen Bereich von Zellen durchlaufen, ist es häufig besser (schneller), die Bereichswerte zuerst in ein variantes Array zu kopieren und diesen zu durchlaufen
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
Dies ist ein kleiner Vorgeschmack auf das, was möglich ist.
Select
und / oderActiveSheet
usw. usw. völlig unvermeidbar ist. Hier ist ein Beispiel, das ich gefunden habe: stackoverflow.com/questions/22796286/…