Simplification de code, domaine:nom de CheckBox

  • Initiateur de la discussion Initiateur de la discussion zeltron
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

zeltron

XLDnaute Occasionnel
Bonjour à tout le forum,

J'ai plusieurs groupe de CheckBox sur feuille excel; Tout ces CheckBox ont un nom différent au sein d'un groupe, et entre les différents groupe ils sont également différent nom mais seulement par le chiffre en fin de nom

Exemple pour le 1er Groupe de CheckBox:

ChBxL1 ; ChBxL_Ma1 ; ChBxMa1 ; ChBxMa_Me1 ect...

Pour le 2eme Groupe de CheckBox:

ChBxL2 ; ChBxL_Ma2 ; ChBxMa2 ; ChBxMa_Me2 ect...

Ce que je fait est la chose suivante: quand je coche un CheckBox dans un groupe, par exemple le CheckBox "ChBxL2" je souhaite que certaine CheckBox du même groupe , en l'occurence "ChBxD_L2" et "ChBxL_Ma2" ont leur valeur qui passe à "False" et que dans les autres groupes les cHeckBox ayant le même nom (sauf le chiffre de la fin de nom) donc en l'occurence ChBxL1 ; ChBxL3 ;ChBxL4; ChBxL5;ChBxL6;ChBxL7 aient leur propriété "value" et "enabled" à false tout comme les CheckBox "ChBxD_L*(+chiffre du groupe)" et "ChBxL_Ma*(+chiffre du groupe)" de ces même groupes.


J'ai donc écrit le code suivant qui fonctionne:

Private Sub ChBxL2_Click()

If ChBxL2.Value = True Then

Range("A1").Value = ChBxL2.Name 'permet de savoir quel CheckBox a été coché
Range("A2").Value = 2 'permet de savoir quel groupe de checkBoxx est concerné

ChBxD_L2.Value = False
ChBxL_Ma2.Value = False

ChBxL1.Value = False
ChBxL3.Value = False
ChBxL4.Value = False
ChBxL5.Value = False
ChBxL6.Value = False
ChBxL7.Value = False
ChBxL1.Enabled = False
ChBxL3.Enabled = False
ChBxL4.Enabled = False
ChBxL5.Enabled = False
ChBxL6.Enabled = False
ChBxL7.Enabled = False

ChBxL_Ma1.Value = False
ChBxL_Ma3.Value = False
ChBxL_Ma4.Value = False
ChBxL_Ma5.Value = False
ChBxL_Ma6.Value = False
ChBxL_Ma7.Value = False
ChBxL_Ma1.Enabled = False
ChBxL_Ma3.Enabled = False
ChBxL_Ma4.Enabled = False
ChBxL_Ma5.Enabled = False
ChBxL_Ma6.Enabled = False
ChBxL_Ma7.Enabled = False


ChBxD_L1.Value = False
ChBxD_L3.Value = False
ChBxD_L4.Value = False
ChBxD_L5.Value = False
ChBxD_L6.Value = False
ChBxD_L7.Value = False
ChBxD_L1.Enabled = False
ChBxD_L3.Enabled = False
ChBxD_L4.Enabled = False
ChBxD_L5.Enabled = False
ChBxD_L6.Enabled = False
ChBxD_L7.Enabled = False

End If
End Sub

Ce que je souhaite c'est simplifier ce code.

De quelle manière puis-je dire:

Passer tous les cHeckBox "ChBxL*" sauf celui dont le nom est en A1, à "value=false" et "enabled=false"

Passer tous les cHeckBox ChBxD_L* et ChBxL_Ma* à "value=false" et "enabled=false" sauf ceux dont le nom se termine par le chiffre qui se trouve en A2 qu'il faut juste passer en value=false

Je pense que mon code est simplifiable mais je ne vois pas comment commencer.

Pouvez vous m'aider?

Vous en remerciant par avance

Cordialement

Zeltron
 
Re : Simplification de code, domaine:nom de CheckBox

Salut Zeltron,

