Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Check box nel foglio di excel

321 views
Skip to first unread message

Alberto

unread,
Nov 24, 2009, 6:43:06 AM11/24/09
to
Ciao a tutto il NG,

qualche tempo fa abbiamo esaminato il problema di rendere non visibili
in un colpo solo una serie di oggetti posti dentro una user form, ed è
uscito fuori questo codice:
Sub test()
Dim c As MSForms.Control
Dim i As Long
For Each c In UserForm1.Controls
For i = 1 To 10
If c.Name = "Label" & i Then
c.Visible = False
End If
Next
Next
End Sub

E se invece di avere delle label in una userform, gli oggetti fossero
delle checkbox poste però nel foglio di excel?
La semplice variazione in

For Each c In Worksheets("foglio1").Controls

da errore di runtime 438 proprietà o metodo non supportati
Immagino che occorra cambiare anche la riga
Dim c As MSForms.Control
ma come?
O che altro?

Grazie a tutti

Alberto G

Scossa

unread,
Nov 24, 2009, 8:36:05 AM11/24/09
to
On 24 Nov, 12:43, Alberto <albe...@gmail.com> wrote:
>
> For Each c In Worksheets("foglio1").Controls
>

Uno spunto:

'----------------------
Public Sub m()
Dim obj As Object

For Each obj In ActiveSheet.Shapes
obj.Visible = False
Next

For Each obj In ActiveSheet.Shapes
obj.Visible = True
Next


End Sub
'---------------------

Fai sapere se hai risolto, grazie.

Bye!
Scossa

Scossa

unread,
Nov 24, 2009, 8:41:07 AM11/24/09
to
On 24 Nov, 14:36, Scossa <scossa...@gmail.com> wrote:
> On 24 Nov, 12:43, Alberto <albe...@gmail.com> wrote:

Ovviamente se voui solo le checkbox:

Public Sub m()
Dim obj As Object

For Each obj In ActiveSheet.Shapes

If InStr(obj.Name, "CheckBox") Then
obj.Visible = False
End If


Next
For Each obj In ActiveSheet.Shapes

If InStr(obj.Name, "CheckBox") Then
obj.Visible = True
End If
Next

End Sub

> Bye!
> Scossa

r

unread,
Nov 24, 2009, 6:51:01 PM11/24/09
to
"Scossa" ha scritto:

c'è qualcuno a cui piace cambiare i nomi ...
si potrebbe provare con qualcosa del genere

Public Sub m()
Dim sha As Shape
Dim c As OLEObject

For Each sha In ActiveSheet.Shapes
If sha.Type = 8 Then
If sha.FormControlType = xlCheckBox Then
sha.Visible = false
End If
End If
Next

For Each c In ActiveSheet.OLEObjects
If TypeName(c.Object) = "CheckBox" Then
c.Visible = false


End If
Next
End Sub

che ne dici?

saluti
r
--
Come e dove incollare il codice:
http://www.rondebruin.nl/code.htm

Le mie case nel web:
http://excelvba.altervista.org/blog/index.php/Table/Excel-VBA/

http://r-mensa.blogspot.com/


Scossa

unread,
Nov 25, 2009, 2:32:27 AM11/25/09
to
r ha scritto:

>
> c'è qualcuno a cui piace cambiare i nomi ...

Giustissima osservazione (io sono solito cambiare il nome ai
controlli).

> si potrebbe provare con qualcosa del genere

> If sha.Type = 8 Then

Questo controlla che sia un controllo su una userform e non un activeX
sul foglio giusto?


>
> For Each c In ActiveSheet.OLEObjects
> If TypeName(c.Object) = "CheckBox" Then
> c.Visible = false
> End If
> Next

Questa mi piace.

> che ne dici?

Tacio e imparo :-)

A difesa :-) della mia soluzione, una situazione in cui risulta utile
testare il nome è per operare su specifici controlli, p.e.:

