Détection d'une action sur un contrôle quelconque

Bonjour à tous.

J'ai des Userfom sur lesquels il y a jusqu'à 120 OptionButton et 120 ToggleButton, placés en 2x5 colonnes. J'ai ajouté des CheckBox sur chaque colonne pour sélectionner ou désélectionner d'un seul clic toute la colonne.

Dès qu'un élément d'une des colonnes est modifié, je voudrais que la colonne soit vérifiée et que :

  • si TOUS les OptionButton ou TOUS Les ToggleButton sont activés la CheckBox correspondante soit cochée
  • si UN SEUL des OptionButton ou UN SEUL des ToggleButton est désactivés la CheckBox correspondante soit décochée.

J'ai fait la boucle de contrôle qui met à jour la CheckBox mais je ne vois pas comment la déclencher. J'ai pas spécialement envie de créer un Private Sub pour chaque OptionButton ou ToggleButton pour la lancer quand ils sont cliqués.

Si quelqu'un a une solution pour lancer une routine quelque soit le contrôle cliqué, je prends.

Merci d'avance.

Manu

Bonjour,

Faire une recherche sur "module de classe" ou fournir le fichier KIVABIEN avec

A+

Bonjour,

Un exemple très simple sur une seule colonne de cases à cocher (16 dans mon exemple) et une case à cocher en entête :

A mettre dans le module de la Form :

Dim Chk() As New Classe1

Private Sub UserForm_Initialize()

    Dim Ctrl As Control
    Dim I As Integer

    For Each Ctrl In Me.Controls

        If TypeName(Ctrl) = "CheckBox" Then

            I = I + 1
            ReDim Preserve Chk(1 To I)
            Set Chk(I).GroupeChk = Ctrl

        End If

    Next Ctrl

End Sub

