Informazioni ListBox



  • Informazioni ListBox
    di Roby73 (utente non iscritto) data: 26/01/2015 13:35:49

    Chiedo cortesemente il seguente quesito: sto programmando un sistema per eseguire i preventivi della mia azienda. Ho ideato una Form con più di 30 Listbox. Cercavo un'istruzione per scrivere meno routine, come vede dall'esempio sono uguali e ripetitive, cambiano solo il nome (LstMontanti, LstVarie, ecc.). Si potrebbe semplicemente fare copia incolla, però in questo modo vado ad appesantire il mio file. Non esiste una variabile dove trascrivere i nomi delle Listbox e quindi poi eseguire una Sub uguale per tutti?
    In attesa di un vostro cordiale riscontro porgo distinti saluti.
     
    Private Sub LstMontanti_AfterUpdate()                                               'Quando seleziona la riga ListBox carica i dati nel riquadro sottostante
            
            Dim i As Integer                                                            'Definisco la matrice in variabile integer
            For i = 0 To LstMontanti.ListCount - 1                                      'Ciclo For di lunghezza uguale al contenuto della ListBox
                If LstMontanti.Selected(i) = True Then                                  'Se trova una riga selezionata trascrive i valori:
                   TbxDescrizione.Value = LstMontanti.List(i, 0)                        'Trascrive il valore DESCRIZIONE nel riquadro sottostante
                   TbxPrezzo.Value = LstMontanti.List(i, 1)                             'Trascrive il valore PREZZO nel riquadro sottostante
                   TbxTempo.Value = LstMontanti.List(i, 2)                              'Trascrive il valore TEMPO nel riquadro sottostante
                   TbxFilo.Value = LstMontanti.List(i, 3)                               'Trascrive il valore FILO nel riquadro sottostante
                   TbxTubo.Value = LstMontanti.List(i, 4)                               'Trascrive il valore TUBO nel riquadro sottostante
                   TbxCap.Value = LstMontanti.List(i, 5)                                'Trascrive il valore CAPITOLATO nel riquadro sottostante
                End If
            Next i
    
    End Sub
    
    Private Sub LstVarie_AfterUpdate()                                                  'Quando seleziona la riga ListBox carica i dati nel riquadro sottostante
            
            Dim i As Integer                                                            'Definisco la matrice in variabile integer
            For i = 0 To LstVarie.ListCount - 1                                         'Ciclo For di lunghezza uguale al contenuto della ListBox
                If LstVarie.Selected(i) = True Then                                     'Se trova una riga selezionata trascrive i valori:
                   TbxDescrizione.Value = LstVarie.List(i, 0)                           'Trascrive il valore DESCRIZIONE nel riquadro sottostante
                   TbxPrezzo.Value = LstVarie.List(i, 1)                                'Trascrive il valore PREZZO nel riquadro sottostante
                   TbxTempo.Value = LstVarie.List(i, 2)                                 'Trascrive il valore TEMPO nel riquadro sottostante
                   TbxFilo.Value = LstVarie.List(i, 3)                                  'Trascrive il valore FILO nel riquadro sottostante
                   TbxTubo.Value = LstVarie.List(i, 4)                                  'Trascrive il valore TUBO nel riquadro sottostante
                   TbxCap.Value = LstVarie.List(i, 5)                                   'Trascrive il valore CAPITOLATO nel riquadro sottostante
                End If
            Next i
    
    End Sub



  • di Lucas87 data: 26/01/2015 15:41:37

    Ciao
    Non ho ben capito cosa fa il tuo codice e non so cosa siano i vari Tbx...
    Con il codice sotto però passi in rassegna i controlli presenti sul form, se il controllo è una listbox esegue il codice. A questo punto il riferimento al controllo è "ctl"
     
        For Each ctl In UserForm1.Controls
            If TypeName(ctl) = ”ListBox” Then
               TbxDescrizione.Value = ctl.List(i, 0) 
               ......
               ......
            End If
        Next
    
    



  • di Vecchio Frac data: 26/01/2015 19:00:26

    A Roby73 servirebbe una matrice di controlli, che non è disponibile in VBA e bisogna simulare in qualche modo.
    La rete è piena di esempi funzionanti. Secoli fa mi ero messo a scrivere un piccolo articolo ma poi non l'ho più finito.

    In alternativa, potrebbe scrivere solo la routine comune e poi demandare ai diversi AfterUpdate di chiamare tale routine (parametrizzata, per accettare il riferimento al chiamante).
     
    'nell'userform
    Private Sub LstMontanti_AfterUpdate()                                               'Quando seleziona la riga ListBox carica i dati nel riquadro sottostante
        call fai_qualcosa(lstmontanti)
    end sub
    
    private sub Private Sub LstVarie_AfterUpdate()   
        call fai_qualcosa(lstmontanti)
    end sub
    
    'eccetera con tutti gli altri millemila eventi afterupdate
    
    
    
    '-----------------------------------------------------
    'in un modulo
    sub fai_qualcosa(ctl)
    Dim i As Integer                                                            'Definisco la matrice in variabile integer
        with ctl
            For i = 0 To .ListCount - 1                                      'Ciclo For di lunghezza uguale al contenuto della ListBox
                If .Selected(i) = True Then                                  'Se trova una riga selezionata trascrive i valori:
                   TbxDescrizione.Value = .List(i, 0)                        'Trascrive il valore DESCRIZIONE nel riquadro sottostante
                   TbxPrezzo.Value = .List(i, 1)                             'Trascrive il valore PREZZO nel riquadro sottostante
                   TbxTempo.Value = .List(i, 2)                              'Trascrive il valore TEMPO nel riquadro sottostante
                   TbxFilo.Value = .List(i, 3)                               'Trascrive il valore FILO nel riquadro sottostante
                   TbxTubo.Value = .List(i, 4)                               'Trascrive il valore TUBO nel riquadro sottostante
                   TbxCap.Value = .List(i, 5)                                'Trascrive il valore CAPITOLATO nel riquadro sottostante
                End If
            Next i
        end with
    end if






  • di Vecchio Frac data: 26/01/2015 19:01:39

    Errata corrige.
     
    il secondo afterupdate è ovviamente questo, ma il concetto l'hai capito.
    private sub Private Sub LstVarie_AfterUpdate()   
        call fai_qualcosa(lstVarie)
    end sub






  • di Zer0Kelvin data: 26/01/2015 23:11:12

    Salve a tutti.
    Secondo me, probabilmente può essrere rivista la strategia di funzionamento della cosa.
    E' probabile che l'effetto voluto (compilare le textboxes quando viene selezionata una voce) sia ottenibile utilizzando l'evento change e la proprietà ListIndex.
    In tal caso si potrebbe anche utilizzare una classe con un evento Change "ad hoc"; bisognerebbe, però, conoscere meglio il funzionamento desiderato...



  • di Roby73 (utente non iscritto) data: 28/01/2015 19:41:55

    Ringrazio tutti per i consigli. Ho utilizzato la funzione With ed il codice funziona perfettamente. Non conoscevo questa funzione, ma grazie a voi ho imparato qualcosa di nuovo.

    Grazie



  • di Vecchio Frac data: 28/01/2015 20:59:20

    With non è una funzione.
    E' un'istruzione che dice al compilatore VBA di eseguire una serie di istruzioni su un singolo oggetto o su un tipo definito dall’utente.
    Nel codice proposto serve a non ripetere mille volte la variabile oggetto "ctl" prima del punto; è come se ci ancorassimo a quell'oggetto quando lo referenziamo nel resto del codice fino alla chiusura del blocco con "end with". Naturalmente serve sempre la notazione "punto" e infatti intellisense ci mostra le proprietà e gli attributi di quell'oggetto quando lo digitiamo.