5 controlli vari (nomi:Alfa, Beta, Gamma, Delta, Iota):

Public Sub mm()
Dim obj As Object

For Each obj In ActiveSheet.Shapes

Select Case obj.Name
Case "Alfa", "Gamma"
obj.Visible = False
Case Else
obj.Visible = True
End Select

Mauro Gamberini

unread,
Nov 25, 2009, 4:23:34 AM11/25/09
to
> If sha.Type = 8 Then

Questo controlla che sia un controllo su una userform e non un activeX
sul foglio giusto?

+++++++++++++++++++++++++++++++++++++++++

No, un controllo modulo Casella di controllo.
Metti su di un foglio i due tipi di CheckBox
e poi fai girare la macro di Roberto
commentando o meno uno dei due
cicli For.

--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/excelit/threads


Scossa

unread,
Nov 25, 2009, 4:41:57 AM11/25/09
to
Ciao Mauro,

> +++++++++++++++++++++++++++++++++++++++++
>
> No, un controllo modulo Casella di controllo.
> Metti su di un foglio i due tipi di CheckBox
> e poi fai girare la macro di Roberto
> commentando o meno uno dei due
> cicli For.

Prorpio perchè avevo provato chiedevo :-)

Infatti con
If sha.Type = 8
non entra nel ciclo, in quanto sha.type vale 12 sia per textbox che
per checkbox (sul foglio):

mettendo sha.type = 12 entra nel ciclo ma l'istruzione

If sha.FormControlType = xlCheckBox Then

genera errore in quanto sha.FormControlType vale solo per le form come
da help in linea:

Osservazioni
Non è possibile utilizzare questa proprietà con controlli ActiveX. Le
proprietà Type per l'oggetto Shape devono restituire msoFormControl.

da qui la mia domanda.

Se puoi chiarirmi i dubbi .....

Bye!
Scossa

Mauro Gamberini

unread,
Nov 25, 2009, 4:56:00 AM11/25/09
to
Prorpio perch� avevo provato chiedevo :-)

Infatti con
If sha.Type = 8
non entra nel ciclo, in quanto sha.type vale 12 sia per textbox che
per checkbox (sul foglio):

************************************************

Non ho capito.
Partiamo da un foglio con
CheckBox moduli e ActveX e
da questo codice:

Public Sub m_1()

Dim sha As Shape
Dim c As OLEObject

For Each sha In ActiveSheet.Shapes

If sha.Type = 8 Then

If sha.FormControlType = xlCheckBox Then

sha.Visible = False


End If
End If
Next

For Each c In ActiveSheet.OLEObjects


If TypeName(c.Object) = "CheckBox" Then

c.Visible = False
End If
Next

Set sha = Nothing
Set c = Nothing

End Sub

Public Sub m_2()

Dim sha As Shape
Dim c As OLEObject

For Each sha In ActiveSheet.Shapes

If sha.Type = 8 Then

If sha.FormControlType = xlCheckBox Then

sha.Visible = True


End If
End If
Next

For Each c In ActiveSheet.OLEObjects


If TypeName(c.Object) = "CheckBox" Then

c.Visible = True
End If
Next

Set sha = Nothing
Set c = Nothing

End Sub

Adesso che facciamo?
Grazie.

Mauro Gamberini

unread,
Nov 25, 2009, 5:03:14 AM11/25/09
to
<cut>

Uhmmm..... rileggendo:

On Error Resume Next


For Each sha In ActiveSheet.Shapes

If sha.Type = 12 Then

Scossa

unread,
Nov 25, 2009, 7:55:26 AM11/25/09
to

Mauro Gamberini ha scritto:


> <cut>
>
> Uhmmm..... rileggendo:
>
> On Error Resume Next
> For Each sha In ActiveSheet.Shapes
> If sha.Type = 12 Then
>

