IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Limitation du nombre de CheckBox cochables [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Février 2015
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Février 2015
    Messages : 126
    Points : 65
    Points
    65
    Par défaut Limitation du nombre de CheckBox cochables
    Bonsoir,

    J'ai beau chercher depuis maintenant 2h, je ne trouve pas ..
    Pourtant ma question est simple, je veux imposer une limite de checkbox cochable à 10.
    En effet, j'ai dans un userform, 16 checkbox, mais l'utilisateur ne doit pouvoir en cocher que 10...

    Je suis certain qu'il est possible de faire cela mais je ne sais comment...
    Merci à vous et bonne soirée !

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    À première vue et non testé:

    dans un module standard:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public compteur
    Sub FautBienTesteDeNePasDépasserDix
         compteur = compteur + 1
         if compteur > 10 then 
              msgbox("Vous excédez la limite de 10 sélections")
              ajouter le code pour continuer le programme ou remplacer une sélection
         end if
    end sub
    Dans l'événement qui va bien dans le module de code de chaque CheckBox. Je suppose, je dis bien suppose de AfterUpdate devrait aller mieux que click

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CheckBox1_AfterUpdate()
         FautBienTesteDeNePasDépasserDix
    End Sub
    Tu vas probablement devoir broder un peu...
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, un embryon perfectible à adapter à ton contexte pour le décompte. Prévoir un module de classe pour tes checkboxes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Option Explicit
     
    Dim cpt As Long
     
    Private Sub Tst()
    Dim Ctrl As Control
        cpt = 0
        For Each Ctrl In UserForm1.Controls
            If TypeOf Ctrl Is MSForms.CheckBox Then
                If Ctrl.Value = True Then
                    cpt = cpt + 1
                End If
            End If
        Next Ctrl
        Application.StatusBar = cpt
    End Sub
     
    Private Sub CheckBox1_Change()
        Tst
    End Sub
     
    Private Sub CheckBox2_Change()
        Tst
    End Sub

  4. #4
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour,
    Autre idée :
    code dans l'usf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub UserForm_Activate() 'ou Initialize
    Dim Cl As C_CheckBox
     
    Set Collect = New Collection
     For Each Ctrl In Me.Controls
        'verifie s'il s'agit d'un CheckBox
        If TypeOf Ctrl Is MSForms.CheckBox Then
          Set Cl = New C_CheckBox
          Set Cl.groupeCheckBox = Ctrl
          Collect.Add Cl
        End If
    Next Ctrl
     
    End Sub
    code dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Collect As Collection
    Public Ctrl As Control, Nb As Integer
    code dans un module de classe qu'on nomme C_CheckBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Explicit
     
    Public WithEvents groupeCheckBox As MSForms.CheckBox
     
    Private Sub groupeCheckBox_Click()
    Nb = 0
    For Each Ctrl In UserForm1.Controls
      If TypeOf Ctrl Is MSForms.CheckBox And Ctrl = True Then
            Nb = Nb + 1
            If Nb > 10 Then MsgBox "Limité à 10": UserForm1.ActiveControl = False
      End If
    Next
    End Sub
    Nom : cl_check.PNG
Affichages : 232
Taille : 5,9 KoNom : cl_form_check.PNG
Affichages : 233
Taille : 7,7 Ko
    Fichiers attachés Fichiers attachés
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  5. #5
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Il est possible d'utiliser un module de classe afin d'avoir un appel commun mais là, j'ai fais simple (une proc pour chaque case à cocher). Sur "BeforeUpdate" afin de pouvoir annuler la coche et décocher puis re-cocher si trompé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    Private Sub CheckBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
    Private Sub CheckBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
    Private Sub CheckBox3_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
    Private Sub CheckBox4_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
    Private Sub CheckBox5_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
    Private Sub CheckBox6_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
    Private Sub CheckBox7_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
    Private Sub CheckBox8_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
    Private Sub CheckBox9_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
    Private Sub CheckBox10_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
    Private Sub CheckBox11_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
    Private Sub CheckBox12_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
    Private Sub CheckBox13_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
    Private Sub CheckBox14_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
    Private Sub CheckBox15_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
     
    Private Sub CheckBox16_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
        Max10 Cancel
    End Sub
     
    Sub Max10(Annuler As MSForms.ReturnBoolean)
     
        Dim Chk As MSForms.CheckBox
        Dim I As Integer
     
        For Each Chk In Me.Controls
            If Chk.Value = True Then I = I + 1
        Next Chk
     
        If I >= 10 Then Annuler = True
     
    End Sub

  6. #6
    Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Février 2015
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Février 2015
    Messages : 126
    Points : 65
    Points
    65
    Par défaut
    Bonjour à vous et merci pour vos réponse,

    J'ai regarder et essayé la solution de casefayere et celle-ci fonctionnait très bien dans le fichier qu'il a fourni.
    Cependant , en implantant la même chose dans mon classeur , un message d'erreur apparaît et je ne comprend pas pourquoi...
    Le voici :
    Nom : Capture.PNG
Affichages : 237
Taille : 17,2 Ko
    Cordialement,

  7. #7
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Je ne comprends pas, tu dois avoir fait une erreur, à ce stade, peux-tu envoyer un modèle simplifié avec les mêmes structures que ton fichier original ?
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  8. #8
    Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Février 2015
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Février 2015
    Messages : 126
    Points : 65
    Points
    65
    Par défaut
    Je ne comprend pas non plus ..
    Le problème est toujours présent.. à noter que mon userform concerné est le 5 !
    Voici le fichier : CheckBox.xlsm
    Merci de ton aide !

  9. #9
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    j'ai vu le problème que je n'avais pas prévu, tu possèdes d'autres contrôles, donc, changes cette procédure dans le module de classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Option Explicit
     
    Public WithEvents groupeCheckBox As MSForms.CheckBox
     
    Private Sub groupeCheckBox_Click()
      Nb = 0
      For Each Ctrl In UserForm5.Controls
        If TypeOf Ctrl Is MSForms.CheckBox Then
          If Ctrl = True Then
            Nb = Nb + 1
            If Nb > 10 Then MsgBox "Limité à 10": UserForm5.ActiveControl = False
          End If
        End If
      Next
    End Sub
    j'ai également amélioré les codes pour être sur que le groupe s'alimente bien (pas obligatoire)
    dans le module standart, ajoutes cette procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub ini()
      Set Collect = New Collection
      With UserForm5
        For Each Ctrl In .Controls
          'verifie s'il s'agit d'un CheckBox
          If TypeOf Ctrl Is MSForms.CheckBox Then
            Set Cl = New C_CheckBox
            Set Cl.groupeCheckBox = Ctrl
            Collect.Add Cl
          End If
        Next Ctrl
      End With
     
    End Sub
    et le code de l'Usf (Initialize) devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private Sub UserForm_initialize()
    Dim Cl         As C_CheckBox
      ini
      TextBox1 = "Purge des pompes "
      TextBox13 = "Contrôles électriques (tension et protection)"
      TextBox3 = "Essai de la sécurité manque d'eau"
      TextBox4 = "Démarrage automatique et arrêt sur débit nul"
      TextBox5 = "Permutation des pompes"
      TextBox6 = "Etalonnage du vase"
      TextBox7 = "Vérification compresseur"
      TextBox8 = "Vérification vanne de décharge"
      TextBox9 = "Vérification remplissage= "
      TextBox10 = "Contrôle volume utile de la fosse de relevage"
      TextBox11 = "Installation de la sécurité manque d’eau"
      TextBox12 = "Vérification de la pression aux points de puisage"
      TextBox2 = " Purge pompe"
      TextBox14 = "Contrôle sens de rotation des pompes"
      TextBox15 = "Alignement réalisé"
      TextBox16 = "Valiation du point de fonctionnement"
    End Sub
    tu ajoutes dans "Activate"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Activate()
    ini
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  10. #10
    Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Février 2015
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Février 2015
    Messages : 126
    Points : 65
    Points
    65
    Par défaut
    Yes !! Ça marche !
    Merci beaucoup de m'avoir aidé et pris du temps pour mon problème !

    Codrialement,
    Patouillou

  11. #11
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    je t'améliore encore quelques points, et si tu es satisfait, penses aux contributeurs en bas des messages

    je te tiens au courant
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  12. #12
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    ta procédure "Initialize" peut devenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub UserForm_initialize()
    Dim LaListe, x As Integer
    ini
    LaListe = Array("Purge des pompes ", " Purge pompe", "Essai de la sécurité manque d'eau", "Démarrage automatique et arrêt sur débit nul", _
      "Permutation des pompes", "Etalonnage du vase", "Vérification compresseur", "Vérification vanne de décharge", _
      "Vérification remplissage= ", "Contrôle volume utile de la fosse de relevage", "Installation de la sécurité manque d’eau", _
      "Vérification de la pression aux points de puisage", "Contrôles électriques (tension et protection)", "Contrôle sens de rotation des pompes", _
      "Alignement réalisé", "Valiation du point de fonctionnement")
     
      For x = 1 To 16
          Me.Controls("TextBox" & x) = LaListe(x - 1)
      Next x
    End Sub
    j'ai mal placé cette déclaration, remets-là dans le module standart
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub ini()
    Dim Cl As C_CheckBox
      Set Collect = New Collection
      With UserForm5
        For Each Ctrl In .Controls
          'verifie s'il s'agit d'un CheckBox
          If TypeOf Ctrl Is MSForms.CheckBox Then
            Set Cl = New C_CheckBox
            Set Cl.groupeCheckBox = Ctrl
            Collect.Add Cl
          End If
        Next Ctrl
      End With
     
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Limiter le nombre de checkbox cochés
    Par aertys dans le forum VB.NET
    Réponses: 4
    Dernier message: 01/06/2013, 18h14
  2. [XL-2010] Limiter nombre de checkbox possibles
    Par ced285 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/02/2013, 13h53
  3. [XL-2003] Limitation du nombre de checkbox cliquées
    Par FFGUY dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 15/06/2009, 23h15
  4. Fonction pour limiter le nombre de checkboxes cochees
    Par nabab dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 25/07/2007, 20h24
  5. Réponses: 9
    Dernier message: 23/06/2006, 17h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo