Ich bin versucht, ein Array in MS Access VBA rediminsion. Was ist der effizienteste Weg, dies zu tun?Wie dimensionieren Sie ein Array in VBA?
Antwort
Wie wäre es ...
Diese Daten bereits in MyArray
Redim Preserve MyArray(15)
bewahren Dies wird bestehende alle vorherigen Daten löschen in MyArray
Redim MyArray(15)
Die effiziente Weg Die Redimensionierung eines Arrays beschränkt die Anzahl der Größenanpassungen dieses Arrays. Jedes Mal, wenn Sie die Größe des Arrays ändern, nimmt VB das gesamte Array und kopiert es, wodurch Zeit und Speicher verschwendet werden.
Wenn Sie nicht über die Größe der Array zur Entwicklungszeit wissen, sollten Sie die beste Vermutung auf die maximale Größe des Arrays machen, dann das Array füllen. Sobald Sie das Array gefüllt haben, können Sie es auf die richtige Größe verkleinern.
in Schleifen ist es oft am besten, diese Vermutung zu machen, indem die Größe des aktuellen Arrays verdoppelt, wenn Sie aus dem Raum laufen. Sie können dies unter in Aktion mit RedimTestA()
der Anordnung jede Iteration (1.000.000 mal) Ändern der Größe und RedimTestB()
Ändern der Größe nur gelegentlich (22-mal).
Auf meinem Laptop RedimTestA()
dauert 3,93 Sekunden und RedimTestB()
dauert 0,41 Sekunden.
Option Explicit
Sub RedimTest()
Dim tA, tB As Single
tA = RedimTestA(1000000)
tB = RedimTestB(1000000)
MsgBox "Test A takes : " & tA & ", and Test B takes : " & tB
End Sub
Function RedimTestA(iterations As Long) As Single
Dim t As Single
Dim i As Long
Dim aryString() As String
Dim myString As String
t = Timer
Do While i <= iterations
ReDim Preserve aryString(i) As String
aryString(i) = "ABCEFG123"
i = i + 1
Loop
RedimTestA = Timer - t
End Function
Function RedimTestB(iterations As Long) As Single
Dim t As Single
Dim i As Long
Dim aryString() As String
Dim myString As String
t = Timer
ReDim aryString(0) As String
Do While i <= iterations
If i >= UBound(aryString) Then
ReDim Preserve aryString(i * 2) As String
End If
aryString(i) = "ABCEFG123"
i = i + 1
Loop
ReDim Preserve aryString(i - 1) As String ' i - 1 becuase of the final i = i + 1
RedimTestB = Timer - t
End Function
Beachten Sie auch, dass Sie nur die rechte Dimension eines multidimensionalen Arrays redimieren können.
Das ist eine wichtige subtile Note zu berücksichtigen. –
- 1. Excel VBA - Wie ein 2D-Array Redim?
- 2. VBA Public Array: wie?
- 3. Wie man ein Array in eine Variable speichert - VBA
- 4. Wie ein Array an eine Funktion in VBA zu übergeben?
- 5. Wie ein Array von zwei Arrays in VBA-Funktion
- 6. Erstellen Sie ein Array von Access-Tabelle VBA
- 7. Excel VBA-Funktion, die ein Array zurückgibt
- 8. Deklarieren Sie ein Array für eine Schleife vba mit
- 9. Bestellen Sie ein Array wie ein anderes Array in C#
- 10. Array-Funktion in Excel VBA
- 11. Array von Variablen in VBA
- 12. vba ein Array an eine Dictionary.keys vorbei
- 13. VBA, entfernen Sie Duplikate aus Array
- 14. VBA-Array in eine Liste
- 15. Excel VBA, wie Sie den Wert mehrerer nicht zusammenhängender Bereiche in ein Array kopieren
- 16. Paste vba Array
- 17. Wie Sie ein Array-Literal in C#
- 18. Wie übergibt man ein Array von C# -Funktion an VBA?
- 19. VBA Array konvertieren Typ
- 20. Excel-VBA Erstellen eines 3D-Array von 3 1D-Arrays
- 21. Hash-Tabelle/Assoziatives Array in VBA
- 22. Einen benannten Excel-Bereich in ein Array (VBA) lesen
- 23. Dynamisch ein Array in einem UserForm (VBA) erstellen
- 24. VBA - Daten von Array in einem anderen Array
- 25. VBA Array hinzufügen
- 26. Wie Array zu Bereich Excel VBA zurückgegeben
- 27. Wie konvertiert man String-Array zu Variant-Array - Excel VBA
- 28. VBA String-Array
- 29. VBA Array- und Stringfehler
- 30. Array-Werte in einem VBA-Wörterbuch ändern
Oh, komm schon - es sei denn, du bist in einer Schleife mit 1000s Wiederholungen ReDimming, das wird nicht wirklich ein realistisches Problem sein. Ich habe eine Menge Code da draußen, dass ReDims-Arrays die ganze Zeit und es gibt weder Leistung noch Speicherprobleme. Auf der anderen Seite verwende ich keine Arrays zum Speichern von 1000er Werten (dafür gibt es Tabellen und Recordsets). –
Stimmen Sie @David vollständig zu. Dies ist zur Laufzeit effizienter, aber würde ich es verwenden? Nur selten, wahrscheinlich nur, wenn ich eine Art magischer Array-Handling-Klasse schrieb. –
Die Antwort auf die Frage, ob impliziert oft eine Datensatzcursortyp zu verwenden, die die Eigenschaft Record unterstützt (das heißt zurück die Anzahl der Zeilen), so kann man in einem Treffer die Array-Dimension. Wenn das Re-Cord ADO ist, können Sie seine GetRows-Methode verwenden, um ein Array von Inhalten zurückzukehren, ohne überhaupt :) – onedaywhen