Come scegliere i dati in modo univoco

Ultima modifica: 30-05-2016

 

A volte potremmo desiderare di raccogliere in modo univoco i nomi in una lista di una ComboBox, di una ListBox, di una matrice o in un foglio di Excel.

Ma che significa pretendere una lista di valori univoci?

Raccogliere delle informazioni in maniera univoca significa scegliere tra le voci presenti in una lista tutte le voci prese una sola volta. Infatti molto spesso in una tabella o in una lista possiamo trovare alcuni dati duplicati. Immaginate una tabella progettata per una gestione Magazzino. Potremmo avere una situazione del genere:

Codice    Prodotto    Prezzo    Giacenza    Categoria
1 Trek 9000 Mountain Bike  € 1.200,00 6 2
2 Eagle FS-3 Mountain Bike  € 1.800,00 8 2
3 Dog Ear Cyclecomputer  € 75,00 20 1
4 Victoria Pro All Weather Tires  € 54,95 20 4
5 Dog Ear Helmet Mount Mirrors  € 7,45 12 1
6 Viscount Mountain Bike  € 635,00 5 2
7 Viscount C-500 Wireless Bike Computer  € 49,00 30 1
8 Kryptonite Advanced 2000 U-Lock  € 50,00 20 1
9 Nikoma Lok-Tight U-Lock  € 33,00 12 1
10 Viscount Microshell Helmet  € 36,00 20 1
11 GT RTS-2 Mountain Bike  € 1.650,00 5 2
12 Shinoman 105 SC Brakes  € 23,50 16 4
13 Shinoman Dura-Ace Headset  € 67,50 20 6
14 Eagle SA-120 Clipless Pedals  € 139,95 20 6
15 ProFormance Toe-Klips 2G  € 4,99 40 6
16 ProFormance ATB All-Terrain Pedal  € 28,00 40 4
17 Shinoman Deluxe TX-30 Pedal  € 45,00 60 4
18 Viscount CardioSport Sport Watch  € 179,00 12 1
ecc.         

In questa tabella notate che, mentre nei campi "Codice" e "Prodotto" i valori sono raccolti in modo univoco, non altrettanto univoci sono i valori contenuti negli altri campi. Infatti, mentre per ogni codice abbiamo uno ed un solo prodotto, per più prodotti possiamo avere nei campi "Prezzo", "Giacenza" e "Categoria" valori uguali.

A partire da questa tabella potremmo desiderare di raggruppare i prodotti per categoria

 


Nel lavoro che faremo dovremo:

In questa maniera il risultato della nostra elaborazione sarà un elenco o una tabella o una serie di elenchi e/o tabelle che conterranno tutti i nomi dei prodotti che appartengono a ciascuna categoria ed ogni elenco o tabella sarà veramente univoca.

Estrarre le categorie dalla tabella 1

Iniziamo col creare un elenco che esponga in modo univoco, cioè prese una sola volta, tutte le voci riguardanti le categorie. Se nella colonna ci fossero 10 voci di categorie tutte uguali, queste dovranno essere prese una sola volta.

Questo potrebbe essere un approccio al problema:

Sub cercaCorrispondentiGiusto()
'la dichiarazione delle variabili
Dim Righe, R, A, B
Dim Col_Tipo, Col_Prod, Col_Dest, Riga_Dest
Dim FL As Boolean
Dim Increm
Dim Tipo
Dim Matrice()
' inizio del recupero in modo univoco delle categorie
R = Range("A1").CurrentRegion.Rows.Count
Righe = R
Col_Tipo = 5
Increm = 0
For A = 2 To R ' viene letta la colonna delle categorie (la quinta)
FL = False
Tipo = Cells(A, 5)
If Increm > 0 Then ' il valore letto viene cercato nella matrice che lo dovrà memorizzare
For B = 1 To UBound(Matrice)
If Tipo = Matrice(B) Then ' se viene trovato viene scartato
FL = True
Exit For
End If
Next
End If
If FL = False Then ' se non è stato trovato viene accettato e memorizzato nella matrice
Increm = Increm + 1
ReDim Preserve Matrice(1 To Increm)
Matrice(Increm) = Tipo
End If
Next
' ........................
End Sub

Il lavoro eseguito sembra abbastanza chiaro. Quindi possiamo passare a visualizzare le categorie nel secondo foglio:

'.......................................
With Worksheets("foglio2")
For A = 1 To UBound(Matrice)
.Cells(A, 1) = Matrice(A)
Next
End With
'.......................................

Con questo otteniamo questo risultato:

    2                  
    1                  
    4                  
    6                  

 

Raggruppare i prodotti per categoria

Ora possiamo cercare tutti i prodotti che appartengono ad ogni singola categoria:

'.......................................
'ricerca dei prodotti per ogni categoria
Col_Prod = 2
Col_Dest = 3
Riga_Dest = 1
With Worksheets("foglio2")
.Cells.ClearContents
' si iniziano a leggere le categorie memorizzate in matrice
For A = 1 To UBound(Matrice)
Tipo = Matrice(A)
.Cells(Riga_Dest, Col_Dest) = Tipo
' qiando la categoria viene trovata nella colonna corrispondente viene copiato l'articolo
For R = 1 To Righe
If Cells(R, Col_Tipo) = Tipo Then
Riga_Dest = Riga_Dest + 1
.Cells(Riga_Dest, Col_Dest) = Cells(R, Col_Prod)
.Cells(Riga_Dest, Col_Dest + 1) = Cells(R, Col_Prod + 1)
.Cells(Riga_Dest, Col_Dest + 2) = Cells(R, Col_Prod + 2)
End If
Next
Riga_Dest = Riga_Dest + 2
Next
End With

Anche qui il lavoro non sembra presentare particolari problemi.

Essendo in un costrutto With ... End With, è da notare solo la sintassi usata nei riferimenti alle celle:

.Cells(Riga_Dest, Col_Dest) = Cells(R, Col_Prod)

.Cells preceduta da un punto si riferisce all'oggetto puntato da With (il "foglio2")

Cells senza il punto davanti fa riferimento all'oggetto attivo (il "foglio1")

Il risultato sarà il seguente

2                  
Trek 9000 Mountain Bike       1200      6      
Eagle FS-3 Mountain Bike       1800      8      
Viscount Mountain Bike       635      5      
GT RTS-2 Mountain Bike       1650      5      
                       
1                  
Dog Ear Cyclecomputer       75      20      
Dog Ear Helmet Mount Mirrors       7,45      12      
Viscount C-500 Wireless Bike Computer       49      30      
Kryptonite Advanced 2000 U-Lock       50      20      
Nikoma Lok-Tight U-Lock       33      12      
Viscount Microshell Helmet       36      20      
Viscount CardioSport Sport Watch       179      12      
                       
4                  
Victoria Pro All Weather Tires       54,95      20      
Shinoman 105 SC Brakes       23,5      16      
ProFormance ATB All-Terrain Pedal       28      40      
Shinoman Deluxe TX-30 Pedal       45      60      
                       
6                  
Shinoman Dura-Ace Headset       67,5      20      
Eagle SA-120 Clipless Pedals       139,95      20      
ProFormance Toe-Klips 2G       4,99      40      

 

Questo potrebbe essere l'aspetto della tabella quando il lavoro sarà terminato.

Qui potete vedere il codice completo esempio

Questo è tutto per questa volta.