Affecter une commande a un controle non visible dans VBE (Macro VBA)

MartiFab

XLDnaute Nouveau
Bonjour à tous !

Mon Problème:
Je cherche à créer un bouton de commande sur un userform en passant par Private Sub Userform_Initialize(). Pour cela j’utilise un code semblable au suivant, appliqué à la UserForm1:

Code:
Private sub UserForm_Initialize()

Dim btnCmd as Control

Set btnCmd = Me.Controls.Add(“forms.commandButton.1”)

With btnCmd
	.Top = 20
	.Left = 20
	.Name = “btnNext”
	.Caption = “See second usf”
End With

End Sub

Une fois ce contrôle créé, je souhaiterais lui affecter une procédure afin d’afficher une nouvelle userform consécutivement à un clique de souris sur le bouton (type Private Sub btnName_Click()).

J’ai donc essayé de placer le code suivant a la suite du précédent :

Code:
Private Sub btnName_Click()
	UserForm2.show
End Sub

Malheureusement, cela ne fonctionne pas. Le bouton est bien créer mais rien ne se passe lorsque l'on clique dessus.

Vous trouverez en pièce jointe un exemple de ce que j’explique précédemment.

Lorsque l'on se trouve dans Visual Basic Editor et que l'on place un contrôle sur une userform sans recourir à une macro, on doit double-cliquer ce contrôle pour lui affecter du code. Dans mon cas, je ne peux pas double-cliquer le contrôle dans VBE car il n'existe pas avant que la macro soit lancée.

Ma Question:
Existe-t-il un moyen d'affecter une commande a un contrôle sans pouvoir pré-visualiser ce contrôle dans Visual Basic Editor et le double-cliquer?

Si certains d'entre vous ont des suggestions, elles seront les bienvenues.

Merci a tous !

(Note : J’ai créé les deux userforms en passant par visual basic editor. Insert > Userform.)
 

Pièces jointes

  • ExempleMartiFab.xlsm
    19.1 KB · Affichages: 57

Dranreb

XLDnaute Barbatruc
Re : Affecter une commande a un controle non visible dans VBE (Macro VBA)

Bonjour.
Pourquoi diable ne définissez vous pas ce bouton une bonne fois pour toutes ?
Si c'est parce que dans le vrai contexte ce bouton ne doit pas toujours apparaître, jouez sur sa propriété Visible !
Cordialement.
 

Softmama

XLDnaute Accro
Re : Affecter une commande a un controle non visible dans VBE (Macro VBA)

Bonjour,

Quel est ton niveau en VBA ? Parce que, à la lecture rapide de ton code, tu sais déjà créer de façon dynamique dans un USF des contrôles, ce qui est déjà pas mal... Si tu as un niveau assez conséquent je te conseille de gérer ceci avec un module de classe qui réagit au contrôle btnName ou BtnNext (j'ai pas trop compris).

Si mon conseil est du chinois, je te joindrai un exemple pour t'aider à assimiler le truc... Mais c'est pas forcément simple à appréhender au début.

EDIT : La remarque de Dranreb me paraît parfaitement fondée !
 

MartiFab

XLDnaute Nouveau
Re : Affecter une commande a un controle non visible dans VBE (Macro VBA)

Bonjour Dranreb, Softmama,

Tout d'abord merci de vos réponses. Je pourrais évidemment jouer sur la propriété Visible du contrôle comme suggéré par Dranreb. Mais j'ai simplifié au maximum ce problème. Je créé en fait des userforms bien plus complexes, dans lesquels un nombre variable de bouton de commande est créé. Je peux en avoir 3 comme 25 !
Pour cette raison l'approche que Softmama me propose semble séduisante. Je pense avoir un niveau débutant-intermédiaire en VBA. Mais je suis très désireux d'apprendre :) J'apprécierais grandement si tu pouvais effectivement me transmettre un fichier exemple.

