agir sur un "Checkbox" actif sans le nommer...

fredl

XLDnaute Impliqué
Bonjour à tous,
J'ai un Checkbox "Checkbox201" dans ma feuille "Sheets(2)" , et j'effectue une action vba dessus lorsqu'il est décoché :

Private Sub CheckBox201_Click()
If CheckBox201.Value = false Then
CheckBox201.ForeColor = &H80000000 'libellé en gris
End If
end sub

Ma question est la suivante : existe t'il une syntaxe particuliere qui permettrait d'écrire cette ligne de code
"CheckBox201.ForeColor = &H80000000 'libellé en gris"
sans utiliser le nom du checkbox (CheckBox201) du style :

Sheets(2).activeOLEObject.ForeColor = &H80000000 (qui marche pas)

ou

.ForeColor = &H80000000 (qui marche pas non plus)

Merci pour votre aide précieuse!!!
Cdt
Frédéric
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : agir sur un "Checkbox" actif sans le nommer...

Bonjour fredl,

Avec des 3 contrôles de formulaires. Sélectionner les contrôles et affecter la macro à exécuter "Cases_a_cocher" au sein de module1:
VB:
Sub Cases_a_cocher()
  With Worksheets("Feuil1")
    With .Shapes(Application.Caller)
      If .OLEFormat.Object.Value = 1 Then
        .OLEFormat.Object.Interior.Color = RGB(255, 255, 255)
      Else
        .OLEFormat.Object.Interior.Color = RGB(200, 200, 200)
      End If
    End With
  End With
End Sub
 

Pièces jointes

  • fredl-Action case à cocher v1.xlsm
    19.7 KB · Affichages: 28
  • fredl-Action case à cocher v1.xlsm
    19.7 KB · Affichages: 27
  • fredl-Action case à cocher v1.xlsm
    19.7 KB · Affichages: 28

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : agir sur un "Checkbox" actif sans le nommer...

Re,

L'essai précédent est complété avec trois contrôles ActiveX. Chaque contrôle est lié à sa cellule sous-jacente et une formule en cellule G2 permet de déclencher l'évènement calculate. Le nom des contrôles ActiveX doit débuter par CheckBox.

Le code pour les contrôles ActiveX est dans le module de code de la feuille Feuil1:
VB:
Private Sub Worksheet_Calculate()
Dim shp
  For Each shp In ActiveSheet.Shapes
   If TypeName(shp.OLEFormat.Object) = "OLEObject" Then
    If shp.OLEFormat.Object.Name Like "CheckBox*" Then
      If shp.OLEFormat.Object.Object.Value = True Then
        shp.OLEFormat.Object.Object.ForeColor = RGB(0, 0, 0)
      Else
        shp.OLEFormat.Object.Object.ForeColor = RGB(200, 200, 200)
      End If
    End If
  End If
  Next shp
End Sub

Nota: il y a toujours la solution plus classe via un module de classe avec un code efficace qu'on peut trouver sur ce forum mais le code sera un peu plus touffu. Comme aucun fichier n'était fourni :(, on ne peut savoir quel code serait le plus approprié.
 

Pièces jointes

  • fredl-Action case à cocher v2.xlsm
    30.4 KB · Affichages: 17
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : agir sur un "Checkbox" actif sans le nommer...

Re,

Une version v2a où le nom des contrôles ActiveX importe peu; c'est le type du contrôle qui est pris en compte (type CheckBox):
VB:
Private Sub Worksheet_Calculate()
Dim shp
  For Each shp In ActiveSheet.Shapes
   If TypeName(shp.OLEFormat.Object) = "OLEObject" Then
    If shp.OLEFormat.Object.progID = "Forms.CheckBox.1" Then
      If shp.OLEFormat.Object.Object.Value = True Then
        shp.OLEFormat.Object.Object.ForeColor = RGB(0, 0, 0)
      Else
        shp.OLEFormat.Object.Object.ForeColor = RGB(200, 200, 200)
      End If
    End If
  End If
  Next shp
End Sub

Nota: en fait l'utilisation des contrôles ActiveX avec le code proposé n'est pas bon :( puisqu'on arrive pas à identifier le ActiveX qui a changé d'état. il faut donc sans doute passer par un module de classe pour les contrôles ActiveX.
 

Pièces jointes

  • fredl-Action case à cocher v2a.xlsm
    31.4 KB · Affichages: 27
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : agir sur un "Checkbox" actif sans le nommer...

Bonjour à tous


Pour le plaisir de croiser mapomme et pour placer mes endives, une petite suggestion esthétique
Code:
Private Sub Worksheet_Calculate()
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
    With shp.OLEFormat
        If TypeName(.Object) = "OLEObject" Then
            If .Object.progID = "Forms.CheckBox.1" Then
            .Object.Object.ForeColor = _
            IIf(.Object.Object.Value = True, RGB(0, 0, 0), RGB(200, 200, 200))
            End If
        End If
    End With
Next shp
End Sub

NB: mapomme, t'aimes bien les endives au moins ?
Car je sais que tout le monde n'est pas coutumier des endives/café au lait au petit dej ;)
 

fredl

XLDnaute Impliqué
Re : agir sur un "Checkbox" actif sans le nommer...

Merci "ma pomme" pour ton aide.
Ton exemple marche parfaitement.
Par contre, j'ai un petit soucis avec mes cases à cocher (crées sous excel 2007) qui sont des Checkbox
Les tiennes sont des objets (excel 2010?)je crois...
En tous les cas ils sont différents et font bugger la macro à l'instruction
"With .Shapes(Application.Caller)"
je t'ai mis un exemple dans ton fichier.
Si tu as une idée pour remedier à ces checkbox sans devoir passer aux tiens...

Par ailleurs, je veux bien que tu me dises comment tu as créés les tiens!, cela m'interesse aussi!(case d'option des "contrôles de formulaire"?)

Merci pour ton aide!
 

Pièces jointes

  • fredl-Action case à cocher v1.xlsm
    22.7 KB · Affichages: 25
  • fredl-Action case à cocher v1.xlsm
    22.7 KB · Affichages: 25
  • fredl-Action case à cocher v1.xlsm
    22.7 KB · Affichages: 22

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : agir sur un "Checkbox" actif sans le nommer...

Bonjour Staple1600 :),

[...] NB: mapomme, t'aimes bien les endives au moins ?
Car je sais que tout le monde n'est pas coutumier des endives/café au lait au petit dej ;) [...]

Les chicons j'apprécie. Mais plutôt en légume cuit, juste salé et poivré comme il faut, avec quelques herbes qui peuvent varier selon l'humeur du jour, ou bien encore en salade avec une huile de noix. Hélas la véritable endive de ma jeunesse avec cette agréable petite pointe d'amertume qui en faisait toute la saveur a disparu.

Mais loin de moi cette chicorée mélangée ou non avec le café du matin que certain persiste à consommer alors que la guerre et les restrictions qui l'accompagnent appartiennent au passé depuis bien longtemps :). Et pourtant on s'obstinait, contre mon gré, à vouloir me faire ingurgiter cette boisson qu'on nomme l'ami du petit déjeuner. "On peut quand même pas passer directement du lait au café quand on est petit, l'étape intermédiaire c'est la chicorée" qu'ils disaient en trempant une tartine dans leur bol de véritable café.

Mais aussi fi de ces endives au jambon baignant dans une béchamel sirupeuse, quand bien même recouverte de fromage doré au four.

Non! non! juste au naturel les endives.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : agir sur un "Checkbox" actif sans le nommer...

Re

mapomme
Il est vrai que l'on ne mesure pas toujours la chance que nous avons de vivre au début du 21ième siècle et pas au début du 20ième
Ouch ! Fallait en vouloir !

Mais pour revenir à nos chicons ou plutôt ceux de fred:
Est-ce que je m'a trompé dans ma syntaxe avec mes endives et mon IIF ?
ou ton code et ton code stapelisé produise t-il les mêmes effets.

PS: Pour infos, j'aime bien le produit vanté par l'ami du petit déjeuner.
C'est même ce que je bois le matin quand je visite à moman et popa.

EDITION: Dans le cas présent, popa et moman sont mes "géniteurs", et non pas mes aïeux ;)
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : agir sur un "Checkbox" actif sans le nommer...

Bonsoir à tous,

Pour ne pas mélanger les deux cas dans un même classeur, j'ai créé deux fichiers:

  1. un fichier comportant trois contrôles de formulaire et le code associé
  2. un fichier comportant trois contrôles ActiveX et le code associé.


Cas des contrôles de formulaire:

On a inséré les trois contrôles de formulaire et à chacun de ces contrôles on a affecté la macro Cases_a_cocher sise dans le module1.

