utilizzo di collection



  • utilizzo di collection
    di efarre data: 23/03/2015 12:48:32

    Salve a tutti,
    sto provando ad utilizzare le collection, ma con scarsi risultati.
    in pratica ho creato una UserForm con due ComboBox.
    La prima si popola con i dati univoci della marca di stampanti.
    La seconda dovrebbe popolarsi con i dati univoci dei modelli riferiti alla marca selezionata nella prima ComboBox (ma in realtà popola la ComboBox con tutti i modelli di tutte le marche).
    Infine vorrei creare una terza ComboBox popolata dai numeri seriali relativi alla marca e al modello selezionato nelle prime due ComboBox (ma questo lo potrei fare solo se capisco come fare il passaggio precedente).
    I dati sono su un foglio (foglio2) con la prima colonna "Marca", la seconda "Modello" e la terza "Matricola" per un totale di 79 voci.
    invio il codice.
    Grazie a tutti.
    Enzo Farre
     
    Option Explicit
    
    Private sh As Worksheet
    Private colMarca As Collection
    Private colMod As Collection
    Private lRiga As Long
    
    Private Sub UserForm_Initialize()
    
        Dim lng As Long
        
        Set colMarca = New Collection
        Set sh = ThisWorkbook.Worksheets("Foglio2")
        
        With sh
            lRiga = .Range("A" & .Rows.Count).End(xlUp).Row
            For lng = 2 To lRiga
                On Error Resume Next
                colMarca.Add CStr(.Cells(lng, 1).Value), CStr(.Cells(lng, 1).Value)
                If Err.Number = 0 Then
                    Me.ComboBox1.AddItem (.Cells(lng, 1).Value)
                End If
                Err.Number = 0
            Next
        End With
        
    End Sub
    
    Private Sub ComboBox1_Click()
        Dim lng As Long
        Set colMod = New Collection
        Set sh = ThisWorkbook.Worksheets("Foglio2")
        
        With sh
            lRiga = .Range("B" & .Rows.Count).End(xlUp).Row
            For lng = 2 To lRiga
                On Error Resume Next
                colMod.Add CStr(.Cells(lng, 2).Value), CStr(.Cells(lng, 2).Value)
                If Err.Number = 0 Then
                    Me.ComboBox2.AddItem (.Cells(lng, 2).Value)
                End If
                Err.Number = 0
            Next
        End With
       End Sub
    
    
    Private Sub UserForm_Terminate()
        Set colMarca = Nothing
        Set colMod = Nothing
        Set sh = Nothing
    End Sub
    
    



  • di scossa data: 23/03/2015 13:29:56

    Ho corretto il tuo codice, sostituendo l'evento Change all'evento Click e limitando l'alimentazione della seconda combo in base al valore della combo1.

    Ho anche spostato l'istruzione On error fuori dal ciclo For e sostituito Err.Number = 0 con Err.Clear.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    Private sh As Worksheet
    Private colMarca As Collection
    Private colMod As Collection
    Private lRiga As Long
    
    Private Sub ComboBox1_Change()
        Dim lng As Long
        'Me.ComboBox2.Clear
        Set colMod = New Collection
        Set sh = ThisWorkbook.Worksheets("Foglio2")
        Me.ComboBox2.Clear
        With sh
            lRiga = .Range("B" & .Rows.Count).End(xlUp).Row
            On Error Resume Next
            For lng = 2 To lRiga
              If .Cells(lng, 1).Value = Me.ComboBox1.Value Then
                colMod.Add CStr(.Cells(lng, 2).Value), CStr(.Cells(lng, 2).Value)
                If Err.Number = 0 Then
                    Me.ComboBox2.AddItem (.Cells(lng, 2).Value)
                End If
                Err.Clear
              End If
            Next
        End With
        Set colMod = Nothing
        Set sh = Nothing
    End Sub
    
    Private Sub UserForm_Initialize()
    
        Dim lng As Long
        
        Set colMarca = New Collection
        Set sh = ThisWorkbook.Worksheets("Foglio2")
        
        With sh
            lRiga = .Range("A" & .Rows.Count).End(xlUp).Row
            On Error Resume Next
            For lng = 2 To lRiga
                colMarca.Add CStr(.Cells(lng, 1).Value), CStr(.Cells(lng, 1).Value)
                If Err.Number = 0 Then
                    Me.ComboBox1.AddItem (.Cells(lng, 1).Value)
                End If
                Err.Clear
            Next
        End With
        Set colMarca = Nothing
        Set sh = Nothing
    End Sub
    
    
    Private Sub UserForm_Terminate()
        Set colMarca = Nothing
        Set colMod = Nothing
        Set sh = Nothing
    End Sub
    
    



  • di efarre data: 23/03/2015 13:38:10

    intanto grazie mille.
    quindi se utilizzo lo stesso concetto, posso popolare il terzo ComboBox con i seriali relativi al modello selezionato nella seconda ComboBox.
    Corretto?
    Adesso provo e ti rinnovo i ringraziamenti.
    Enzo Farre



  • di efarre data: 23/03/2015 13:51:59

    Funziona anche la terza ComboBox.
    Grazie mille.