Einige Beispiele für die Vermeidung der Auswahl
Utilice Dim
Variablen
Dim rng as Range
Set
die Variable auf den gewünschten Bereich. Es gibt viele Möglichkeiten, sich auf einen Bereich für eine einzelne Zelle zu beziehen:
Set rng = Range("A1")
Set rng = Cells(1, 1)
Set rng = Range("NamedRange")
Oder ein mehrzelliges Angebot:
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)
Usted puede verwenden Sie die Abkürzung zum Evaluate
Methode, aber dies ist weniger effizient und sollte im Allgemeinen in Produktionscode vermieden werden.
Set rng = [A1]
Set rng = [A1:B10]
Alle oben genannten Beispiele beziehen sich auf Zellen auf der Seite aktives Blatt . Wenn Sie nicht ausdrücklich nur mit dem aktiven Blatt arbeiten wollen, ist es besser, ein Dim Worksheet
auch variabel:
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 為さる wollen mit dem ActiveSheet
Um Klarheit zu schaffen, ist es am besten, sich klar auszudrücken. Aber Vorsicht, denn einige Worksheet
Methoden ändern das aktive Blatt.
Set rng = ActiveSheet.Range("A1")
Dies bezieht sich wiederum auf die aktive Arbeitsmappe . Wenn Sie nicht ausdrücklich nur mit dem ActiveWorkbook
o ThisWorkbook
ist es besser, ein Dim Workbook
auch variabel.
Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")
Wenn Sie 為さる wollen mit dem ActiveWorkbook
Um Klarheit zu schaffen, ist es am besten, sich klar auszudrücken. Aber Vorsicht, da viele WorkBook
Methoden ändern das aktive Buch.
Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")
Sie können auch die ThisWorkbook
Objekt, um auf das Buch zu verweisen, das den laufenden Code enthält.
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")
Ein gängiges (schlechtes) Codestück ist das Öffnen eines Buches, das Abrufen von Daten und das erneute 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 es wäre besser so:
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 an Ihre Sub
s und Function
s als Bereichsvariablen:
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 anwenden (wie Find
y Copy
) zu Variablen:
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 eine Schleife über einen Bereich von Zellen ziehen, ist es oft besser (schneller), die Werte des Bereichs zuerst in ein Varianten-Array zu kopieren und eine Schleife darüber zu ziehen:
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.