Einige Beispiele zur Vermeidung von Auswahl
Verwenden Sie Dim'd Variablen
Dim rng as Range
Setdie 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 EvaluateMethode 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 WorksheetVariable 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 WorksheetMethoden das aktive Blatt ändern.
Set rng = ActiveSheet.Range("A1")
Dies bezieht sich wiederum auf die aktive Arbeitsmappe . Sofern Sie nicht speziell nur mit dem ActiveWorkbookoder arbeiten möchten ThisWorkbook, ist es besser, auch eine WorkbookVariable 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 WorkBookMethoden das aktive Buch verändern.
Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")
Sie können das ThisWorkbookObjekt 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 Subs und Functions
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 Findund 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.
Selectund / oderActiveSheetusw. usw. völlig unvermeidbar ist. Hier ist ein Beispiel, das ich gefunden habe: stackoverflow.com/questions/22796286/…