Infatti: su un foglio
-> modalità progettazione
-> inserisco 2 Textbox e 3 checkbox
-> esco da modalità progettazione.

la routine:


For Each sha In ActiveSheet.Shapes

If sha.Type = 8 Then
If sha.FormControlType = xlCheckBox Then

sha.Visible = false


End If
End If
Next

non entra nel ciclo for perchè sha.type vale 12 per tutti i controlli,
mentre 8 è il valore della "costante simbolica"(?) msoFormControl
(.FormControlType vale solo per questi).

Non so se sono riuscito a spiegarmi.

Bye!
Scossa


Scossa

unread,
Nov 25, 2009, 7:58:45 AM11/25/09
to

Scossa ha scritto:
errata:


> non entra nel ciclo for

corrige:
> non entra nell'if


> perchè sha.type vale 12 per tutti i controlli,

Bye!
Scossa

Alberto

unread,
Nov 25, 2009, 11:35:14 AM11/25/09
to
Ciao Scossa, ciao r

scusate il ritardo nel ritornare (giornata pienissima !)
Vedo che comunque l'argomento non è restato lettera morta, nel
frattempo.
Spero anche di non fare un doppio post visto che il primo ha dato
errore.
Ho provato i primi suggerimenti ed la conclusione è: la seconda che
avete detto.
Funzionano la seconda di Scossa e la seconda di r.

Continuando a ragionare sul mio problema, mi sono accorto che mi
avrebbe fatto più comodo non passare da Visible true a false ma di
passare da Value true a false.
Tuttavia mi risulta che la sostituzione delle espressioni funzionanti
obj.Visible = False
c.Visible = false
con le espressioni
obj.Value = False
c.Value = false
porta nuovamente ad un errore. La cosa mi è sembrata strana visto che
sia visible che value sono entrambe proprietà della checkbox.
Mi aiutate a capire come scrivere la routine che azzera, anzichè
cancellare?
Saluti

Alberto G

Mauro Gamberini

unread,
Nov 25, 2009, 11:56:15 AM11/25/09
to
Tuttavia mi risulta che la sostituzione delle espressioni funzionanti
obj.Visible = False
c.Visible = false
con le espressioni
obj.Value = False
c.Value = false
porta nuovamente ad un errore
*************************************

Butta i controlli modulo, sono
meno gestibili da codice.
Per i controlli ActiveX:

For Each c In ActiveSheet.OLEObjects
If TypeName(c.Object) = "CheckBox" Then

c.Object.Value = True
End If
Next

For Each c In ActiveSheet.OLEObjects


If TypeName(c.Object) = "CheckBox" Then

c.Object.Value = False
End If
Next

Che messo in una unica Sub,
potrebbe essere, ad esempio:

Private Sub m()
Dim c As OLEObject
For Each c In Me.OLEObjects


If TypeName(c.Object) = "CheckBox" Then

If c.Object.Value = True Then
c.Object.Value = False
Else
c.Object.Value = True
End If

End If
Next


Set c = Nothing
End Sub

La macro qui sopra � private e deve trovarsi nel
modulo del foglio dove hai i controlli.
Modificala per le tue esigenze.

Scossa

unread,
Nov 25, 2009, 12:26:19 PM11/25/09
to

Alberto ha scritto:


> con le espressioni
> obj.Value = False

> c.Value = false

devi usare:
nella mia
obj.OLEFormat.Object.Object.Value = True

in quella di Roberto:
c.Object.Value = false

Bye!
Scossa

Alberto G.

unread,
Nov 25, 2009, 2:32:16 PM11/25/09
to

"Scossa" <scos...@gmail.com> ha scritto nel messaggio
news:4e4723c5-ca1a-4c9d...@k17g2000yqh.googlegroups.com...

Ed infatti funzionano benissimo

Grazie.
Saluti

Alberto G

Alberto G.

unread,
Nov 25, 2009, 2:38:26 PM11/25/09
to

