abilitare caselle automaticamente



  • abilitare caselle automaticamente
    di maxp72 (utente non iscritto) data: 21/08/2013 10:37:32

    Salve
    devo creare un piccolo configuratore ed avrei bisogno di una mano.
    Se aprite il file allegato trovate delle caselle di controllo sulla colonna C.
    Le caselle corrispondenti alle celle c14 e c15 dovrebbero, una volta fleggata una dele due, attivarmi la visualizzazione delle caselle di controllo delle celle c16 e c17.
    Questo sono riuscito a farlo con la macro che riporto sotto, il problema e' che non so come fare per far eseguire in automatico al foglio queste operazioni.
    In pratica voglio che il foglio in automatico rilevi che una delle due caselle e' stata fleggata e quindi mi visualizzi le altre due caselle (in c16-c17)e le nasconda nel caso vengano defleggate le caselle c14 e c15.
    Grazie
     
    Sub Macro1()
    '
    If ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_03")).Visible = True Then
        ActiveSheet.Shapes("Casella di controllo F_OPT_03").Select
        With Selection
            If .Value = xlOn Then
                ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_05")).Visible = True
                ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_06")).Visible = True
                Else
                ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_05")).Visible = False
                ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_06")).Visible = False
            End If
        End With
    End If
    '---
    If ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_04")).Visible = True Then
        ActiveSheet.Shapes("Casella di controllo F_OPT_04").Select
        With Selection
            If .Value = xlOn Then
                ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_05")).Visible = True
                ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_06")).Visible = True
                Else
                ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_05")).Visible = False
                ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_06")).Visible = False
            End If
        End With
    End If
    End Sub
    
    



  • di paolomath data: 21/08/2013 11:55:44

    Puoi assegnare alle due caselle la Macro1 (vedi sotto).

    Per il controllo all'apertura del foglio assegni la stessa macro all'evento Activate del foglio:

    Private Sub Worksheet_Activate()
    Macro1
    End Sub

    Bye
     
    Sub Macro1()
    
    Dim Chk1, Chk2 As Shape
    Set Chk1 = ActiveSheet.Shapes("Casella di controllo F_OPT_03")
    Set Chk2 = ActiveSheet.Shapes("Casella di controllo F_OPT_04")
            If Chk1.ControlFormat.Value = xlOn Or Chk2.ControlFormat.Value = xlOn Then
                ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_05")).Visible = True
                ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_06")).Visible = True
                Else
                ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_05")).Visible = False
                ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_06")).Visible = False
            End If
            
    End Sub



  • di Grograman data: 21/08/2013 12:41:05

    Ocio Paolomath,

    Dim Chk1, Chk2 As Shape


    Così solo Chk2 sarà di tipo shape, la 1 sarà di tipo variant.



  • di Grograman data: 21/08/2013 12:43:08

    Altra VARIANTE
     
    Nel modulo generico:
    
    Sub Macro1()
    Dim oShp As Shape
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Cfg_Filling")
        For Each oShp In ws.Shapes
            If Right(oShp.Name, 6) = "OPT_03" Or Right(oShp.Name, 6) = "OPT_04" Then
                If oShp.Visible = msoTrue Then
                    If oShp.ControlFormat = xlOn Then
                        ws.Shapes.Range(Array("Casella di controllo F_OPT_05")).Visible = True
                        ws.Shapes.Range(Array("Casella di controllo F_OPT_06")).Visible = True
                    Else
                        ws.Shapes.Range(Array("Casella di controllo F_OPT_05")).Visible = False
                        ws.Shapes.Range(Array("Casella di controllo F_OPT_06")).Visible = False
                    End If
                End If
            End If
        Next oShp
    Set ws = Nothing
    End Sub
    
    
    
    Nel modulo di classe Foglio3:
    
    Private Sub Worksheet_Calculate()
          Call Modulo1.Macro1
    End Sub
    



  • di maxp72 (utente non iscritto) data: 21/08/2013 14:36:45

    ok con un misto tra le due soluzioni ho risolto ...
    la macro di paolomath funziona ma nel modulo del foglio3,come suggerito da Grograman, ho messo :
    ---------
    Private Sub Worksheet_Calculate()
    Call Modulo1.Macro1
    End Sub
    ----------
    in quanto se mettevo,come suggerito da paolomath :
    ----------
    Private Sub Worksheet_Activate()
    Macro1
    End Sub
    ----------
    la macro funziona solo al cambio del foglio, e non va bene.

    La macro di Grograman, non so perche' , ma non funziona come vorrei, solo al cambio del OPT_4 funziona mentre con l'OPT_3 non succede nulla ...



  • di maxp72 data: 21/08/2013 15:31:00

    altra cosa, oltre a renderli invisibili, devo anche defleggarli nel caso lo siano.
    devo dare per entrambi il codice sotto, o posso dare meno istruzioni?
     
                    ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_05")).Select
                    With Selection
                        .Value = xlOff
                    End With
                    ActiveSheet.Shapes.Range(Array("Casella di controllo F_OPT_06")).Select
                    With Selection
                        .Value = xlOff
                    End With



  • di Grograman data: 21/08/2013 15:51:41

    Aboliamo tutti quei select:

    Comunque il codice proposto non è che non funziona, è che scatena il controllo per tutti gli shapes, quindi lo fa due volte ad ogni variazione.

    Se mi spieghi meglio quello che vuoi ottenere, quando esattamente nascondere o attivare/disattivar ele checkbox magari trovo un alternativa
     
    ActiveSheet.Shapes("Casella di controllo F_OPT_05").ControlFormat = xlOff



  • di maxp72 data: 21/08/2013 15:54:16

    ho fatto questo:
     
                    For x = 5 To 6
                      ActiveSheet.Shapes("Casella di controllo F_OPT_0" & x).ControlFormat.Value = xlOff
                      ActiveSheet.Shapes("Casella di controllo F_OPT_0" & x).Visible = False
                    Next x



  • di maxp72 (utente non iscritto) data: 22/08/2013 15:20:37

    altro problema sempre inerente le caselle di controllo:
    ho casella 1 e 2
    se abilito la 1 la 2 si disabilita e vicecevrsa.
    con il codice sotto sono a buon punto, il problema e' che una volta fleggata la 1 la 2 si disabilita e quindi non riesco piu' poi a fleggarla per disabiltiare la 1..
     
    Dim Chk1 As Shape, Chk2 As Shape
    Set Chk1 = ActiveSheet.Shapes("Casella di controllo F_OPT_20")
    Set Chk2 = ActiveSheet.Shapes("Casella di controllo F_OPT_27")
    
            If Chk2.ControlFormat.Value = xlOn Then
            Chk1.ControlFormat.Value = xlOff
            End If
    
            If Chk1.ControlFormat.Value = xlOn Then
            Chk2.ControlFormat.Value = xlOff
            End If



  • di Grograman data: 22/08/2013 16:35:49

    Come già detto in altro post giusto oggi, non sono un grande conoscitore dei controlli di modulo ;)

    Propongo quindi un esempio con le checkbox Activex, ovviamente da adattare, ne ho messe solo due di esempio e ne riporto il codice.


    p.s. hai postato una parte di codice, non so se lo fai alla fine, ma ricordati sempre di distruggere gli oggetti prima di chiudere le routine!
     
    Private Sub CheckBox1_Click()
      If Me.CheckBox1.Value = True Then
        Me.CheckBox2.Value = 0
        Me.Range("F14") = Me.Range("E14").Value
      Else
        Me.Range("F14") = 0
      End If
    End Sub
    
    Private Sub CheckBox2_Click()
      If Me.CheckBox2.Value = True Then
        Me.CheckBox1.Value = 0
        Me.Range("F15") = Me.Range("E15").Value
      Else
        Me.Range("F15") = 0
      End If
    End Sub
    



  • di maxp72 (utente non iscritto) data: 22/08/2013 17:40:46

    OK mi sta' bene l'activeX, ...a questo punto allora pero' meglio usare tutti actveX anche per le altre caselle,percio' devo riscrivere parte del codice e mi servono altre info.
    Riepilogo il tutto:
    Sto' facedno un piccolo configuratore, a seconda della macchina che seleziono, con una macro, rendo visibili/invisibili le caselle di controllo delle opzioni che posso selezionare su quel prodotto.
    quindi mi serve sapere: come rendo visbile/invisibile una checkbox?
    ho provato con una macro a lanciare il comando sotto, ma mi dice necessario oggetto...


     
    sub macro1
    CheckBox1.Visible = False
    end sub



  • di maxp72 (utente non iscritto) data: 22/08/2013 17:44:50

    ok gia' risolto, funziona alla stessa maniera pare

     
    ActiveSheet.Shapes.Range(Array("CheckBox1")).Visible = True



  • di Grograman data: 22/08/2013 18:10:07

    Meglio se utilizzi la paternità dell'oggetto ;)

    In particolare l'oggetto padre di un controllo ActiveX è il foglio sul quale lo hai creato.

    Quindi nel modulo di classe del tuo foglio potresti scrivere (il worksheet activate è meramente di esempio non riguarda il codice in sé):
     
    Private Sub Worksheet_Activate()
    If Application.UserName = "Utente1" Then
        Me.CheckBox1.Visible = 0
        'Me.CheckBox1.Enabled = 0 'più carino
    Else
        Me.CheckBox1.Visible = 1
        'Me.CheckBox1.Enabled = 1 'più carino
    End If
    End Sub



  • di maxp72 (utente non iscritto) data: 23/08/2013 09:24:26

    Avendo gia' una macro "sub" dove andavo a visualizzare e nascondere le caselle di controllo ora la devo modificare, visto che ho le ho cambiate con quelle in ActiveX, ma nel codice sotto,
    mi dice "utilizzo non valido della parola chiave me" (di cui sinceramente non so la funzione),
    per caso e' dovuto al fatto che la macro e' una sub e non una private sub?
    che differenza c'e' tra Private sub e sub ?
    perdonate la mia ignoranza...
     
    Sub FIL_04_Definisce_OPZIONI()
    Application.ScreenUpdating = False
    Sheets("Cfg_Filling").Select
    
    Range("E12").Select
        For x = 1 To 27
        OPTION_PRICE = ActiveCell.Value
            If OPTION_PRICE > "0" Then
            
                If x < 10 Then
                x = "0" & x
                End If
                
            Dim chk1 As Shape
            chk1 = "CheckBox_F_OPT_" & x
            Me.chk1.Enabled = 1
            Else
            Me.chk1.Enabled = 0
            End If
            
        ActiveCell.Offset(1, 0).Select
        Next x
    End Sub



  • di Grograman data: 23/08/2013 10:12:23

    La differenza tra private e non è che una private può essere richiamata solo nel modulo dove risiede, le altre anche dall'esterno.

    Il "me" (guida in linea per approfondimento) in pratica lo puoi usare in tutti i moduli di classe (userform, "thisworkbook", "Sheets1") e attibuisce l'oggetto indicato all'istanza in cui lo dichiari.

    Prova a mettere 4-5 checkboxes in un foglio a caso, poi apri editor, vai nel modulo di classe di quel foglio e scrivi
    una routine generica, mentre scriverai "me.che" vedrai che l'editor ti darà l'elenco delle checkboxes a disposizione.

    Per il tuo codice invece, meglio se posti un file con la struttura a cui sei arrivato ora e una spiegazione di quello che vorresti ottenere



  • di maxp72 (utente non iscritto) data: 23/08/2013 10:55:31

    file allegato.
    in pratica lavorando nel foglio, lanciando la macro:
    FIL_S06_CANCELLA_OPZIONI
    devo nascondere (o rendere non selezionabile) le caselle dove non ho il prezzo nella colonna "E"

    lanciando la macro
    FIL_04_Definisce_OPZIONI
    devo rendere visibile (o selezionabile) le caselle di controllo dove ho il prezzo nella colonna "E".

    Fleggando le caselle di controllo della colonna "C" devo far apparire il prezzo nella colonna "F".
    casi particolari:
    - caselle in c12/c13 sono quelle di cui parlavamo ieri o seleziono una o l'altra.(il codice dovrebbe essere gia' ok)
    - caselle c31/c38 come le prime due, una esclude l'altra(il codice dovrebbe essere gia' ok)


    -caselle c14/c15
    se ho i prezzi di una delle due allora rendo visibile anche quelle in c16/c17 altrimenti no
    -caselle c16/c17 visibili sempre se non ho i prezzi in c14/c15
    questi ultimi due casi erano gestiti dalla macro:
    FIL_05_Definisce_OPZIONI_STAND_ALONE_OR_VALVE
    che ora devo modficare visto che siamo passati agli active x



  • di Grograman data: 23/08/2013 11:30:44

    Ariciao!

    Andiamo per gradi

    Intanto ho convertito in codice quanto haid etto di voler fare per le routine 4 e 6.
    Ho usato due metodi diversi per farti vedere la differenza, il primo cicla tutti i controlli in cerca del nome, se lo trova spegne il controllo (parliamo della macro 6, dove NON ci sono preziz in E)

    Il secondo, visto che parliamo di programmazione ad oggetti, istanzia una variabile di tipo oleobject proprio con il controllo che si chiama come la x (in questo caso dove CI SONO importi in colonna E).

    Se non è chiaro son qui!

    Ah, entrambi vanno messi nel modulo di classe "Foglio3 (Cfg_Filling)" del file che hai allegato:

    p.s. le variabili!! ricordati di dichiararle sempre, e di distruggere gli oggetti a fine routine!!!
     
    Sub FIL_S06_CANCELLA_OPZIONI()
      Dim x As Long
      Dim objChk As OLEObject
      Application.EnableEvents = 0
        For x = 1 To 27
          If Me.Cells(x + 11, 5) = "" Then
            For Each objChk In Me.OLEObjects
              With objChk
                If .Name = "CheckBox_F_OPT_" & Format(x, "00") Then
                  .Object.Value = False
                  .Visible = 0
                  Exit For
                End If
              End With
            Next objChk
          End If
        Next x
      Application.EnableEvents = 1
    End Sub
    
    Sub FIL_04_Definisce_OPZIONI()
      Dim x As Long
      Dim objChk As OLEObject
      Application.EnableEvents = 0
        For x = 1 To 27
          If Me.Cells(x + 11, 5) <> "" Then
            Set objChk = Me.OLEObjects("CheckBox_F_OPT_" & Format(x, "00"))
             objChk.Visible = True
            Set objChk = Nothing
          End If
        Next x
      Application.EnableEvents = 1
    End Sub
    



  • di Grograman data: 23/08/2013 12:33:11

    Già che c'ero... ho rimesso un pò mano al codice, dedicando una routine specifica all'alimentazione delle checkbox, in modo da rendere più corto il codice.

    Ho allegato esempio, il comando "Definisci opzioni" diventa inutile così.



  • di maxp72 data: 23/08/2013 15:46:22

    cavoli..faccio fatica a starti dietro, cerco di capire e non chiederti tutto ma e' dura....
    Nel frattempo avevo allegato un nuovo file anch'io con tutto quello che ero risucito a fare abilita-disabilita-opzioni-2.xls.
    Del tuo non mi sono chiare le istruzioni sotto.
    il codice in riga 1 richiama la macro Alimenta_CHK di cui pero' non capisco cosa faccia nella parte tra le parentesi

    stesso discorso per la riga2 non conosco il signficato di tutto cio' che hai messo tra parentesi...

     
    'riga1
    Call Me.Alimenta_CHK(CheckBox_F_OPT_27.Value, "CheckBox_F_OPT_27", 38)
    
    'riga2
    Sub Alimenta_CHK(ByVal Accendo As Boolean, ByVal strChk As String, Riga As Long)



  • di Grograman data: 23/08/2013 16:05:41

    Tranquillo ci siamo passati tutti

    Quello tra parentesi è una delle cose più comode di VBA a mio parere

    Sono gli argomenti di una funzione o routine.
    In pratica gli stai dicendo che, per far funzionare quella routine, ha bisogno di alcuni argomenti/parametri.
    Come quando metti una routine di selezione:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 1 Then MsgBox Target.Address
    End Sub

    Tutto cioò che chiami target sarà QUEL range.

    Tornando al tuo file:
    Accendo: booleana vero/falso, e noi gli passiamo "CheckBox_F_OPT_27.Value", che appunto sarà vero se l'abbiamo flaggata, falso se l'abbiamo deflaggata.

    strChk: variabile stringa, come vedi è il nome stesso del controllo chekbox

    Riga: una variabile di tipo long, serve nella routine per sapere dove infilare la formula per il prezzo.

    Quindi quando clicchi una qualsiasi checkbox scateni la routine, sempr ela stessa, ma passandole argomenti differenti.
    (ho visto adesso che era scritta male, ora "accendo" è al posto giusto)
     
    Sub Alimenta_CHK(ByVal Accendo As Boolean, ByVal strChk As String, Riga As Long)
      Dim objChk As OLEObject 'variabile oleobject
      Dim Prezzi As Range
      Set Prezzi = Me.Parent.Sheets("Prezzario").Range("a:b")
      Set objChk = Me.OLEObjects(strChk) 'la variabile diventa quella checkbox che si chiama come la stringa che hai passato alla routine
        If accendo Then 'accendo arriva come vero/falso quando clicchi la chkbox, se l'attivi passi vero, altrimenti 
          Me.Range("F" & Riga) = Application.WorksheetFunction.VLookup(Me.Range("B" & Riga), Prezzi, 2, 0)
        Else 'altrimenti qui
          Me.Range("F" & Riga) = "" 'riga come vedi è dove mettere il prezzo, o toglierlo se togli il flag alla chk
        End If
      Set objChk = Nothing
      Set Prezzi = Nothing
    End Sub



  • di maxp72 data: 23/08/2013 17:09:17

    potrei contattarti in privato?



  • di Grograman data: 23/08/2013 22:19:06

    Certo: craniolo@libero.it

    ma mi sa che se ne riparla lunedì



  • di maxp72 data: 27/08/2013 10:59:34

    Grazie, ti ho inviato mail.
    ciao



  • di Grograman data: 27/08/2013 15:24:27

    Ocio che io non ho ricevuto nulla!



  • di maxp72 data: 27/08/2013 16:44:02

    re-inviata
    l'allegato era un 7z(magari dava problemi?), ora ho messo uno zip.
    ciao



  • di Grograman data: 28/08/2013 09:35:26

    Ciao!

    Purtroppo la pacchia è finita e si ricomincia a lavorare, mi sono limitato quindi ad un paio di risposte veloci che ti allego in un file word perchè ci metto troppo a mandarmi via mail il testo e replicarti poi su quel canale

    Spero siano sufficienti o almeno di aiuto!



  • di maxp72 data: 28/08/2013 11:56:31

    grazie per le risposte
    apro nuova discussione per le protezioni.
    per il momento lascio aperta questa finche' non ho finito tutto il lavoro.