Et autant pour moi. Une erreur s'est glissée dans le code de mon précédent message. Dans le deuxième morceau de code, il s'agit bien de:
Code:
Private Sub btnNext_Click()
           UserForm2.Show
End Sub

Merci Beaucoup
 

Softmama

XLDnaute Accro
Re : Affecter une commande a un controle non visible dans VBE (Macro VBA)

Re,

Je te joins un fichier exemple qui devrait à peu près ressembler à ce que tu souhaites faire (d'après ce que j'ai compris de tes besoins). Reproduis-le à l'envi jusqu'à ce que tu saches le refaire seul :) Pour info, j'ai nommé les boutons créés créé+n°, adapte à tes noms de boutons.
 

Pièces jointes

  • ModuleClasse Bouton2.xls
    52 KB · Affichages: 85

MartiFab

XLDnaute Nouveau
Re : Affecter une commande a un controle non visible dans VBE (Macro VBA)

Softmama,

Merci beaucoup pour ta réponse. A première vue c'est exactement ce qu'il me fallait. Je vais me pencher sur ton exemple afin de bien comprendre tout ce qui se passe. Suivant tes conseils j'ai commence a me renseigner sur les modules de classe, il me faut absolument mieux comprendre cela pour améliorer mon niveau en VBA et progresser dans la difficulte de mes macros. C'est je crois un très bon exercice pour y parvenir.

Je n’hésiterai pas a poster sur cette discussion si je rencontre quelques difficultés.

Encore une fois merci beaucoup

Bonne après-midi a toi
 

MartiFab

XLDnaute Nouveau
Re : Affecter une commande a un controle non visible dans VBE (Macro VBA)

Salut Softmama,

J’ai eu le temps d’apprendre un peu au sujet des modules de classes dans VBA. Je te remercie encore du fichier que tu m’as fait parvenir. Je me suis plongé dedans et j’ai bien compris comment ton code était organisé.

J’aurais cependant deux questions. Elles sont probablement très simples.

1° - Tu définis un objet « c » qui est de type Range. Tu lui donnes une valeur initiale en utilisant :

Code:
Set c = Range(« A1 »)

Jusque là tout va bien. Ma question concerne la ligne :

Code:
Set c = c(2,1)

Pourrais-tu définir clairement ce que signifie cette instruction ? Je pense avoir compris, mais je préfèrerais m’assurer du sens de cette ligne.

2° - La toute première ligne de code de UserForm1 consiste-t-elle bien à déclarer un tableau d’objets de nom MesObjetsBoutons comme instance de la Classe1 ?

Si oui, je suppose que le morceau de code :

Code:
Redim Preserve MesObjetsBoutons(0 To I)
Set MesObjetsBoutons(I).MonBouton = Controle
I= I+1

Ce morceau de code donc, permet de placer un objet MonBouton dans le tableau d’objets MesObjetsBoutons à la position I (et ce si la condition nom du contrôle commence par « Créé » est respectée). Ce tableau d’objets étant une instance de la Classe1, chaque MonBouton présent dans le tableau hérite de la propriété que tu as définie dans la Classe1. Est-ce bien cela?

Encore une fois merci pour ton aide. A bientôt
 

Softmama

XLDnaute Accro
Re : Affecter une commande a un controle non visible dans VBE (Macro VBA)

Bonjour,

Pour le 1°) :

Cette notation se comprend ainsi :
Set c=c(2,1) équivaut à Set c = c.Offset(1,0)
Set c=c(1,1) équivaut à Set c = c
Set c=c(0,1) équivaut à Set c = c.Offset(-1,0)
Set c=c(2,2) équivaut à Set c = c.Offset(1,1)
soit définir la plage c, comme la même plage décalée d'un nombre de lignes ou de colonnes.

Pour le 2°):
Tu as parfaitement compris et défini ce morceau de code.
 

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 107
Membres
103 120
dernier inscrit
83400ren