Ziehen Sie in Betracht, Variablen zu nutzen, um mit Daten im Speicher zu arbeiten, anstatt direkt auf Arbeitsblätter zu verweisen.
Vermeiden Sie übermäßige Referenzen
Wenn Sie eine Methode oder Eigenschaft eines Objekts aufrufen, muss diese über die IDispatch-Schnittstelle der OLE-Komponente erfolgen. Die Aufrufe dieser OLE-Komponenten nehmen Zeit in Anspruch, daher kann die Reduzierung der Anzahl der Verweise auf OLE-Komponenten die Geschwindigkeit des Makrocodes verbessern.
Für den Aufruf von Objekteigenschaften oder -methoden wird im Allgemeinen die Darstellungsmethode von Object.Method verwendet, also das „.“ Das Symbol wird zum Aufrufen von Eigenschaften und Methoden verwendet.
Daher kann die Anzahl der Methoden- oder Eigenschaftsaufrufe anhand der Anzahl der Symbole „.“ beurteilt werden. Je weniger das „.“ Symbol, desto schneller wird der Code ausgeführt.
Die folgende Anweisung enthält beispielsweise drei Symbole „.“
ThisWorkbook.Sheet1.Range("A1").Value = 100
Die folgende Anweisung hat nur ein Symbol „.“
Activewindow.Top = 100
Hier sind einige Tricks, um die Anzahl der Symbole zu reduzieren. schneller laufen.
Wenn Sie wiederholt auf dasselbe Objekt verweisen müssen, können Sie zunächst das Objekt auf eine Variable setzen, um die Anzahl der Aufrufe zu reduzieren. Der folgende Code erfordert beispielsweise zwei Aufrufe pro Zeile.
ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = 100
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = 200
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = 300
Da auf das Sheets("Sheet1") -Objekt wiederholt verwiesen werden muss, kann es zunächst auf eine Variable sht gesetzt werden , sodass jeder Code nur einmal aufgerufen werden muss.
Set sht = ThisWorkbook.Sheets("Sheet1")
sht.Cells(1, 1) = 100
sht.Cells(2, 1) = 200
sht.Cells(3, 1) = 300
Zweitens: Wenn Sie keine temporäre Variable sht deklarieren möchten, können Sie auch die zuvor erwähnte With- Anweisung verwenden. Wie im folgenden Beispiel gezeigt:
With ThisWorkbook.Sheets("Sheet1")
.Cells(1, 1) = 100
.Cells(2, 1) = 200
.Cells(3, 1) = 300
End With
Drittens: Wenn es viele Schleifen gibt, versuchen Sie, Eigenschaften und Methoden außerhalb der Schleife zu halten. Wenn Sie einen Eigenschaftswert desselben Objekts in einer Schleife wiederverwenden, können Sie den Eigenschaftswert zunächst einer angegebenen Variablen außerhalb der Schleife zuweisen und dann die Variable in der Schleife verwenden, wodurch eine schnellere Geschwindigkeit erreicht werden kann. Wie im folgenden Beispiel gezeigt:
For i = 1 To 1000
ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = Cells(1, 2).Value
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = Cells(1, 2).Value
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = Cells(1, 2).Value
Next i
Jede Schleife in diesem Beispiel erhält die Value-Eigenschaft der Zelle Cells(1,2). Wenn Sie die Value-Eigenschaft von Cells(1.2) vor Beginn der Schleife einer Variablen zuweisen, erhalten Sie eine schnellere Ausführung. Wie im folgenden Beispiel gezeigt:
tmp = Cells(1, 2).Value
For i = 1 To 1000
ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = tmp
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = tmp
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = tmp
Next i
Der obige Code ruft bei jeder Schleife ThisWorkbook.Sheets("Sheet1") auf. Sie können dies schneller tun, indem Sie die With- Anweisung verwenden, um den Aufruf an ThisWorkbook.Sheets("Sheet1") außerhalb der Schleife zu verschieben. Wie im folgenden Beispiel gezeigt:
tmp = Cells(1, 2).Value
With ThisWorkbook.Sheets("Sheet1")
For i = 1 To 1000
.Cells(1, 1) = tmp
.Cells(2, 1) = tmp
.Cells(3, 1) = tmp
Next i
End With
Vermeiden Sie die Verwendung von Variantentypen
Anfänger bevorzugen in der Regel die Verwendung von Variablen vom Typ Variant. Dies hat den Vorteil, dass es weniger kompliziert ist, da jeder Datentyp verwendet werden kann, ohne dass das Problem eines Speicherüberlaufs auftritt, wenn die Daten für die Datentypen Integer oder Long zu groß sind. Daten vom Typ Varienmt erfordern jedoch mehr zusätzlichen Speicherplatz als die anderen angegebenen Typen (2 Byte für Integer-Daten, 4 Byte für Long-Daten und 16 Byte für Variant-Daten). VBA benötigt mehr Zeit für die Verarbeitung von Daten vom Typ Variant als andere angegebene Typen von Dateien. Wie das folgende Beispiel zeigt.
Sub VariantTest()
Dim i As Long
Dim ix As Integer, iy As Integer, iz As Integer
Dim vx As Variant, vy As Variant, vz As Variant
Dim tm As Date
vx = 100: vy = 50
tm = Timer
For i = 1 To 1000000
vz = vx * vy
vz = vx + vy
vz = vx - vy
vz = vx / vy
Next i
Debug.Print "Variant types take " & Format((Timer - tm), "0.00000") & " seconds"
ix = 100: iy = 50
tm = Timer
For i = 1 To 1000000
iz = ix * iy
iz = ix + iy
iz = ix - iy
iz = ix / iy
Next i
Debug.Print "Integer types take " & Format((Timer - tm), "0.00000") & " seconds"
End Sub
Im obigen Code führen die Zeilen 8 bis 13 1 Million Additions-, Subtraktions-, Multiplikations- und Divisionsoperationen von Variant-Variablen aus, und die Zeilen 17 bis 22 führen 1 Million Additions-, Subtraktions-, Multiplikations- und Divisionsoperationen von Integer-Variablen durch. Auf meinem Computer dauerte die Operation der Variant-Variablen etwa 0,09375 Sekunden, während die Operation der Integer-Variablen etwa 0,03125 Sekunden dauerte. Die Ergebnisse können von Computer zu Computer unterschiedlich sein, Variant-Variablen sind jedoch deutlich langsamer als Integer-Variablen .
Aus diesem Grund wird empfohlen, die Verwendung von Variant-Variablen zu vermeiden, wenn Sie den angegebenen Datentyp explizit verwenden können .