Affecter une macro à tous les commandbutton

Bonjour le forum,

J'ai créé un Userform (Userform1) qui contient 42 CommandButton nommés "commandbutton1", "commandbutton2", "commandbutton3", etc.

Chacun des CommandButton a une caption différente et se trouve dans une frame nommée Frm1

A chaque fois que je clique sur l'un de ces boutons, je souhaiterais qu'il inscrive sa caption dans une textbox, nommée textbox1.

Pour l'instant chaque bouton contient un code personnalisé:

Sub CommandButton1_click()
textbox1.value = CommandButton1.value
End sub

Je voudrais éviter de coder chaque bouton et je cherche un code général qui s'appliquerait à tous les boutons.

Merci de votre aide et de vos conseils.

Bonjour

affecte à tous les boutons la même procédure comme dans l'exemple joint

Bonjour,

Pour avoir une procédure événementielle commune, il te faut utiliser un module de classe donc, ajoutes en un à ton projet !

Code à mettre dans le module de l'UserForm :

Dim Tbl() As New Classe1

Private Sub UserForm_Initialize()

    Dim Ctrl As Control
    Dim I As Integer

    For Each Ctrl In Me.Controls

        If TypeName(Ctrl) = "CommandButton" Then

            I = I + 1: ReDim Preserve Tbl(1 To I)
            Set Tbl(I).GroupeBtn = Ctrl
            Set Tbl(I).Txt = TextBox1 'de façon à respecter l'encapsulage

        End If

    Next Ctrl

End Sub

Code à mettre dans le module de classe nommé "Classe1" (nom donné par défaut à l'ajout dans le projet) :

Public WithEvents GroupeBtn As MSForms.CommandButton
Public Txt As MSForms.TextBox

Private Sub Groupebtn_Click()

    Txt.Text = GroupeBtn.Caption

End Sub

Bonjour et merci pour vos réponse.

Une question pour Theze : à quoi sert le code dans le Userform_initialize ?

Car je souhaiterais ne pas y mettre de code.

Est-ce possible ?

Comme le compilateur n'a pas de boule de cristal, il faut bien lui dire d'instancier la classe pour chaque bouton !

Maintenant, si tu veux minimiser les lignes de code dans le module de l'UserForm, tu peux ajouter un module standard, mettre la procédure d'instanciation dans ce module et appeler la Sub depuis Initialize() de l'UserForm mais ça n'a pas vraiment d'intérêt à mon sens et de toute façon, tu ne peux pas éviter du code dans le module de l'UserForm :

Dans le module standard :

Public Tbl() As New Classe1

Sub Ini(UF As Object)

    Dim Ctrl As Control
    Dim I As Integer

    Erase Tbl() 'comme ici il est de "durée" Classeur, il faut le vider

    For Each Ctrl In UF.Controls

        If TypeName(Ctrl) = "CommandButton" Then

            I = I + 1: ReDim Preserve Tbl(1 To I)
            Set Tbl(I).GroupeBtn = Ctrl
            Set Tbl(I).Txt = UF.TextBox1

        End If

    Next Ctrl

End Sub

Dans le module de l'UserForm :

Private Sub UserForm_Initialize()

    Ini Me

End Sub

Merci beaucoup pour les explications, c'est plus clair maintenant !!

Je vais tester tout ça !

Bonjour,

Une 3ème proposition toujours avec un module de classe (exemple : CmdButton) mais avec la gestion de l'évènement "Clic" dans le UserForm, avec la procédure suivante :

1- créer un évènement "Clic" dans cette classe ,

2- créer par bouton 1 élément de la classe CmdButton,

3- ajouter dans votre UserForm l'événement "Clic" de cette classe.

62classeur1.xlsm (27.45 Ko)

De toute façon, quelle que soit la manière de procéder, du code est inévitable dans le module de l'UserForm !

De toute façon, quelle que soit la manière de procéder, du code est inévitable dans le module de l'UserForm !

Bien sûr.

Il faut y créer tous les éléments (appelés instances) de la classe du module et y référencer l'événement "Clic" défini pour cette classe.

Theze, thev,

tout ceci me parait bien complexe ! mais je ne suis pas spécisliste des userform ...

ne suffit-il pas d'adapter juste ceci pour les boutons d'un userform :

Private Sub bouton_xxx_Click()
    executer userform1.ActiveControl
    Me.Hide
End Sub

et, à titre d'exemple pour le traitement du texte du bouton dans une procédure générique

Sub executer(bouton)
    MsgBox bouton.Caption
End Sub

Bonsoir Steelson,

C'est bien une solution d'avoir une procédure standard pour la recopie de la propriété Caption des CommandButtons. Ce qui résout une partie du problème. Car sans module de classe, il faut dupliquer 42 fois l'appel à cette procédure dans les procédures événementielles correspondant à chaque bouton.

De toute façon, quelle que soit la manière de procéder, du code est inévitable dans le module de l'UserForm !

Bonjour,

Hum... Ce n'est pas tout à fait exact : dans l'exemple joint le USF ne contient aucun code...

Il suffit d'instancier les objets du USF dans la classe avant de lancer le USF et basta !

A+

53classe-cmdbusf.zip (13.35 Ko)

Bonjour,

Effectivement, je n'y avais pas pensé comme quoi les habitudes !!

Bonsoir,

Pour répondre à la remarque de Galopin, on peut simplifier le code dans le UserForm en stockant directement l'instance de la classe non plus dans une collection ou un tableau, mais directement dans une variable de cette instance.

Cela dit, je trouve plus logique de créer les différentes instances dans le formulaire et d'y ramener un événement Clic propre à un bouton de commande.

ci-joint exemple :

58classeur2.xlsm (39.58 Ko)
Rechercher des sujets similaires à "affecter macro tous commandbutton"