Lettura indici e valori di una collection

Ultima modifica: 27-05-2016

In queste pagine parlo spesso dell'Oggetto Collection per ottenere elenchi di dati univoci da tabelle ridondanti.

La Collection, come oramai sappiamo, espone tre Metodi:

Add: Aggiunge un elemento a un oggetto Collection

Item: Restituisce uno specifico elemento di un oggetto Collection, in base alla posizione o alla chiave

Remove: Rimuove un elemento da un oggetto Collection

Una Proprietà Count che restituisce un valore Long (intero lungo) che contiene il numero di oggetti dell'insieme

Volendo usare la Collection predefinita del VBA o VB6, il modo più semplice è usare la sintassi:

Sintassi:
oggetto.Add item, key, before, after
item: Obbligatoria. un qualsiasi valore da aggiungere all'insieme
key: Facoltativa. Espressione stringa univoca che specifica una stringa chiave; se omessa viene utilizzato un indice numerfico di posizione per accedere a un valore dell'insieme
Gli altri due argomenti per ora non ci interessano

Come esempio vediamo la tabella qui sotto Ogni articolo descritto ha un proprio codice identificativo.

E
1 quantità  descrizione  cod art  sett
2 2 tavolo  verde  TV  A1
3 6 tavolo  verde  TV  A1
4 3 sedia  rosso  SR  A2
5 8 panca  rossa  PR  A7
6 5 sedia  verde  SV  A2
7 2 tavolo  rosso  TR  B
8 5 panca  verde  PV  A6
9 5 tavolo  rosso  TR  B
10 2 tavolo  nero  TN  A4
11 9 sedia  rosso  SR  A2
12 1 tavolo  nero  TN  A4

Questa volta vorrei riuscire ad estrarre dalla collection sia l'indice che il valore.

Dopo molte ricerche effettuate nel Web ed aver chiesto lumi a chi ne sa più di me penso, purtroppo, che proprio non sia possibile eseguire tale operazione senza ricorrere ad un trucco.

In questo esempio agisco in questa maniera:

My_Coll.Add (Array(Intervallo(R, 2), Intervallo(R, 3))), Intervallo(R, 3)

Finita l'operazione leggo il Value della Collection come matrice

For Each Valori In My_Coll
Cells(R, Colonna) = Valori(1)
Cells(R, Colonna + 1) = Valori(0)
Next

 

Qui di seguito l'esempio esplicativo

Sub Crea_collection()
Dim Righe, Colonne, R, Colonna, Valori
Dim Intervallo As Range
Dim My_Coll As New Collection
Righe = Range("A1").CurrentRegion.Rows.Count - 1
Colonne = Range("A1").CurrentRegion.Columns.Count
' se le variabili Righe e Colonne sono vuote si va in errore nel creare l'intervallo
If Righe > 0 And Colonne > 0 Then
' determino l'intervallo su cui lavorare
Set Intervallo = Range("A1").Offset(1, 0).Resize(Righe, Colonne)
' finalmente inizio ad alimentare la collection
On Error Resume Next
For R = 1 To Righe
My_Coll.Add (Array(Intervallo(R, 2), Intervallo(R, 3))), Intervallo(R, 3)
Next
On Error GoTo 0
' finita la creazione della collection mostro il suo contenuto nel foglio di lavoro
Sheets("Foglio2").Select
Range("A1") = My_Coll.Count
Range("B1") = "Elementi selezionati"
R = 1
Colonna = 1
For Each Valori In My_Coll
If Valori(0) <> "" Then
R = R + 1
Cells(R, Colonna) = Valori(1)
Cells(R, Colonna + 1) = Valori(0)
End If
Next
Else
MsgBox "L'intervallo da valutare è vuoto"
End If
End Sub

Questo il risultato della macro qui sopra descritta

  A B
1 7 Elementi selezionati
2 TV  tavolo  verde 
3 SR  sedia  rosso 
4 PR  panca  rossa 
5 SV  sedia  verde 
6 TR  tavolo  rosso 
7 PV  panca  verde 
8 TN  tavolo  nero 

Questo è tutto per ora