besoin d'aide pour voir si je peux simplifier mon code sur des checkbox

Cyrilc

XLDnaute Nouveau
Bonjour, je suis actuellement entrain de réaliser pour les cpes de mon lycée un userform pour rendre plus convivial le tableau de sélection des options lors des inscriptions.
je leur évite de mettre des 1 dans un tableau qui va de A a AT et qui pourra contenir 500 lignes pour un niveau.

ma question est j'ai fait pour mes checkbox dans la frame 1 spé1 un test que si elle est coché, on désactive la même option dans la spé 2 et 3 et si je selectionne l'option dans la colonne 2 ou 3 ca masque les deux autres chois dans les autres colonnes.

je voulais savoir car pour le moment j'ai fait ca
VB:
Private Sub Opbhgsp_Change() 'pour la checkbox hgsp si la valeur change'
If Opbhgsp.Value = True Then  'si la valeur de la checkbox est coché'
Opbhgspb.Visible = False 'alors je masque la checkbox de la spé2 (b)'
Opbhgspc.Visible = False 'et je masque aussi en spé3 (c)'
Else 'si c'est pas coché ou décoché'
Opbhgspb.Visible = True 'la checkbox de spé2 est visible'
Opbhgspc.Visible = True 'pareil pour la spé3'
End If

j'ai fais ça douze fois pour la première colonne pour vois si toutes mes dénominations de checkbox étaient bonnes mais je voudrais simplifier et alléger mon code pour éviter d'avoir une trentaine de fois la même fonction.
toutes mes checkbox ont le même début opb + nom de l'option
pour la spé2 ils se terminent tous par opb + nom de l'option +b
pour la spé3 ils se terminent pareil mais à la place de b j'ai mis c

je pense que ça dois être avec une question de variable a faire reconnaitre mais je me suis perdu/mélangé les pinceaux dans mes essais. donc j'aurai besoin d'un œil extérieur pour me faire comprendre comment faire.

je vous joint le fichier , je bosse actuellement sur la feuille 1Gene
j’espère que mon explication est claire car je me perds des fois aussi :)
merci beaucoup d'avance pour votre aide.
Cyril
 

Pièces jointes

  • inscription1eres.xlsm
    100.9 KB · Affichages: 9
Dernière édition:

vgendron

XLDnaute Barbatruc
hello

déjà.. tu peux simplifier tous tes "opxxx_change" par ca:
VB:
'suite de test pour chaque checkbox de la spé 1 et option fac 1
Private Sub Opbhgsp_Change()
    Opbhgspb.Visible = Not (Opbhgsp.Value)
    Opbhgspc.Visible = Not (Opbhgsp.Value)
End Sub
Private Sub Opbhlp_Change()
    Opbhlpb.Visible = Not (Opbhlp.Value)
    Opbhlpc.Visible = Not (Opbhlp.Value)
End Sub

Private Sub Opbllce_Change()
    Opbllceb.Visible = Not (Opbllce.Value)
    Opbllcec.Visible = Not (Opbllce.Value)
End Sub

Private Sub Opbmaths_Change()
    Opbmathsb.Visible = Not (Opbmaths.Value)
    Opbmathsc.Visible = Not (Opbmaths.Value)
End Sub

Private Sub Opbnsi_Change()
    Opbnsib.Visible = Not (Opbnsi.Value)
    Opbnsic.Visible = Not (Opbnsi.Value)
End Sub

Private Sub Opbphysiquechimie_Change()
    Opbphysiquechimieb.Visible = Not (Opbphysiquechimie.Value)
    Opbphysiquechimiec.Visible = Not (Opbphysiquechimie.Value)
End Sub

Private Sub Opbsvt_Change()
    Opbsvtb.Visible = Not (Opbsvt.Value)
    Opbsvtc.Visible = Not (Opbsvt.Value)
End Sub

Private Sub Opbsi_Change()
    Opbsib.Visible = Not (Opbsi.Value)
    Opbsic.Visible = Not (Opbsi.Value)
End Sub

Private Sub Opbses_Change()
    Opbsesb.Visible = Not (Opbses.Value)
    Opbsesc.Visible = Not (Opbses.Value)
End Sub

Private Sub Opbcav_Change()
    Opbcavb.Visible = Not (Opbcav.Value)
End Sub

Private Sub Opbeps_Change()
    Opbepsb.Visible = Not (Opbeps.Value)
End Sub

Private Sub Opblca_Change()
    Opblcab.Visible = Not (Opblca.Value)
End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Cyrilc , @vgendron ,

