PDA

View Full Version : Ordinare dati Excel tramite VBA


Mnka
12-08-2012, 11:09
Ciao a tutti!
Avrei un problema ad ordinare dei dati in excel tramite vba: in pratica dovrei piazzare nel foglio un pulsante che per mezzo di una macro mi ordini dei dati.
Ho 3 colonne (A,B,C) e dovrei ordinare in ordine alfabetico la prima e le restanti due (che contengono valori numerici) di conseguenza. esempio:

ORIGINE:
(A - frutta) (B - costo) (C - ricavo)
ALBICOCCHE 1 1,5
MELE 1,5 1,8
FRAGOLE 0,5 2,2
ARANCE 2 2,1

RISULTATO:
(A - frutta) (B - costo) (C - ricavo)
ALBICOCCHE 1 1,5
ARANCE 2 2,1
FRAGOLE 0,5 2,2
MELE 1,5 1,8

Ho trovato diversi esempi di funzine sort, ma non riesco a capirne i parametri...
Come posso fare?
Grazie;)

MarcoGG
13-08-2012, 13:40
Classico problema di ordinamento a cascata di un Range con più criteri di ordinamento. Alcuni esempi online semplicemente non funzionano perchè vengono tirate in ballo operazioni di selezione, che in VBA e automazione, NON sono necessarie, e spesso sono dannose.

Il mio esempio per il tuo quesito, facile da leggere/adattare è il seguente :

'Range da ordinare : [A2:C10]

Dim WS As Worksheet
Set WS = ThisWorkbook.Worksheets("Foglio2")
Dim R As Range
Set R = WS.Range("A2:C10")

With WS.Sort

.SortFields.Clear

'Colonna A ASC
.SortFields.Add Key:=Range("A2:A10"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
'Colonna B ASC
.SortFields.Add Key:=Range("B2:B10"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
'Colonna C ASC
.SortFields.Add Key:=Range("C2:C10"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

.SetRange R
.Header = xlNo 'Nessun Header : titoli colonne su Riga 1
.MatchCase = False
.Orientation = xlTopToBottom
'...
'Altre opzioni
'...
.Apply

End With

... che come sempre in VBA, può essere parametrizzato, e ottimizzato ulteriormente, ad esempio aggiungendo istruzioni per l'auto-detect dei limiti del Range da ordinare. ;)

Mnka
13-08-2012, 15:06
Grazie 1000;)

Essendo poco pratico di vba ed excel (ci sto giocando da una settimanella per fare un lavoretto molto semplice) non sono riuscito ad adattare il tuo codice...

Girando un altro po' su internet ho trovato questo che pare funzioni:

Range("A1:C4").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo

Alla prossima!