"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> ha scritto nel
messaggio news:ufRT7Afb...@TK2MSFTNGP04.phx.gbl...

Mauro ciao,

sollecitato dal tuo post, ho fatto le segienti operazioni:
- aperto un file excel nuovo
- visualizzata la barra degli strumenti di controllo, ed ho piazzato una
Checkbox sul foglio
- l'ultima icona di tale barra � quella dei controlli aggiuntivi. ho
cliccato su questa, si � aperta una lista lunghissima che ho scorso tutta
fino alla fine, non trovando niente di meglio che "Microsoft Forms 2.0
checkbox"
-piazzata questa sul foglio ed aperta la finestra delle propriet�, mi sono
sembrate identiche.
Premesso che uso XL2003, ti riferivi a questa?
Oppure esiste un'altra checkbox OCX, che magari devo ancora caricare?

Grazie, ciao

Alberto G

r

unread,
Nov 25, 2009, 5:30:32 PM11/25/09
to

sai che non ho capito la tua domanda ...
ti sei già risposto? o hai ancora dei dubbi?
scusa ... ma ho letto tutti gli interventi
non capendo ...

il fine era quello di controllare sia i controlli modulo
che quelli activex ... utilizzando una proprietà indipendente
dal nome ...

che dubbi hai?
ciao
r

Scossa

unread,
Nov 26, 2009, 12:42:19 AM11/26/09
to
On 25 Nov, 23:30, r <robb....@gmail.com> wrote:
Ciao Roby,

ti spiego (scusa il linguaggio poco tecnico):
io avevo capito che nella tua routine il primo ciclo for opera sui
controlli nelle userform (sha.type=8) mentre il secondo sui controlli
nel foglio, quindi chiedevo conferma se

If sha.Type = 8 Then

serve effettivamente identificare i controlli di una userform;

ma Mauro ha detto:


No, un controllo modulo Casella di controllo.

Ma secondo me la verifica che sia una Casella di controllo la fa l'IF
all'interno del ciclo for, ciclo in cui non entra se il controllo è
sul foglio (sha.type=12) come nel caso di Alberto.

> che dubbi hai?

Quindi il dubbio è: ho frainteso la risposta di Mauro (che forse non
aveva capito la mia domanda) o non ho capito il funzionamento della
tua routine?

Bye!
Scosssa

Scossa

unread,
Nov 26, 2009, 2:08:42 AM11/26/09
to
On 26 Nov, 06:42, Scossa <scossa...@gmail.com> wrote:
> Ma secondo me la verifica che sia una Casella di controllo la fa l'IF
> all'interno del ciclo for, ciclo in cui non entra se il controllo è
> sul foglio (sha.type=12) come nel caso di Alberto.

Scusate stavo ancora dormendo e ho fatto casino tra for e if

riformulo:

Ma secondo me la verifica che sia una Casella di controllo la fa il
secondo IF (If sha.FormControlType = xlCheckBox )
all'interno del ciclo for, secondo if cui non arriva mai perchè non
supera il primo if (If sha.Type = 8) in quanto, se il controllo è
sul foglio (come nel caso di Alberto) sha.type vale 12.

Mauro Gamberini

unread,
Nov 26, 2009, 3:14:01 AM11/26/09
to
> sollecitato dal tuo post, ho fatto le segienti operazioni:
> - aperto un file excel nuovo
> - visualizzata la barra degli strumenti di controllo, ed ho piazzato una
> Checkbox sul foglio
> - l'ultima icona di tale barra � quella dei controlli aggiuntivi. ho
> cliccato su questa, si � aperta una lista lunghissima che ho scorso tutta
> fino alla fine, non trovando niente di meglio che "Microsoft Forms 2.0
> checkbox"
> -piazzata questa sul foglio ed aperta la finestra delle propriet�, mi sono
> sembrate identiche.
> Premesso che uso XL2003, ti riferivi a questa?
> Oppure esiste un'altra checkbox OCX, che magari devo ancora caricare?
>