A mettre dans un module standard (la Form s'appelle UserForm1) :

Sub Comptage()

    Dim Ctrl As Control
    Dim I As Integer

    For Each Ctrl In UserForm1.Controls

        If TypeName(Ctrl) = "CheckBox" Then

            If Ctrl.Name <> "ChkEntete" Then
                If Ctrl.Value = True Then I = I + 1
            End If

        End If

    Next Ctrl

    If I = 16 Then
        UserForm1.ChkEntete.Value = True
    Else
        UserForm1.ChkEntete.Value = False
    End If

End Sub

et dans un module de classe nommé Classe1 :

Public WithEvents GroupeChk As MSForms.CheckBox

Private Sub GroupeChk_Click()

    Comptage

End Sub

Merci de ces réponses.

Je suis quand même un peu surpris qu'il n'existe pas de commande tout prête pour ce genre d'action.

Pour préciser un peu les choses les OptionButton ou les ToggleButton sur lesquels je veux faire ce test sont systématiquement dans un Frame.

Est ce qu'il n'est pas possible de lancer la routine de contrôle de tous les OptionButton ou ToggleButton du Frame quand il y a un changement au niveau de ce Frame ?

Je vous met le fichier. Pour l'alléger et pouvoir le mettre, j'ai conservé que le UserForm 14 mais il y en a une dizaine qui sont concernés.

Merci d'avance

Manu

Bonjour,

C'est précisément à cela que les modules de classe sont destinés.

1 - Tu ne peux coder la totalité de tes boutons individuellement : Tu aboutirais rapidement à un problème de mémoire...

2 - Il faut une routine qui soit capable de discerner quel bouton à été traité (à l'aide d'un paramètre) sinon tu es obligé de coder pour chaque bouton et on reviens au cas N°1

3 - La méthode qui permet de coder de cette manière s'appelle Module de Classe.

A+

Bonjour,

A mettre en tête de module de la Form (UserForm14) :

Dim Opt_RAS() As New Classe1
Dim Opt_ES() As New Classe1
Dim Opt_Reporter() As New Classe1
Dim Opt_Annuler() As New Classe1

Public Max_RAS As Integer
Public Max_ES As Integer
Public Max_Reporter As Integer
Public Max_Annuler As Integer

A mettre en début de procédure Initialize de la Form ("Private Sub UserForm_Initialize()") :

Dim Ctrl As Control
Dim I As Integer
Dim J As Integer
Dim K As Integer
Dim L As Integer

'stocke dans les tableaux correspondants
For Each Ctrl In Me.Controls

    If TypeName(Ctrl) = "OptionButton" Then

        If Ctrl.Caption = "RAS" Then
            I = I + 1
            ReDim Preserve Opt_RAS(1 To I)
            Set Opt_RAS(I).GroupeOpt = Ctrl
        End If

        If Ctrl.Caption = "E/S" Then
            J = J + 1
            ReDim Preserve Opt_ES(1 To J)
            Set Opt_ES(J).GroupeOpt = Ctrl
        End If

        If Ctrl.Caption = "Reporté" Then
            K = K + 1
            ReDim Preserve Opt_Reporter(1 To K)
            Set Opt_Reporter(K).GroupeOpt = Ctrl
        End If

        If Ctrl.Caption = "Annulé" Then
            L = L + 1
            ReDim Preserve Opt_Annuler(1 To L)
            Set Opt_Annuler(L).GroupeOpt = Ctrl
        End If

    End If

Next Ctrl

'mémorise le nombre maximal de boutons d'option de chaque colonne
'pour une utilisation dans le module standard...
Max_RAS = UBound(Opt_RAS)
Max_ES = UBound(Opt_ES)
Max_Reporter = UBound(Opt_Reporter)
Max_Annuler = UBound(Opt_Annuler)

'ICI LA SUITE DU CODE INITIALIZE...
'...
'...

A mettre dans un module standard (un nouveau ou un déjà existant) :

Sub ComptageCheckBox()

    Dim Ctrl As Control
    Dim I As Integer
    Dim J As Integer
    Dim K As Integer
    Dim L As Integer

    For Each Ctrl In UserForm14.Controls

        If TypeName(Ctrl) = "OptionButton" Then

            If Ctrl.Caption = "RAS" Then

                If Ctrl.Value = True Then I = I + 1

            End If

            If Ctrl.Caption = "E/S" Then

                If Ctrl.Value = True Then J = J + 1

            End If

            If Ctrl.Caption = "Reporté" Then

                If Ctrl.Value = True Then K = K + 1

            End If

            If Ctrl.Caption = "Annulé" Then

                If Ctrl.Value = True Then L = L + 1

            End If

        End If

    Next Ctrl

    UserForm14.CheckBox1.Value = I = UserForm14.Max_RAS
    UserForm14.CheckBox2.Value = J = UserForm14.Max_ES
    UserForm14.CheckBox3.Value = K = UserForm14.Max_Reporter
    UserForm14.CheckBox4.Value = L = UserForm14.Max_Annuler

End Sub

Attention, je n'ai pas géré les boutons d'option désactivés car je n'ai pas cherché dans ton code la raison de leurs activation/désactivation. Donc, pour tester, il te faut activer tous les boutons d'option. Après avoir testé, si le résultat te conviens, à toi d'adapter en fonction des boutons d'option activés.

Il ne te reste plus qu'à faire pareil pour les ToggleButton (tu peux utiliser le même module de classe) donc voici le code à mettre dans le module de classe :

Public WithEvents GroupeOpt As MSForms.OptionButton
Public WithEvents GroupeTgb As MSForms.ToggleButton

Private Sub GroupeOpt_Click()

    ComptageCheckBox

End Sub

Private Sub GroupeTgb_Click()

    ComptageToggleButton

End Sub

Merci de cette réponse.

Je vais prendre ça à tête reposée pour comprendre comment ça marche, je vais intégrer les boutons désactivés et je vais le mettre sur tous mes UserForm.

J'arrive au bout de mon projet. Pour un coup d'essai, j'aurais pas pris le plus facile.

Manu

Rechercher des sujets similaires à "detection action controle quelconque"