Je n'ai pas regardé en détail ta question, mais pour ce qui est de la simplication du code, tu peux toujours faire de la manière suivante :
Code:
Private Sub ChBxL2_Click()
Dim i%
If ChBxL2.Value = True Then
    Range("A1").Value = ChBxL2.Name 'permet de savoir quel CheckBox a été coché
    Range("A2").Value = 2 'permet de savoir quel groupe de checkBoxx est concerné
    
    ChBxD_L2.Value = False
    ChBxL_Ma2.Value = False
    
    For i = 1 To 7
        Controls("ChBxL" & i).Value = False
        Controls("ChBxL_Ma" & i).Value = False
        Controls("ChBxD_L" & i).Value = False
        Controls("ChBxL" & i).Enabled = False
        Controls("ChBxL_Ma" & i).Enabled = False
        Controls("ChBxD_L" & i).Enabled = False
    Next i
End If
End Sub

@+
 
Re : Simplification de code, domaine:nom de CheckBox

Merci Porcinet de t'interresser à mon problème.

En regardant ton code je comprends mieux cependant quand tu met FOr i= 1 to 7, il va prendre i=2, or je ne veux pas pour i=2, comment puis dire:

For i=1 to 7 sauf pour i=2

Merci d'avance pour ton aide cordialement

Zeltron
 
Re : Simplification de code, domaine:nom de CheckBox

bonsoir a tous

notre porcinet n'etant pas la je te propose
Code:
[LEFT]Private Sub ChBxL2_Click()
Dim i%
If ChBxL2.Value = True Then
    Range("A1").Value = ChBxL2.Name 'permet de savoir quel CheckBox a été coché
    Range("A2").Value = 2 'permet de savoir quel groupe de checkBoxx est concerné
    
    ChBxD_L2.Value = False
    ChBxL_Ma2.Value = False
    
    For i = 1 To 7
      if i<>2 then
        Controls("ChBxL" & i).Value = False
        Controls("ChBxL_Ma" & i).Value = False
        Controls("ChBxD_L" & i).Value = False
        Controls("ChBxL" & i).Enabled = False
        Controls("ChBxL_Ma" & i).Enabled = False
        Controls("ChBxD_L" & i).Enabled = False
   End if
    Next i
End If
End Sub[/LEFT]

par contre il faudra traiter le 2 apart
 
Re : Simplification de code, domaine:nom de CheckBox

Merci Pierre Jean, je test et te tiens au courant ainsi que Porcinet.

Cependant juste avant je ne comprends pas la définition de variable:
Dim i%

Pourquoi n'est ce pas Dim i as Byte?

Merci d'avance

Cordialement

Zeltron
 
Re : Simplification de code, domaine:nom de CheckBox

Bonjour,

Juste pour dire merci a Pierrejean d'avoir pris la relève et pour dire que Dim i% correspond a Dim i as Integer
Et si j'utilise ces raccourci, c'est que je suis super fainéant 😉

@+
 
Re : Simplification de code, domaine:nom de CheckBox

Rebonjour,

Suite à votre aide j'ai donc utilisé le code suivant:

Private Sub ChBxL2_Click()

Dim i As Byte
If ChBxL2.Value = True Then
Range("A1").Value = ChBxL2.Name 'permet de savoir quel CheckBox a été coché
Range("A2").Value = 2 'permet de savoir quel groupe de checkBoxx est concerné

ChBxD_L2.Value = False
ChBxL_Ma2.Value = False

For i = 1 To 7
If i <> [A2] Then
Controls("ChBxL" & i).Value = False
Controls("ChBxL_Ma" & i).Value = False
Controls("ChBxD_L" & i).Value = False
Controls("ChBxL" & i).Enabled = False
Controls("ChBxL_Ma" & i).Enabled = False
Controls("ChBxD_L" & i).Enabled = False
End If

If i = [A2] Then
Controls("ChBxL" & i).Value = False
Controls("ChBxL_Ma" & i).Value = False
Controls("ChBxD_L" & i).Value = False
End If

