Non riesco a sequire le discussioni (nessuna) per impegni superiori legati alle mia vacanze
, quindi non so dove siete arrivati...
Con macro ho ottenuto dei tempi decorosi, sul file pubblicato, dell' ordine di 40-45 sec usando un oggetto "Dictionary" in una macro di questo tipo:
- Codice: Seleziona tutto
Sub BxorA()
Dim myArrC(), myVArrA, myVArrB, LastA As Long, LastB As Long
Dim myD 'my Dictionary
Set myD = CreateObject("Scripting.Dictionary") 'Modalita' Late Binding
myD.RemoveAll ' Clear del dictionary
Range("C1:C1000000").Clear
'
LastA = Cells(Rows.Count, 1).End(xlUp).Row
'LastA = 600000
LastB = Cells(Rows.Count, 2).End(xlUp).Row
'LastB = 200000
ReDim myArrC(1 To LastB)
[E1] = Timer
myVArrA = Range("A1:A" & LastA).Value
myVArrB = Range("B1:B" & LastB).Value
'Col A -> dictionary:
On Error Resume Next
For I = LBound(myVArrA, 1) To LastA
If Application.WorksheetFunction.IsText(myVArrA(I, 1)) Then
' If Not myD.Exists(myVArrA(I, 1)) Then
myD.Add Trim(myVArrA(I, 1)), Trim(myVArrA(I, 1))
' J = J + 1
' End If
End If
Next I
On Error GoTo 0
[E2] = Timer
'Confronta col B col Dictionary:
For I = 1 To LastB
If Not myD.Exists(Trim(myVArrB(I, 1))) Then
J = J + 1
myArrC(J) = Trim(myVArrB(I, 1))
End If
Next I
'
'Carica risultato in col C
ReDim Preserve myArrC(1 To J)
If J < 65536 Then
Range("C1:C" & UBound(myArrC, 1)) = Application.WorksheetFunction.Transpose(myArrC())
Else
For I = 1 To J
Cells(I, 3) = myArrC(I)
Next I
End If
[E3] = Timer
End Sub
Se l' elenco risultante e' superiore a 65000 voci sara' necessario scaricare il contenuto di myArrC() una cella alla volta (anche con XL2010), altrimenti sara' possibile fare tutto con l' istruzione che contiene .Traspose; questo e' gia nella macro.
Col file pubblicato l' elenco e' di meno di 5400 voci, e l' operazione viene compita in circa 40 secondi totale; simulando un elenco di circa 120k voci vanno aggiunti circa 10 secondi.
Eventuali spazi iniziali e finali di col A e B (ce ne sono tantissimi, specie in col B) sono eliminati.
Guarda anche il messaggio di Flash sopra il mio.
Ciao a tutti