Avantages/Désavantages:

  • Quand on clique sur un contrôle, ce contrôle est identifié. On n'exécute donc la macro qu'une seule fois pour le contrôle sur lequel on a cliqué (le nom de ce contrôle n'est pas utilisé dans le code)
  • Si on désire qu'un contrôle spécifique ne déclenche pas la macro, il suffit de ne pas affecter la macro à ce contrôle spécifique.
  • En cas de nombreux contrôles sur la feuille, il suffit de les sélectionner tous et on leur attribue à tous la macro en un seul coup.
  • Si on veut des actions différentes pour deux sous-ensembles des contrôles, il suffit de leur affecter deux macros différentes.
  • Le code est concis.


Cas des ActiveX
.

  • On a inséré trois contrôles ActiveX.
  • A chacun de ces contrôles, on affecte à la propriété LinkedCell (clique droit sur le contrôle puis Propriété) l'adresse de la cellule sous-jacente au contrôle.
  • on place dans une cellule quelconque de Feuil1, la formule =somme(Plage)Plage doit au moins contenir toutes les cellules sous-jacentes de tous les contrôles. Cette formule servira à déclencher l'évènement Worksheet_Calculate de la feuille "Feuil1".
  • Le code sera placé au sein du code de Private Sub Worksheet_Calculate() de la feuille "Feuil1"

Avantages/Désavantages:

  • Quand on clique sur un contrôle, le contrôle n'est pas identifié. On exécute donc le code pour tous les contrôles ActiveX de type CheckBox. Ce qui n'est pas forcément ce qu'on désire.
  • Si on désire qu'un contrôle spécifique ne déclenche pas l'action, on ne sait pas le faire puisqu'on identifie pas le contrôle qui a changé d'état.
  • Si on veut faire des sous ensemble de contrôles avec actions différentes, on ne peut pas le faire en l'état actuel du code.
  • En cas de nombreux contrôles sur la feuille, il est long et pénible, à la création, de définir la propriété LinkedCell pour chacun des contrôles.
  • Le code plutôt concis.

Un palliatif à ces désavantages serait le passage par un module de classe mais le code est plus important.


fredl,
[...] j'ai un petit soucis avec mes cases à cocher (crées sous excel 2007) qui sont des Checkbox
Les tiennes sont des objets (excel 2010?)je crois...
En tous les cas ils sont différents et font bugger la macro à l'instruction
"With .Shapes(Application.Caller)"
je t'ai mis un exemple dans ton fichier.
Si tu as une idée pour remédier à ces checkbox sans devoir passer aux tiens... [...]
Le contrôle que tu as sur ta feuille est un contrôle ActiveX. Il faut donc utiliser la méthode n°2 (celle réservée aux ActiveX). Dans ton fichier, tu as utilisé le code pour les contrôles de formulaire. Je te prépare le fichier en retour.

[...] Par ailleurs, je veux bien que tu me dises comment tu as créés les tiens!, cela m’intéresse aussi!(case d'option des "contrôles de formulaire"?) [...]
Voir l'image jointe pour insérer des contrôles de formulaire. Pour des contrôles ActiveX, il suffit de sélectionner les contrôles du bas.


Staple1600,
[...] Mais pour revenir à nos chicons ou plutôt ceux de fred:
Est-ce que je m'a trompé dans ma syntaxe avec mes endives et mon IIF ?
ou ton code et ton code stapelisé produise t-il les mêmes effets. [...]
Oui le code stapélisé donne les mêmes résultats. Je l'ai repris dans le fichier pour ActiveX. J'ai aussi repris le IIF pour l'autre fichier (contrôles de formulaire)

[...] PS: Pour infos, j'aime bien le produit vanté par l'ami du petit déjeuner.
C'est même ce que je bois le matin quand je visite moman et popa.
Tout pareil quand je rendais visite à mamama et papapa (c'est comme ça que chez nous (Alsace du Nord) on désignait les grands-parents); le café c'était le dimanche. On devient tolérant avec l'âge. Merci pour le lien :) que je ne connaissais pas.
 

Pièces jointes

  • fredl-Action Objet Active case à cocher-staple1600 v1.xlsm
    28.1 KB · Affichages: 22
  • fredl-Action Objet Contôle de formulaire case à cocher v1.xlsm
    20.5 KB · Affichages: 22
  • Controle Formulaire (b).jpg
    Controle Formulaire (b).jpg
    63.5 KB · Affichages: 35
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : agir sur un "Checkbox" actif sans le nommer...

Re fredl,

[...] Par contre, j'ai un petit soucis avec mes cases à cocher (crées sous excel 2007) qui sont des Checkbox
Les tiennes sont des objets (excel 2010?)je crois...
En tous les cas ils sont différents et font bugger la macro à l'instruction
"With .Shapes(Application.Caller)"
je t'ai mis un exemple dans ton fichier.
Si tu as une idée pour remedier à ces checkbox sans devoir passer aux tiens
[...]

Voir ton fichier en retour,
 

Pièces jointes

  • fredl-Action case à cocher-retour v1.xlsm
    58.5 KB · Affichages: 26

fredl

XLDnaute Impliqué
Re : agir sur un "Checkbox" actif sans le nommer...

Bonjour,
je te remercie pour le temps que tu a passé à bien vouloir me répondre.
Réponse claire et détaillée!
Je vais donc de ce pas mettre en pratique tout cela.
Encore merci
Cordialement
Frédéric.
 

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin