utilisation de boutons

Jacques87

XLDnaute Accro
Bonjour à toutes et à tous

J'ai créer un userform qui doit recevoir des 'Commandbutton' .
Pour créer ces boutons, comme leur nombre varie selon la situation, je n'ai pas utilisé la boite à outils, mais je les construis par le biais d'un bout de code.
Maintenant je voudrais les utiliser pour déclencher des évènements (cf : Private Sub CommandButton_Click()).
Petit problème : selon le code que j'ai écrit, après avoir cliqué sur le bouton de mon choix, il faut de plus que je clique hors des boutons pour que l'évènement soit déclenché.

Je ne vois pas comment faire autrement

si l'un d'entre vous a une idée lumineuse, je suis preneur

Merci et bon wek-end à toutes et à tous [file name=boutons_20060218104811.zip size=14681]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/boutons_20060218104811.zip[/file]
 

dg62

XLDnaute Barbatruc
Bonjour Jacques


une piste !

est-il possible de créer des procédures dynamiquement ?

Code:
Private Sub UserForm_Initialize()
    Dim I As Integer, derlign As Integer
     Dim nbouton As Integer
     nbouton = 8
    For I = 1 To nbouton

        Set boutoncontrol = Resultats.Controls.Add('Forms.CommandButton.1', 'bouton' & I)
        boutoncontrol.TakeFocusOnClick = True
        boutoncontrol.Left = 550
        boutoncontrol.Top = 50 + 20 * I
        boutoncontrol.Width = 15
        boutoncontrol.Height = 15
        boutoncontrol.Name = 'bouton' & I
        boutoncontrol.BackColor = &HC0C0C0
        
    texte = 'Sub CommandBouton' & I & '_Click()' & vbCrLf
    texte = texte & 'MsgBox (' & 'Bouton' & I & ')' & vbCrLf
    texte = texte & 'End Sub'
    
        
Next I

End Sub

Comment faire pour insérer ces lignes dans un module ?

Message édité par: dg62, à: 18/02/2006 12:14
 

Jacques87

XLDnaute Accro
Excellente idée Didier
Tu peux toujours insérer une nouvelle macro dans un module et de plus la supprimer éventuellement (cf une réponse que j'ai donnée à un Fil, mais lequel ?).
Je vais me pencher sur la question pour adapter ceci à mon problème et te donnerai la solution si ça marche.
Toutefois si quelqu'un a une solution plus simple et plus rapide je suis toujours preneur

Didier toutes mes amitiés et au plaisir
 

justine

XLDnaute Occasionnel
bonjour le forun, jacques87, dg62
je suis peut etre a coté du sujet mais si tu connais le nbre maximum de boutons que tu peux avoir, pourquoi ne pas les implanter directement dans ta userform et les cacher/decacher en fonction du deroulement de ton application, comme ca tu as l'evenement _click.
c'est peut etre pas ce que tu cherches.
justine
 

Jacques87

XLDnaute Accro
Bonjour Justine

Le problème est bien là.
Je ne connais pas le nombre de boutons qui apparaîtront sur cet userform. Ce nombre peut varier de 1 à ??? (voir 100 dans les cas les plus défavorables).
Mon appli fonctionne très bien pour le moment, sauf que lorsque je clic sur un de ces boutons, il faut que je clic une fois de plus en dehors des boutons pour déclencher l'évènement.
Tu me diras qu'à la rigueur ce n'est qu'un problème mineur, mais j'ai un gros défaut : j'aime la perfection ...

Merci Justine et heureux de t'avoir saluée
Bises
 

dg62

XLDnaute Barbatruc
re

Avec un coup de pouce de thierry voici un code qui gnère ton USf, tes boutons et les procédures associés.
Malheureusement il y a un bug !

Quand je clique sur un bouton rien ne se passe.Pourtant la procédure semble bien écrite.

Code:
Sub essai()

nbouton = 8

Set usf = ThisWorkbook.VBProject.VBComponents.Add(3)
  With usf
    .Properties('Caption') = 'Avec l'aide de Thierry'
    .Properties('Width') = 609
    .Properties('Height') = 398
    .Properties('ShowModal') = True
    
  End With
  
  With usf.CodeModule
    X = .CountOfLines
    
    .insertlines X + 1, 'Private Sub UserForm_Initialize()'
    .insertlines X + 2, 'Dim I As Integer, derlign As Integer'
    .insertlines X + 3, 'Dim boutoncontrol As Object'
    .insertlines X + 4, 'Dim nbouton As Integer'
    .insertlines X + 5, 'nbouton = 8'
    .insertlines X + 6, 'For I = 1 To nbouton'

        .insertlines X + 7, 'Set boutoncontrol = Userform1.Controls.Add(' & Chr(34) & 'Forms.CommandButton.1' & Chr(34) & ',' & Chr(34) & 'bouton' & Chr(34) & '& I)'
       .insertlines X + 8, 'boutoncontrol.TakeFocusOnClick = True'
        .insertlines X + 9, 'boutoncontrol.Left = 550'
        .insertlines X + 10, 'boutoncontrol.Top = 50 + 20 * I'
        .insertlines X + 11, 'boutoncontrol.Width = 15'
        .insertlines X + 12, 'boutoncontrol.Height = 15'
        .insertlines X + 13, 'boutoncontrol.Name =' & Chr(34) & 'bouton' & Chr(34) & '& I'
        
        .insertlines X + 14, 'boutoncontrol.BackColor = &HC0C0C0'
              
        .insertlines X + 15, 'Next I'

        .insertlines X + 16, 'End Sub'

End With
With usf.CodeModule
    
    
    For I = 1 To nbouton
    X = .CountOfLines
    .insertlines X + 1, 'private Sub Bouton' & I & '_click()'
    .insertlines X + 2, 'Msgbox(' & Chr(34) & 'Bouton ' & Chr(34) & '& i)'
    .insertlines X + 3, 'End Sub'
    Next I
End With

End Sub


Lancer la procédure et regarder le code généré au niveau du USF.
code généré par la procédure. Trouvez le bug !

Code:
Private Sub UserForm_Initialize()
Dim I As Integer, derlign As Integer
Dim boutoncontrol As Object
Dim nbouton As Integer
nbouton = 8
For I = 1 To nbouton
Set boutoncontrol = UserForm1.Controls.Add('Forms.CommandButton.1', 'bouton' & I)
boutoncontrol.TakeFocusOnClick = True
boutoncontrol.Left = 550
boutoncontrol.Top = 50 + 20 * I
boutoncontrol.Width = 15
boutoncontrol.Height = 15
boutoncontrol.Name = 'bouton' & I
boutoncontrol.BackColor = &HC0C0C0
Next I
End Sub
Private Sub Bouton1_click()
MsgBox ('Bouton ' & I)
End Sub
Private Sub Bouton2_click()
MsgBox ('Bouton ' & I)
End Sub
Private Sub Bouton3_click()
MsgBox ('Bouton ' & I)
End Sub
Private Sub Bouton4_click()
MsgBox ('Bouton ' & I)
End Sub
Private Sub Bouton5_click()
MsgBox ('Bouton ' & I)
End Sub
Private Sub Bouton6_click()
MsgBox ('Bouton ' & I)
End Sub
Private Sub Bouton7_click()
MsgBox ('Bouton ' & I)
End Sub
Private Sub Bouton8_click()
MsgBox ('Bouton ' & I)
End Sub

Message édité par: dg62, à: 18/02/2006 16:20

Message édité par: dg62, à: 18/02/2006 16:24
 

Jacques87

XLDnaute Accro
La procédure que Thierry t'a donnée est bien celle que je pensais utiliser suite à ton idée lumineuse de tout à l'heure.
N'ayant pas beaucoup de temps ce week-end je ne m'étais pas donné le temps de la construire. voila qui est fait
Toutefois je constate comme tu le dis que je me retrouve devant la même situation qu'avant : les boutons créés ne sont pas actifs
Je regarderai lundi

Encore merci et bon dimanche
 

dg62

XLDnaute Barbatruc
Bonjour Jacques, Le forum


Voilà, ça marche !

Maintenant tout est généré à la volée et l'action click sur les boutons est bien interceptée.
Il ne reste plus qu'a l'adapter à ton problème.

Code:
Sub GenereUSF()
' ce code génère le Userform et des boutons
' et le code qui permet l'interception des evenements

nbouton = 8 ' Nombre de boutons à créer
' Génération du USF

Set usf = ThisWorkbook.VBProject.VBComponents.Add(3)
  With usf
    .Properties('Caption') = 'Avec l'aide de Thierry'
    .Properties('Width') = 609
    .Properties('Height') = 398
    .Properties('ShowModal') = True
    
  End With
    
  ' déclarations permettant l'interception des évenements
  With usf.CodeModule
  For I = 1 To nbouton
   X = .CountOfLines
 .insertlines X + 1, 'Private WithEvents ' & 'Bouton' & I & ' As MSForms.CommandButton'
   
   Next I
   
 End With
 
' Génération du module d'initialisation du USF

With usf.CodeModule
    X = .CountOfLines
    .insertlines X + 1, 'Sub UserForm_Initialize()'
    For I = 1 To nbouton
    X = .CountOfLines
    
    '.insertlines X + 1, 'Sub CommandButton' & I & '_click()'
    .insertlines X + 2, 'Set ' & 'bouton' & I & '= Userform1.Controls.Add(' & Chr(34) & 'Forms.CommandButton.1' & Chr(34) & ',' & Chr(34) & 'Bouton' & I & Chr(34) & ', True)'
    .insertlines X + 3, 'bouton' & I & '.Left = 550'
    .insertlines X + 4, 'bouton' & I & '.Top = 50 + 20 * ' & I
    .insertlines X + 5, 'bouton' & I & '.Width = 15'
    .insertlines X + 6, 'bouton' & I & '.Height = 15'
    .insertlines X + 7, 'bouton' & I & '.Name =' & Chr(34) & 'Bouton' & I & Chr(34)
    .insertlines X + 8, 'bouton' & I & '.BackColor = &HC0C0C0'
       
    Next I
    X = .CountOfLines
    .insertlines X + 1, 'End Sub'
    
    ' Génération des sub commandButton_click()
    For I = 1 To nbouton
    X = .CountOfLines
    .insertlines X + 1, 'Sub Bouton' & I & '_click()'
    .insertlines X + 2, 'Msgbox(' & Chr(34) & 'Bouton' & I & Chr(34) & ')'
    .insertlines X + 3, 'End Sub'
    Next I
End With

End Sub
 

dg62

XLDnaute Barbatruc
re

voilà le fichier [file name=jacques.zip size=17447]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/jacques.zip[/file]
 

Pièces jointes

  • jacques.zip
    17 KB · Affichages: 17
  • jacques.zip
    17 KB · Affichages: 21
  • jacques.zip
    17 KB · Affichages: 63

Hervé

XLDnaute Barbatruc
bonjour justine, jacques, didie, le monde

Sinon, une autre possibilité en passant par un module de classe.

salut [file name=boutons_20060219164059.zip size=16459]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/boutons_20060219164059.zip[/file]


edition : oups désolé didier, j'avais pas vu que c'etait déjà ce que tu avais proposé. :unsure:

Message édité par: hervé, à: 19/02/2006 16:45
 

Pièces jointes

  • boutons_20060219164059.zip
    16.1 KB · Affichages: 25

Jacques87

XLDnaute Accro
Bonsoir Didier, bonsoir Hervé, bonsoir tout le monde

Je rentre d'un week-end agréable et bien occupé et avant de me coucher je me suis dit : 'un petit coup d'oeil sur ma boite ...'
Alors là, Didier et Hervé je ne sais plus que dire ... quelle agréable surprise.
Bien que ce problème n'était pas crucial pour mon projet (car il marchait malgré un petit défaut), vous avez satisfait ma curiosité et avec quel brio !!
BRAVO et MERCI
je vais étudier chacune de vos propositions à tête reposée demain, car il est vrai qu'un repas de famille étant par définition arrosé (attention sans abus, évidemment), je préfère voir cela demain.

Je vous tiendrai au courant et encore merci à tous les deux.

Amitiés
 

Jacques87

XLDnaute Accro
Bonjour Didier, Bonjour Hervé

J'ai pris le temps d'étudier vos codes.
Didier, je crois que tu es d'accord avec moi, la méthode utilisée par Hervé qui consiste à créer au travers d'un module de classe une nouvelle collection d'objets et surtout de reconstruire pour ces objets des procédures évenementielles est des plus subtiles.
N'ayant jamais eu seul l'idée d'utiliser un module de classe, Hervé, tu viens de m'ouvrir de nouveaux horizons.
Hervé, seule petite question qui me tracasse :
dans ton profil tu dis 'VBA, qu'est-ce c'est ?'
veux-tu quelques leçons ? (lol)
Encore merci à tous les deux et veuillez recevoir toute mon amitié tant que je peux encore le faire (car d'ici un mois fini XLD car sans ADSL ....)
Jacques
 

Discussions similaires