Ho il codice seguente che funziona correttamente, tuttavia deve essere eseguito su due array di 130k + righe ciascuno. Il tempo di esecuzione corrente sull'intero set di dati è di circa 24 minuti e dopo aver aggiunto un conteggio a un certo punto, il ciclo si avvicina a 9,8 miliardi di volte.Esiste un modo più rapido per confrontare i dati tra gli array dinamici in VBA?
Ho letto gli articoli sull'utilizzo di Match, Vlookup e sembrano suggerire che un ciclo iterativo (come ho usato) è il metodo più veloce, tuttavia non sono riuscito a capire come far funzionare gli altri metodi con array dinamici e quindi testare in modo appropriato.
Qualcuno è in grado di dirmi se esiste un modo più rapido per completare questa attività e, in tal caso, dimostrare come?
Sub TESTVLOOKUPARRAY()
Dim PSORG1() As Variant
Dim PSORG1Tot As Variant
Dim PSORG1RT As Variant
Dim PSORG2() As Variant
Dim PSORG2Tot As Variant
Dim PSORG2RT As Variant
Sheets("Sheet1").Select
PSORG2RT = Application.CountA(Range("A:A"))
PSORG2Tot = "A1:B" & PSORG2RT
PSORG2 = Range(PSORG2Tot) ' PSORG2 is now an allocated array
Sheets("Sheet2").Select
PSORG1RT = Application.CountA(Range("A:A"))
PSORG1Tot = "A1:B" & PSORG1RT
PSORG1 = Range(PSORG1Tot) ' PSORG1 is now an allocated array
a = 2 ' to increment ORG values in PSORG1
Do
Finish = "No"
b = 1 ' to increment ORG values in PSORG2
Do
If PSORG1(a, 1) = PSORG2(b, 1) Then
PSORG1(a, 2) = PSORG2(b, 2)
Finish = "True"
ElseIf b = PSORG2RT Then
PSORG1(a, 2) = "NULL"
Finish = "True"
End If
b = b + 1
Loop Until Finish = "True"
a = a + 1
Loop Until a = PSORG1RT + 1
Sheets("Sheet2").Select
Set Destination = Range("A1")
Destination.Resize(UBound(PSORG1, 1), UBound(PSORG1, 2)).Value = PSORG1
End Sub
Vorrei utilizzare un ArrayList in quanto ha un metodo '.Exists()' per il confronto veloce. –
Assicurati di farci sapere chi era il vincitore (sui tuoi dati). : P – Jeeped
Dato che il tuo codice funziona come previsto, solo più lentamente di quanto desideri, sarebbe molto meglio adattarlo a [Code Review] (http://codereview.stackexchange.com/). – FreeMan