2016-07-28 7 views
1

Ich habe eine Reihe von Schleifen in einer Funktion und sie Schleife über ein Array, das ich als einen dynamischen Bereich definiert. Nachfolgend finden Sie einige Pseudo-Code von dem, was ichSetzen Bereich in ein Array für effizientere Schleifen

Dim myArray As Range 
myArray(x, j) 'So the array loops through each column and then each row in that column 
For i = 1 to lastRow 
If myArray(x, j).Value = myArray(x, i).Value Then 
'Do something 

ich ein paar dieser Schleifen haben erreichen wollen, und es ist super langsam mit Datensätzen von mehr als 100 Zeilen. Grundsätzlich überall dort, wo ich myArray als einen Bereich definiert habe, möchte ich es in eine Variante ändern, so dass ich a) über das Array schleifen und b) das Array verwenden kann, um zu prüfen, ob die Werte gleich sind, anstatt den Bereich gegen einen Bereich zu prüfen. das ist wahrscheinlich die Ursache für die Performance-Probleme, wenn es 200 Zeilen * 500 Spalten

bearbeiten

Wie kann ich einen dynamisch definierten Bereich in einem Array-Format konvertieren?

Muss ich so etwas tun?

lastRow = UBound(myArray, 1) 
lastColumn = UBound(myArray, 2) 

Und dann

If myArray(x, j) = myArray(x, i) Then 
'Do something 
+0

Also, was ist Ihre Frage? und realisiere "Wie kann ich das machen?" ist zu breit. –

+0

@ScottCraner Messepunkt, geben Sie mir eine Sekunde, ich werde mehr Code hinzufügen, um zu klären – MJ95

Antwort

2

Um einen Bereich in ein Array zu laden:

Dim RngArr() as Variant 
RngArr = WorkSheets("Sheet1").Range("A1:D4").Value 

Dies erstellen und Array, das 4 x 4.

Um den Bereich zu machen dynamisch

Dim RngArr() as Variant 
Dim lastrow as Long 
Dim lastColumn as Long 

lastrow = 10 
lastColumn = 10 

With WorkSheets("Sheet1") 
    RngArr = .Range(.Cells(1,1),.Cells(lastrow,lastColumn)).Value 
End With 

Wenn Sie das Array auf diese Weise laden, ist die Untergrenze beider Dimensionen 1 und nicht 0, wie es sonst der Fall wäre.

durch das Array iterieren:

Dim i as long, j as long 
For i = lbound(RngArr, 1) to Ubound(RngArr, 1) 
    For j = lbound(RngArr, 2) to Ubound(RngArr, 2) 
     'Do something with RngArr(i,j) 
    Next j 
Next i 

Das zweite Kriterium des LBound und ubound Die Dimension ist.

+0

Wie würde das für einen dynamischen Bereich funktionieren? Also, wo die Zeilen und Spalten beide Variablen sind – MJ95

+0

Sie würden den Bereich jede normale Methode zum Festlegen des Bereichs festlegen. –

+0

Ok, also in meinem Fall würde ich die zwei Schleifen wechseln, da ich Spalten x Reihen Iteriere, nicht wahr? Und dann, um Werte in Zellen zu vergleichen, kann ich tun, wenn RngArr (i, j) <> "leer" dann ... – MJ95

Verwandte Themen