On peut, je pense, utiliser un module de classe. Dans ce cas on a rajouté le module de classe nommé : class_Chk_Specialite
avec comme code :
VB:
Option Explicit

Public WithEvents chk_new As MSForms.CheckBox

Private Sub chk_new_Click()
'on rend visible/invisible cette spécialité dans les autres frames
Dim xfrm, ctrl, etat As Boolean, nomOption As String, nomFrame As String
  etat = chk_new.Value    'état de la checkbox sur laquelle on a cliqué
  nomOption = chk_new.Caption     'texte de l'option
  nomFrame = chk_new.Parent.Name  'nom du frame qui contient la checkbox cliquée
  For Each xfrm In Split("espe1 espe2 espe3")   'pour chaque nom de frame
    If xfrm <> nomFrame Then      'si le frame est différent du frame de la checkbox cliquée
      For Each ctrl In inscript1gene.Controls(xfrm).Controls    'pour toutes les checkbox du frame
        'si le c'est la la même option que celle qui a été cliquée
        'on la rend visible ou non (état opposé à la checkbox cliquée)
        If ctrl.Caption = nomOption Then ctrl.Visible = Not etat
      Next ctrl
    End If
  Next xfrm
End Sub

et dans le userform inscript1gene:
  • on a supprimé toutes les procédures évènementielles Click des CheckBox "spécialité" (ce qui allège considérablement le code :cool:)
  • on a rajouté une déclaration et le code suivant à l'initialisation du userform:
VB:
'***********************************************************************************************
Private LesObjetsChk_new() As New class_chk_Specialite

Private Sub UserForm_Initialize()
'on place dans un tableau de type class_chk_Specialite (le tableau est LesObjetsChk_new())
'les checkbox qui représentent les spécialités
'les chexkbox concernés sont ceux contenus dans les trois frames espe1, espe2 et espe3
Dim xfrm, ctrl, i As Long
  For Each xfrm In Split("espe1 espe2 espe3")   ' pour chaque nom de frame
    For Each ctrl In Controls(xfrm).Controls    ' pour chacun des contrôles du frame
      If TypeName(ctrl) = "CheckBox" Then       ' si le type du contrôle est CheckBox
        i = i + 1                               ' on incrémente l'indice supéreiur du tableau
        ReDim Preserve LesObjetsChk_new(0 To i) ' on redimensionne le tableau (+ un élément)
        Set LesObjetsChk_new(i).chk_new = ctrl  ' on affecte au dernier élément du tableau,
                                                ' à sa propriété chk_new la contrôle ctrl
      End If
    Next ctrl
  Next xfrm
End Sub
'***********************************************************************************************
 

Pièces jointes

  • Cyrilc- inscription1eres- v1.xlsm
    106.2 KB · Affichages: 12
Dernière édition:

Cyrilc

XLDnaute Nouveau
@mapomme si je comprends la on fait le test sur la valeur du caption et non sur le nom de la checkbox? et donc si je veux reutiliser ce module de classe pour par exemple les options facultatives 1 et 2 ou pour un autre userform il faut juste que je copie et remplace les informations pour qu'il s'adapte aux autres frames et userform?
 

mapomme

XLDnaute Barbatruc
Supporter XLD
on fait le test sur la valeur du caption
En fait, chaque cas est particulier et dépend aussi du type de contrôle auquel on fait référence dans la module de classe.
Ici, il me semblait plus simple d'utiliser le "caption" qui est le même pour chaque matière dans les trois frames alors que le nom du chaque contrôle lui n'est pas le même dans chacun des trois frames.

si je veux reutiliser ce module de classe pour par exemple les options facultatives 1 et 2 ou pour un autre userform il faut juste que je copie et remplace les informations pour qu'il s'adapte aux autres frames et userform?
Personnellement, je ferai un nouveau module de classe avec une nouvelle procédure et je rajouterai un nouveau tableau et un bout de code pour le remplir dans le module du Userform. J'aime bien séparer les "choses". Bien sûr, les codes ressembleront fortement à ceux précédemment écrits pour les spécialités.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
pourquoi dans le userform du fichier retourné v1 ou v2 , l'affichage des différents items me semble plus petit, par rapport à mon fichier origine. j'ai oublié de bloquer quelques chose pour éviter la déformation?

Le Userform était trop grand pour être entièrement affiché sur mon écran. J'ai donc mis la propriété "Zoom" du Userform à 80 au lieu de 100.
J'avais oublié de le préciser :oops:
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 093
Messages
2 116 122
Membres
112 666
dernier inscrit
Coco0505