Ordinamento di un elenco dati in automatico.

Oltre all'ordinamento di un elenco dati ottenibile dai due pulsantini A-Z o Z-A posti su una barra dei menù, può essere utile usare il codice Vba per ottenerlo in automatico. La tenuta di dati ordinati per ordine alfabetico (ad esempio dei nominativi o un elenco articoli), oppure per ordine di grandezza (in un elenco numerico), o ancora un elenco di date. Con la seguente procedura, basterà infatti aggiungere un nuovo dato per vederlo subito dopo ordinato al posto giusto in elenco. La procedura la inseriremo nell'evento WorkSheet_SelectionChange del foglio che contiene l'elenco:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Range("A:A")
    .Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
        End With
End Sub

L'esempio è stato fatto presupponendo un elenco contenuto nella colonna A, e che i dati iniziassero nella cella A1. Basterà sostituire i riferimenti per adattarlo al proprio elenco. Se anzichè volere un ordinamento crescente volessimo un ordinamento decrescente, basterà sostituire il comando " Order1:=xlAscending " con " Order1:=xlDescending " . Volendo, invece, disporre manualmente il nostro elenco, potremo utilizzare questa routine , associata ad un pulsante posizionato sul foglio di lavoro:

Sub OrdineCrescente()
With Range("A:A")
.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End With
End Sub


e l'altra, decrescente:
Sub OrdineDecrescente()
With Range("A:A")
.Sort Key1:=Range("A1"), Order1:=xlDescending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End With
End Sub

 

Quando invece vogliamo ordinare un elenco formato da più colonne, per esempio un indirizzario dove oltre al nome registriamo, nelle colonne adiacenti, l'indirizzo, la città, ed altri dati, avremo bisogno, se scegliamo di avere i dati in ordine alfabetico del nominativo, che anche i dati associati al nominativo si spostino insieme al nome. Volendo usare ancora l'ordinamento automatico, dovremo allora modificare le istruzioni. Sfrutteremo sempre l'evento SelectionChange del foglio di lavoro, ma dovremo inserire delle coordinate precise per indicare TUTTA l' area interessata all'ordinamento, compreso quindi non solo la colonna che contiene i nomi che vogliamo in ordine alfabetico, ma anche le colonne dove sono i dati correlati (indirizzo, città, telefono, ecc.). Potremo comprendere anche delle righe vuote che serviranno poi per l'aggiunta di nuovi dati. Supponiamo quindi di usare la zona che va dalla prima cella (A1) e. per quattro colonne (A,B,C,D) fino alla riga 200, l'istruzione sarà:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)


With Range("A1:D200")  
'Area che comprende tutti i dati
.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End With

'la spiegazione di questa parte di codice la dò sotto
Dim CL As Object
For Each CL In Range("A1:A200")
If CL.Value <> "" And CL.Offset(0, 1).Value = "" Then
CL.Offset(0, 1).Select
End If
Next


End Sub

Poichè l'inserimento di un nominativo, nella colonna A, ha bisogno di essere confermato premendo il tasto INVIO o con la pressione su una delle frecce per spostarsi, e questo genera l'evento SelectionChange, avremo che il nome appena immesso verrà immediatamente ordinato, con conseguente spostamento nell'elenco stesso: per non correre a cercare dove è finito (specie con lunghi elenchi), ho aggiunto la seconda istruzione che cercherà (nella colonna dei nominativi, la A) il primo valore con la cella adiacente vuota, e la selezionerà, così che si possano inserire gli altri dati mancanti.