Collection dati univoci



  • Collection dati univoci
    di alfrimpa data: 06/11/2015 16:33:50

    Ciao a tutti

    La macro qui sotto (presa dal sito di MikeVBA) crea una collection di dati univoci che diventa rowsource per una combobox posta sul foglio di lavoro.

    Il suo funzionamento mi è perfettamente chiaro) tranne che in una istruzione:

    Elenco.Add CL.Value, CStr(CL.Value)

    Qualcuno riesce a spiegarmi in che modo quel "CStr(CL.Value)" fa si che vengano aggiunti i soli dati univoci.

    Riporto anche la spiegazione di Mike che però non ho capito.

    "nel secondo esempio imponiamo un nome da usare come chiave univoca di tipo String: Elenco.Add CL.Value, CStr(CL.Value): ne consegue che, volendo attribuire alla Collection una chiave già esistente, verrà generato un errore che, se ben controllato, non bloccherà l'esecuzione della routine ma impedisce solo la scrittura di un codice già esistente e vengono quindi scartati tutti i dati doppi. Ne consegue che nella ComboBox verranno inserite le sole voci prese una sola volta."

    Qualcuno è in grado di spiegarmelo?

    Grazie

    Alfredo

     
    Sub CreaElencoUnivoco()
     Dim CL As Range, Intervallo As Range, Elenco As New Collection
     Dim Valori As Variant
     Dim Riga
     Worksheets("Foglio2").Select
     Set Intervallo = Range("A1", Range("A1").End(xlDown))
     Set Intervallo = Intervallo.Offset(1, 0).Resize(Intervallo.Rows.Count - 1, Intervallo.Columns.Count)
     On Error Resume Next
     For Each CL In Intervallo
    'questa volta scriviamo nella collection anche un indice
    Elenco.Add CL.Value, CStr(CL.Value)
     Next
     On Error GoTo 0
     With Worksheets("Foglio2")
    .ComboBox1.Clear
    For Each Valori In Elenco
    .ComboBox1.AddItem Valori
    Next
     End With
     End Sub 






  • di patel data: 06/11/2015 17:25:27

    io ho capito che salvi un array bidimensionale con il dato e la chiave, la chiave è = al dato in formato testo, il controllo dell'univocità viene fatto sulla chiave





  • di Marius44 data: 06/11/2015 20:03:44

    Ciao Alfredo
    Riporto quanto scritto in Visual Basic 6 di Francesco Balena a pag.143

    La chiave stringa è facoltativa: se la specificate ed esiste un altro elemento con la stessa chiave, il metodo Add provocherà un errore 457: "This key is already associated with an element of this collection" (questa chiave è già associata a un elemento di questa collection); le chiavi vengono controllate senza tener conto delle maiuscole e delle minuscole.

    Penso sia la risposta che cercavi.
    Ciao,
    Mario



  • di alfrimpa data: 06/11/2015 21:52:10

    Ciao Patel e ciao Mario.

    In effetti dall'imbeccata di Patel avevo già intuito l'intero meccanismo che è stato confermato da Mario.

    La chiave della collection è unica per cui se si inserisce un dato già presente la chiave non può essere duplicata e il Vba restituisce l'errore 457 che viene "netraulizzato" dall'istruzione "On Error Goto 0" e quindi la collection si riempie di dati univoci.

    Grazie per gli interventi.

    Alfredo