Creazione di elenchi univoci

Questa volta vediamo come estrarre da un elenco o da una tabella dei ati univoci.

Vediamo questa semplice tabella:

  A B
1 quant descr
2 2 scatole
3 6 bottiglie
4 3 bottiglie
5 8 vasetti
6 5 scatole
7 2 vasetti
8 5 confezione
9 5 vasetti
10 2 confezione
11 9 vasetti
12 1 confezione
13 5 confezioni
14 3 scatola
15 7 confezione
16 2 bottiglie
17 1 scatole
18 9 latte

Per estrarre in modo univoco tutti gli articoli presenti si possono usare più di un metodo. Ma il più semplice e veloce mi sembra sia quello di creare, almeno temporaneamente una Collection.

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:

Elenco.Add Qualcosa: l'indice, in questo caso è automatico ed è di tipo numerico sequenziale

oppure

Elenco.Add Qualcosa, CStr(Qualcosa): in questo caso l'indice è di tipo stringa - CStr(Qualcosa)

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:

On Error Resume Next
For Riga = 1 To Intervallo.Rows.Count
Elenco.Add Intervallo(Riga, 1).Value, CStr(Intervallo(Riga, 1).Value)
Next
On Error GoTo 0

Da queste istruzioni possiamo partire nella costruzione di una qualsiasi routine per gli usi più disparati:

Se la Collection non ci serve più la possiamo anche distruggere.

Nell'esempio che segue riempiremo una ComboBox con tutti gli articoli che abbiamo in un ipotetico magazzino

Sub CreaElenchiUnivoci()
Dim CL As Range, Intervallo As Range, Elenco As New Collection
Dim Mess As String
Dim Valori As Variant
Dim Riga, Matrice()
' dopo le dovute dichiarazioni di variabili i preliminari
Worksheets("Foglio2").Select
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

Range("E1").CurrentRegion.ClearContents
Range("E1") = Mess

' riempimento della matrice e distruzione della Collection
Riga = 0
ReDim Matrice(1 To Elenco.Count)
For Each Valori In Elenco
Riga = Riga + 1
Matrice(Riga) = Valori
Next
Set Elenco = Nothing

' dopo la creazione della matrice possiamo fare quel che dobbiamo:
' copiare il contenuto sul foglio di lavoro

For Riga = 1 To UBound(Matrice)
Cells(Riga + 1, 5) = Matrice(Riga)
Next

' riempire una ComboBox
With Worksheets("Foglio2")
.ComboBox1.Clear
For Riga = 1 To UBound(Matrice)
.ComboBox1.AddItem Matrice(Riga)
Next
End With
' o fare qualsiasi altra cosa
End Sub

Se non vogliamo lavorare con la matrice possiamo non distruggere subito la Collection e lavorare con questa.