Mah....
Sul foglio possiamo mettere
due tipi di controlli.
Gli ActiveX.
I controlli modulo.

Gli ActiveX sono disponibili da:
(Excel pre 2007)
Visualizza-->Barre degli strumenti
Strumenti di controllo
(Excel 2007 e seguenti)
Ribbon(linguetta) Sviluppo
Pulsante:Inserisci
Sono i controlli sotto alla
scritta Controlli ActiveX

I controlli modulo sono disponibili da:
(Excel pre 2007)
Visualizza-->Barre degli strumenti
Moduli
(Excel 2007 e seguenti)
Ribbon(linguetta) Sviluppo
Pulsante:Inserisci
Sono i controlli sotto alla
scritta Controlli modulo

--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/

http://social.microsoft.com/Forums/it-IT/officeit/threads

r

unread,
Nov 26, 2009, 4:59:23 PM11/26/09
to

intanto apri una cartella nuova ...
visualizza->barra degli strumenti ->moduli ... verifica che sia
spuntata ... nel caso le caselle di controllo non siano visibili nella
barra ... vai in ozioni barra degli strumenti (il triangolino nero con
la barretta sopra a destra della barra) ... aggiungi o rimuovi
pulsanti->moduli->casella di controllo

adesso aggiungine una al foglio ...
scusa se spiego come parlassi a un principiante
ma così sono sicuro che parliamo della stessa cosa ...

poi lancia la mia macro con F8 passo a passo

il primo ciclo verifica questo tipo di controlli ...

è necessario separe i controlli nella routine
utilizzando due cicli perchè non esiste una proprietà
che indichi il tipo di controllo nel caso degli activex
guarda la guida a proposito di FormControlType ...
è spiegato tutto molto bene ... l'esempio della guida
tra l'altro, mostra esattamente quello
che ho scritto io ... personalmente non avevo letto la guida
quando ho scritto il codice quindi probabilmente MS
ha copiato il mio codice :-) ...

per i controlli activex
sha.Type = 12 (msoOLEControlObject ) ... il problema è
che pur riuscendo a identificare che la shape è un controllo
activex (quelli che trovi nella barra raggiungibile da:
visualizza->barra degli strumenti ->strumenti di controllo)
aggiungendo un elseif alla prima if non
ho trovato il modo poi di recuperarela tipologia del controllo ...

da qui la scelta di eseguire un nuovo ciclo (il secondo) che
verifica i controlli OLE che appunto contengono tra loro
gli activex ,,, in questo ciclo è possibile verificare di che
tipo di controllo si tratta.

tu dici il caso di Alberto è che siano controlli activex ...
in quel caso è sufficiente il secondo ciclo for ... io non
ero sicuro quindi ho preso in esame entrambi i tipi di
controllo.

saluti
r

Scossa

unread,
Nov 26, 2009, 5:18:57 PM11/26/09
to
On 26 Nov, 22:59, r <robb....@gmail.com> wrote:
> intanto apri una cartella nuova ...
> visualizza->barra degli strumenti ->moduli ... verifica che sia
> spuntata ... nel caso le caselle di controllo non siano visibili nella
> barra ... vai in ozioni barra degli strumenti (il triangolino nero con
> la barretta sopra a destra della barra) ... aggiungi o rimuovi
> pulsanti->moduli->casella di controllo
>
> adesso aggiungine una al foglio ...
> scusa se spiego come parlassi a un principiante
> ma così sono sicuro che parliamo della stessa cosa ...
>

Ok, adesso ho capito ...

Bye!
Scossa

r

unread,
Nov 26, 2009, 5:41:50 PM11/26/09
to

se trovi un modo diverso ... per utilizzare
solo il primo ciclo con elseif sha.Type = 12 then
fai sapere ...
ciao
r

0 new messages