abilitare caselle automaticamente
Hai un problema con Excel? 
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.
Vuoi Approfondire?