Domanda
In un foglio ho il movimento in entrata ed uscita. Da questo movimento vorrei estrarre in un altra colonna solo una voce per tipo delle voci che appaiono nella colonna "categoria" (es: A1=detegenti, A2=utensili)
ciao e grazie
Risposta
Per estrarre in modo univoco tutti gli articoli presenti nell'elenco si possono usare più di un metodo. Ma il più semplice e veloce mi sembra sia quello di creare, almeno temporaneamente una Collection.
Uso dell'oggetto Collection col VBA
In una collectione possiamo aggiungere qualsiasi tipo di dato, compresi gli oggetti.
La Collection ha due tipi di indice. Ma entrambi i tipi debbono essere univoci:
Per memorizzare qualcosa in una Collection possiamo usare due sintassi diverse:
Nel primo caso, siccome l'indice viene scritto in maniera automatica ed è di tipo numerico sequenziale, abbiamo modo di memorizzare qualsiasi tipo di dato, anche se doppione
Nel secondo caso l'indice è di tipo stringa e lo indichiamo noi e, se tentiamo di indicizzare due volte la stessa stringa, evochiamo un errore. E' proprio su questo errore che noi facciamo affidamento.
Esempio:
Elenco.Add "sedia", CStr("sedia)
Elenco.Add "tavolo", CStr("tavolo")
Elenco.Add "sedia", CStr("sedia")
Quando tentiamo di inserire per la seconda volta il valore "sedia" nasce un errore.
Sappiamo che gli errori si possono gestire con:
prima di eseguire delle istruzioni che potrebbero causare un errore
On Error Resume Next
dopo l'esecuzione di queste istruzioni
On Error GoTo 0
Quindi delle probabili istruzioni per estrarre per estrarre da un elenco o da una tabella dei dati univoci potrebbero essere queste:
Sub CreaElencoUnivoco
Riga = 2
While Cells(Riga, 1) <> ""
Riga = Riga + 1
Wend
Riga = Riga - 1
Set Intervallo = Range(Cells(2, 1), Cells(Riga, 1))
' creazione della collection
On Error Resume Next
For Riga = 1 To Intervallo.Rows.Count
Elenco.Add Intervallo(Riga, 2).Value, CStr(Intervallo(Riga, 2).Value)
Next
On Error GoTo 0
'..................
End Sub
Dopo la creazione della Collection possiamo fare quel che vogliamo usando il ciclo For ...Next o il ciclo For Each:
copiare il contenuto sul foglio di lavoro
riempire una ComboBox
riempire una matrice
o fare qualsiasi altra cosa
Copiare il contenuto della Collection sul foglio di lavoro:
Riga = Elenco.Count
For Riga = 1 To Elenco.Count
Cells(Riga + 1, 5) = Elenco(Riga)
Next
Oppure in una ComboBox:
With Worksheets("Foglio2")
.ComboBox1.Clear
For Each Valori In Elenco
.ComboBox1.AddItem Valori
Next
End With
Oppure in una matrice:
Riga = 0
ReDim Matrice(1 To Elenco.Count)
For Each Valori In Elenco
Riga = Riga + 1
Matrice(Riga) = Valori
Next
La funzione Consolida
Un altro metodo per estrarre dati univoci da una tabella, senza ricorrere al VBA, potrebbe essere quello di usare una funzione poco nota di Excel: la funzione Consolida
Immaginiamo di avere questa tabella:
| concatenato | frutto | colore | formato | pezzi | valore |
| pererosse | pere | rosse | cassetta | 25 | 50 |
| melegialle | mele | gialle | singola | 1 | 2 |
| cigliegerosse | cigliege | rosse | cassetta | 25 | 50 |
| pereverdi | pere | verdi | cassetta | 25 | 50 |
| melerosse | mele | rosse | cassetta | 25 | 50 |
| pererosse | pere | rosse | singola | 1 | 2 |
| melegialle | mele | gialle | singola | 1 | 2 |
| melegialle | mele | gialle | singola | 1 | 2 |
Nella prima colonna si notano dei dati ripetuti. Ebbene con la funzione Consolida da questa tabella possiamo estrarre tutti i dati univoci senza ricorrere al VBA. Una condizione per effettuare questa operazione è che nella tabella ci sia almeno un campo con dati numerici (nella tabella di esempio ci sono le ultime due)
Alla fine dell'operazione avremo una tabella del genere:
| concatenato | pezzi |
| pererosse | 26 |
| melegialle | 3 |
| cigliegerosse | 25 |
| pereverdi | 25 |
| melerosse | 25 |
Se la seconda colonna ci da fastidio, possiamo cancellarla.