eccomi qui ad esporre una nuova necessità.
Ho un foglio contenente diverse migliaia di righe, oggi sono poco meno di 4.000 ma sono destinate ad aumentare nel tempo.
I dati, senza formule, vanno dalla colonna “A” alla colonna “M”
Dalla colonna “N” fino alla colonna “X” ci sono formule semplici, tipo “SE”, “Anno”, “Mese”, “Concatenamenti”.
I nuovi dati vengono accodati a quelli esistenti.
Dopo aver inserito i nuovi dati devo effettuare l’ordinamento di tutti i dati presenti dalla colonna “A” alla colonna “M”, le altre contenenti formule non necessitano di ordinamento.
I dati vanno ordinati prima per colonna “A” (contiene una data), poi “E” (contiene una stringa di testo) ed infine per la colonna “I” (contiene un importo).
Prima condizione: i valori inseriti nelle varie righe possono avere date che sono minori dell’ultima data inserita, quindi, le nuove righe andranno a posizionarsi tra le altre righe già esistenti.
L’ordinamento lo faccio con una semplice macro che fa le seguenti azioni:
1. Toglie l’eventuale filtro eventualmente applicato ad una o più colonne
2. Ordina l’intervallo “A-M” con la funzione “Sort” del VBA
Ad oggi con le righe attualmente inserite il tempo di elaborazione è di circa 8-9 secondi.
Non è tanto ma neanche poco e devo dire che l’utilizzatore non è molto contento di questa attesa.
Ho provato con 15.000 righe ed il tempo è diventato 55-60 secondi che è una ETERNITA’
La mia richiesta è:
c’è un altro modo per rendere veloce le operazioni fatte al punto 1 ed al punto 2?
Forse con un ordinamento fatto in una array che viene caricata con i dati dall’intervallo A-M e a fine ordinamento copia la matrice nell’intervallo di partenza?
Si accetta qualunque soluzione che sia più veloce di quella attuale.
Grazie a tutti
Questo è il semplice codice che utilizzo
- Codice: Seleziona tutto
Inizio = Timer
Application.ScreenUpdating = False
Selection.AutoFilter Field:=2, Criteria1:="<>"
ActiveSheet.ShowAllData
UR = Range("B" & Rows.Count).End(xlUp).Row
Range("A10:M" & UR).Select
Selection.Sort Key1:=Range("B11"), Order1:=xlAscending, Key2:=Range("E11" _
), Key3:=Range("I11"), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal
Application.ScreenUpdating = True
Fine = Timer
MsgBox "Elaborazione effettuata in " & Format(Fine - Inizio, "0.000") & " secondi"