Checkbox : tout coche/décocher avec une seule case

Nogardryu

XLDnaute Nouveau
Bonjour,

Le sujet a déjà été abordé beaucoup de fois et j'ai pioché pas mal de choses à droite et à gauche, donc je ne repose pas la question. Par contre, ayant fait mon propre fichier pour tester les fonctions, j'en arrive à un point où je ne suis pas loin de réussir, je suis sûr que je suis à deux doigts, que mon code est quasi bon (c'est le quasi qui change tout ^^) et je ne comprends pas pour quoi ça ne marche pas. J'ai donc besoin d'aide.

Le système est tout bête : j'ai une liste d'item avec une case à cocher devant chacun. Je peux en cocher un, plusieurs, ou tous.
Si je veux tout cocher, j'ai une case qui permet de le faire en une fois (Tout cocher/décocher). Si je veux tout décocher, je décoche très logiquement cette même case. Au-dessus, j'ai un rappel de mes choix qui se met à jour automatiquement.

coche_decoche.jpg


Le fait de tout cocher fonctionne très bien, toutes les cases, y compris la case "Tout cocher/décocher" se cochent. Mais pour décocher, c'est un autre problème. Ma case "Tout cocher/décocher" se décoche, mais les autres ne bougent pas et là, je ne comprends vraiment pas pourquoi.

Pour info, sur ce fichier de test, j'ai mis tous les contrôles et les cases liées ou de formule visibles pour faciliter l'analyse du fichier. J'ai également ajouter le bouton "décocher" pour éviter aux personnes qui voudraient m'aider et tester, d'avoir à décocher à chaque fois toutes les cases. Ça, ça marche ^^.

Voici le code, fruit de mes pérégrinations sur ce même forum et de mes connaissances (de base :p) antérieures. (me suis un peu ennuyé à mettre des couleurs mais c'est quand même plus agréable à lire ^^).


Code:
[COLOR="Blue"]Sub[/COLOR] coche_decoche()
[COLOR="Blue"]For Each[/COLOR] coche [COLOR="Blue"]In[/COLOR] ActiveSheet.Shapes              [COLOR="DarkGreen"]'début de la boucle[/COLOR]
    [COLOR="Blue"]If[/COLOR] coche.Name [COLOR="Blue"]Like[/COLOR] "Check*" [COLOR="Blue"]Then[/COLOR]              [COLOR="DarkGreen"]' s'il c'est une case à cocher[/COLOR]
        [COLOR="Blue"]If[/COLOR] coche.ControlFormat.Value = 1 [COLOR="Blue"]Then[/COLOR]     [COLOR="DarkGreen"]' et si la case est cochée[/COLOR]
           Feuil1.[H11:H15] = [COLOR="Blue"]True[/COLOR]                [COLOR="DarkGreen"]' cocher toutes les cases[/COLOR]
        [COLOR="Blue"]ElseIf[/COLOR] coche.ControlFormat.Value = 0 [COLOR="Blue"]Then[/COLOR]  [COLOR="DarkGreen"]' si la case n'est pas cochée[/COLOR]
           Feuil1.[H11:H15] = [COLOR="Blue"]False[/COLOR]               [COLOR="DarkGreen"]' décocher toutes les cases[/COLOR]
        [COLOR="Blue"]End If[/COLOR]                                    [COLOR="DarkGreen"]' fin du premier si[/COLOR]
    [COLOR="Blue"]End If[/COLOR]                                        [COLOR="DarkGreen"]' fin du deuxième si[/COLOR]
[COLOR="Blue"]Next[/COLOR]                                              [COLOR="DarkGreen"]' fin de la boucle[/COLOR]
[COLOR="Blue"]End Sub[/COLOR]

Voilà l'histoire. Je pense ne pas être loin mais qu'à trop être la tête dans le code, je ne vois pas un truc qui va vous sauter à la figure.

Merci par avance de votre aide.
 

Pièces jointes

  • coche_decoche_tout.xlsm
    18.2 KB · Affichages: 360
G

Guest

Guest
Re : Checkbox : tout coche/décocher avec une seule case

Bonjour,

Merci pour ce post à la demande claire et pour les couleurs.

Je te propose:

Code:
Sub Cocher_Decocher()
    'Inverser la valeur des cellules liées
    Feuil1.[H11:H16] = Not CBool([H16])
End Sub

Il suffit en effet d'inverser la valeur des cellules pour que les checkbox soient ou non cochées.

Ceci n'étant pas spécifique à xl 2007, pourrais-tu la prochaine fois enregistrer ton fichier en version 97-2003 pour ceux qui ne possèdent par 2007. Merci

A+
 
G

Guest

Guest
Re : Checkbox : tout coche/décocher avec une seule case

Re,

A partir de ta solution:

Code:
Sub coche_decoche()   
       For Each coche In ActiveSheet.Shapes
        If coche.Name Like "Check*" Then coche.DrawingObject.Value = Abs(CBool([H16])) 
 
        Next
 
  End Sub

A+
 
Dernière modification par un modérateur:

Nogardryu

XLDnaute Nouveau
Re : Checkbox : tout coche/décocher avec une seule case

Bonjour Hasco et merci beaucoup.

Ca fonctionne effectivement.

Peux-tu juste expliquer (rapido hein ^^) la partie ci-dessous

Code:
coche.DrawingObject.Value = Abs(CBool([H16]))

Je comprends le Abs (nombre entier positif je crois), j'imagine que Cbool, c'est du bolléen... mais j'ai du mal à comprendre la réflexion et l'articulation des deux.
(j'aime pas ne pas comprendre ^^).

Merci à toi en tout cas.
 
G

Guest

Guest
Re : Checkbox : tout coche/décocher avec une seule case

Re,

coche..Value = Abs(CBool([H16]))

DrawingObject parce qu'on travaille sur l'objet lui-même et non son format

Pour VB True = -1 False = 0
Dans les Feuille de calcul VRAI = 1 et FAUX = 0

CBool([H16]) est une fonction de conversion de type.
Si [H16] contient VRAI ou FAUX renverra -1 ou 0

Abs(CBool([H16])) renverra donc 1 ou 0

Attention qu'il n'y ait pas autre chose que les Valeur VRAI ou FAUX en h16

Si vide -> renverra 0

Si autre chose -> résultat aléatoire!!!

A+
 

Nogardryu

XLDnaute Nouveau
Re : Checkbox : tout coche/décocher avec une seule case

Ok, je comprends.

Excellente solution avec un petit bémol, si tu as 200 cases, ça va mettre quelques secondes pour terminer l'action, mais je ne vais pas chipoter ^^.

Une petite question pour une réponse rapide, et en fonction de la réponse, je créerais un autre sujet ou non. Est-il possible dans Excel de conditionner des cases à cocher, c'ad que si j'ai plusieurs groupes de cases, si je coche une certain case, ça débloque d'autres cases ou inversement, en cochant une case, j'en bloque d'autres (à la manière des formulaires sur Internet).
Là j'avoue que malgré mes recherches, je n'arrive pas à trouver de réponse concrète à cette question.

Merci à vous.
 
G

Guest

Guest
Re : Checkbox : tout coche/décocher avec une seule case

Bonjour,

Pourquoi ne pas utiliser les controles de l'onglet Developpeur Groupe Insérer -> Contrôles ActiveX

Ils sont plus facile à manipuler par VBA que les controles de formulaires.

Peut-être qu'un userForm serait nécessaire.

En tous cas répondre théoriquement, n'est pas le but du forum.

A+
 

Statistiques des forums

Discussions
312 885
Messages
2 093 255
Membres
105 658
dernier inscrit
Mario Richard