Next i

End If
End Sub

Le problème est qu'il me mais "Erreur de compilation: Sub ou function non définie" en me soulignant: "Controls"

Où est le problème?

Pouvez vous m'aider?

Merci d'avance pour votre aide

Cordialement

Zeltron
 
Re : Simplification de code, domaine:nom de CheckBox

Content de te retrouver Pierre Jean,

je t'ai mis en fichier joint l'exemple, pour des questions de poids il n'y a plus que 3 groupes de CheckBox au lieu de 7, et le CheckBox où s'applique la macro est en rouge. J'espère que cela t'aidera a trouver la solution.

Merci d'avance

Zeltron
 

Pièces jointes

Re : Simplification de code, domaine:nom de CheckBox

re Zeltron

le probleme vient du fait que tes checbox sont directement sur la feuille
Or la collection Controls existe dans les userform et ne semble pas se trouver ailleurs (peut-etre dans un formulaire)

pas simple !!

je continue a regarder
 
Re : Simplification de code, domaine:nom de CheckBox

Aïe!! J'espère qu'il y a une solution!!!

J'avais vu cela, en cherchant sur le forum , j'avais vu beaucoup de codes du type : Me.controls... j'ai donc essayé en indiquant la feuille pour avoir:
Sheets ("...").controls... mais cela m'a donné le même type d'erreur.

Je continue à chercher également de mon côté.

Merci encore et à + avec la solution de mon côté ou de la tienne!!!

Cordialement

Zeltron
 
Re : Simplification de code, domaine:nom de CheckBox

Salut,

Cela reste a tester, mais je te propose ceci :
Code:
Private Sub ChBxL2_Click()
Dim i%, B As OLEObject
If ChBxL2.Value = True Then
    Range("A1").Value = ChBxL2.Name 'permet de savoir quel CheckBox a été coché
    Range("A2").Value = 2 'permet de savoir quel groupe de checkBoxx est concerné
    
    ChBxD_L2.Value = False
    ChBxL_Ma2.Value = False
    
    For Each B In ActiveSheet.OLEObjects
        i = i + 1
        If i <> 2 And TypeOf B.Object Is MSForms.CheckBox Then
            B.Object.Value = True = False
            B.Object.Enabled = True = False
        End If
    Next B
End If
End Sub

Je sais qu'il faut passer par OLEObjects, mais je n'arrive plus a me rappeler comment faire une boucle similaire a celle que je t'ai proposée au premier coup.

Tiens moi au courant.

à+
 
Re : Simplification de code, domaine:nom de CheckBox

re,

Comme mon ami Hervé a l'air d'etre trop timide pour répondre sur le forum ou alors il prefere que ce moi qui recolte tout les lauriers (je prefere cette dernière version 😛 ), je post une nouvelle solution avec le code qu'il m'a proposé :
Code:
Private Sub ChBxL2_Click()
Dim i%
If ChBxL2.Value = True Then
    Range("A1").Value = ChBxL2.Name 'permet de savoir quel CheckBox a été coché
    Range("A2").Value = 2 'permet de savoir quel groupe de checkBoxx est concerné
    ChBxD_L2.Value = False
    ChBxL_Ma2.Value = False
    
    For i = 1 To 7
        If i <> 2 Then
            With ActiveSheet
                .OLEObjects("ChBxL" & i).Object.Value = False
                .OLEObjects("ChBxL_Ma" & i).Object.Value = False
                .OLEObjects("ChBxD_L" & i).Object.Value = False
                .OLEObjects("ChBxL" & i).Object.Enabled = False
                .OLEObjects("ChBxL_Ma" & i).Object.Enabled = False
                .OLEObjects("ChBxD_L" & i).Object.Enabled = False
            End With
        End If
    Next i
End If
End Sub

@+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
1 K
Réponses
1
Affichages
602
Réponses
4
Affichages
1 K
Réponses
5
Affichages
2 K
Réponses
15
Affichages
2 K
Compte Supprimé 979
C
Retour