Gestione checkbox



  • Gestione checkbox
    di lucasegala87 (utente non iscritto) data: 17/11/2013 13:00:32

    Ciao a tutti. Sono nuovo e uso excel VBA da qualche mese. Ho già realizzato alcuni progetti abbastanza complessi quindi credo di capirne abbastanza, ma non sono un esperto quindi andateci piano.
    Ho tra le mani un nuovo progetto che prevede di avere sul foglio1 un elenco di articoli con codice; in corrispondenza di ogni riga/articolo c'è una checkbox. Flagando i vari articoli compare il prezzo unitario. Terminata la selezione tramite un pulsante si passa al foglio2 (che ha un'intestazione precisa) dove vengono riportate le righe selezionate, mentre in ultima riga viene calcolato il costo totale. A questo punto è possibile stampare.
    Il mio problema è la gestione delle checkbox che al momento sono 50, ma potrebbero aumentare. Ora me ne occupo singolarmente, quindi ho 50 routine che gestiscono l'evento click della checkbox per mostrare i prezzi sulla riga selezionata, mentre sull'evento click del pulsante ho 50 istruzioni del tipo "if checkbox1...,if checkbox2...,if checkbox3...,...". Guardando il codice si perde la vista.
    La mia domanda è se esiste un sistema ciclico per gestire tutte le checkbox in un colpo solo. Vorrei precisare che mi trovo a lavorare sul foglio di excel e non su un Form (in rete ho trovato una soluzione nel caso si utilizzasse un form) e che sul foglio non ci sono altre checkbox o elementi simili.
    Ovviamente accetto anche soluzioni alternative...
    Grazie a tutti.



  • di gaetanopr (utente non iscritto) data: 17/11/2013 13:32:47

    Prova in questo modo
     
    Sub cecc()
    For N = 1 To ActiveSheet.OLEObjects.Count
    If ActiveSheet.OLEObjects(N).Name = "CheckBox" & N Then
       i = i + 1
    End If
    Next
    MsgBox "ci sono " & i & " CheckBox"
    End Sub
    



  • di gaetanopr (utente non iscritto) data: 17/11/2013 13:38:55

    In questo modo effettui una prima verifica sui vari oggetti che hai sul foglio, successivamente solo per i "cecchibox" verifichi il valore "True" "False"

    If ActiveSheet.OLEObjects(N).Object.Value = True Then
    .............
    end if



  • di Vecchio Frac data: 17/11/2013 13:53:22

    Gateano ha già risposto bene.
    Di mio ti consiglio, per lo scenario proposto, proprio l'uso di un userform (che alleggerisce il file: 50 combobox in aumento!!).
    Se il form viene costruito bene, potrai limitarti a un solo checkbox, poichè hai detto che è solo uno per ogni riga di inserimento.





  • di lucasegala87 (utente non iscritto) data: 17/11/2013 15:14:21

    @ gaetanopr: grazie mille. Ho fatto delle modifiche per renderlo più efficace e per adattarlo ai miei scopi.
    Il tuo if infatti presuppone che il primo elemento esaminato sia la checkbox1, il secondo la checbox2 e così via. Nel mio caso il primo elemento è un pulsante (prima non l'avevo considerato...colpa mia) quindi non restituiva nulla. Nel mio codice invece verifica se nel nome dell'oggetto c'è "checbox" e quindi funziona sempre.

    @ Vecchio Frac: l'idea dell'userform l'avevo avuta però oltre alle righe con le checkbox sul mio foglio ci sono molti altri campi da compilare (si arriva a 200 righe) oltre al fatto che ci sono riferimenti a delle tabelle per eseguire dei calcoli (un macello). Non credo che usare un userform con tutta quella roba sia esteticamente gradevole oltre a richiedere un lavoro estenuante.

    a questo punto ho risolto la parte di gestione.
    per quanto riguarda invece i singoli eventi di click delle checkbox devo compilarli uno a uno (checkbox1_click, checkbox2_click,...) oppure anche qui esiste una scorciatoia?
     
    Private Sub CommandButton1_Click()
    For n = 1 To ActiveSheet.OLEObjects.Count
    If InStr(1, ActiveSheet.OLEObjects(n).Name, "checkbox", vbTextCompare) > 0 Then
        If ActiveSheet.OLEObjects(n).Object.Value = True Then
            'mio codice
        Else
            'mio codice
        End If
    End If
    Next
    End Sub



  • di Vecchio Frac data: 18/11/2013 11:02:16

    Dunque secondo me no, non in modo immediato almeno.
    Non ci sono matrici di controlli nativamente in VBA, forse si potrebbero ottenere anche per i controlli su foglio, analogamente a quello che si fa con i controlli su form con un piccolo trucco e un po' di codice. In questo modo si potrebbe scrivere una sola routine che viene eseguita da qualsiasi controllo del tipo desiderato.
    La cosa più immediata è scrivere una sola routine, quella principale che fa la cosa desiderata, e assegnarla ad ogni controllo con un semplice ciclo For (come nel tuo esempio), impostando la proprietà .OnAction di ogni controllo interessato (equivale a "assegnargli una macro").