Dati univoci con Consolida

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
Dim Elenco As New Collection
Dim Intervallo As Range
Dim Riga
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.