Affecter un code à un bouton crée automatiquement dans USF

Signaler
Messages postés
35
Date d'inscription
jeudi 30 juin 2011
Statut
Membre
Dernière intervention
23 octobre 2018
-
MEUCORACAO
Messages postés
35
Date d'inscription
jeudi 30 juin 2011
Statut
Membre
Dernière intervention
23 octobre 2018
-
Bonjour,

Je me permets de vous contacter car je rencontre un problème dont je ne trouve réponse sur le net.

Mon programme consiste à crée des combobox, textbox et commandbutton en automatique. Et j'aimerais crée un code pour les commandbuttons crée. Cependant, je ne vois pas du tout comment le crée. J'ai trouvé un tutoriel de SilkyRoad (http://excel.developpez.com/faq/?page=OleObject#AjoutCommandButton) mais qui correspond à un code sur un feuille excel et non un userform.

Mon code est le suivant :

Private Sub UserForm_Initialize()

Dim i, j, X, Y As Integer
Dim opt As Control

X = -10

For i = 1 To Nbr_AtomesPF

'création des listes déroulantes pour les atomes et des champs texte pour les coefficients
Set opt = UserForm1.Controls.Add("Forms.ComboBox.1")
With opt
.Name = "AtomePF" & i
.RowSource = "Classification!B2:B119"
.Left = 30 + X
.Height = 20
.Width = 50
.Top = 30
.ListRows = 20
.ListWidth = 50
.Font.Bold = True
.Font.Name = "Calibri"
.Font.Size = 14
End With

X = opt.Left + opt.Width

'création des boutons "+" pour ajouter les dopants
Set opt = UserForm1.Controls.Add("Forms.CommandButton.1")
With opt
.Name = "AjDopPF" & i
.Caption = "+"
.Left = X - 35
.Height = 20
.Width = 20
.Top = 72
.Font.Name = "Times New Roman"
.Font.Size = 10
.Font.Bold = True
End With

' 'Paramètres pour la création de la macro:
' laMacro = "Sub CommandButton1_Click()" & vbCrLf
' laMacro = laMacro & "Cells.Clear" & vbCrLf
' laMacro = laMacro & "End Sub"
'
' With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
' y = .CountOfLines + 1
' .InsertLines y, laMacro
' End With

'création des zone de champ pour écrire le coefficient de l'atome
Set opt = UserForm1.Controls.Add("Forms.TextBox.1")
With opt
.Name = "CoefPF" & i
.Left = X
.Height = 20
.Top = 48
.AutoSize = True
.Font.Name = "Times New Roman"
.Font.Size = 12
End With

Next i

UserForm1.Height = 165
UserForm1.Width = X + 35

bool = True

End Sub


Mon code à ajouter dans mon bouton serait un code qui crée une nouvelle combobox et une nouvelle textbox. Vous pensez que c'est possible?

Je vous remercie par avance pour votre aide précieuse. N'hésitez pas si il manque des précisions car je m'y penche dpeuis longtemps donc j'ai pu oublié quelques détails importants.

Bonne journée,

Anthony

6 réponses

Messages postés
12262
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
5 mars 2020
11
Bonjour,

A titre perso, pour ton cas, j'utiliserais des modules de classe, un pour chaque type de contrôle.

Un exemple valant parfois mieux...

1- ouvre un nouveau classeur excel,
2- Insère :
=> 1 UserForm
=> 1 Module
=> 1 Module de Classe (Classe1)

3- Les codes :
de l'userform :
Private Sub UserForm_Initialize()
Dim Wsh As Worksheet, Ind As Integer
Dim monBouton As Object
Ind = 1
For Each Wsh In ThisWorkbook.Worksheets
  ReDim Preserve MesBoutons(1 To Ind)
      Set monBouton = Me.Controls.Add("Forms.CommandButton.1", "Btn" & Ind, True)
      With monBouton
       .Name = "Bouton " & Ind
       .Caption = Ind
       .Move Ind * 50, 0, 50, 50
       Set MesBoutons(Ind).BoutonEvents = monBouton
     End With
  Set monBouton = Nothing
  Ind = Ind + 1
Next Wsh
Me.Width = Ind * 50 + 50
End Sub


Du module :
Public MesBoutons() As New Classe1


Du module de classe :
Public WithEvents BoutonEvents As MSForms.CommandButton

Private Sub BoutonEvents_Click()
  MsgBox BoutonEvents.Name
End Sub


Teste en lançant l'userform et en cliquant sur les boutons...
pijaku
Messages postés
12262
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
5 mars 2020
11
re-
Je me suis rendu compte que cette méthode n'est peut être pas super adaptée à ton cas...
En effet, dans ce code, tous les boutons font la même action. Ce n'est sans doute pas ton cas...
Messages postés
35
Date d'inscription
jeudi 30 juin 2011
Statut
Membre
Dernière intervention
23 octobre 2018

Salut Pijaku,

Merci pour ta réponse claire. J'ai essayé ton exemple et il marche parfaitement. Je vais essayé de l'adapter à mon cas. Les boutons doivent agrandir l'userform, rajouter une combobox et une textbox mais pas au même endroit.

Imaginons trois comboxbox alignée sur la même ligne. Les boutons sont placés en dessous de chaque combobox. Lorsque que je clique sur un bouton, je souhaite ajouter une combobox en dessous de celle où est situé le bouton (en ligne 2) tout en déplaçant le bouton vers le bas pour éventuellement rajouter d'autre lignes. Faire cela pour chaque bouton.

Penses-tu cela faisable avec les modules de classe?
Merci encore pour ton aide,
pijaku
Messages postés
12262
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
5 mars 2020
11
Oui c'est très faisable.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Bonjour,
1) on ne voit nulle part où est comment a été initialisée la variable Nbr_AtomesPF, qui apparait dans l'évènement initiatialize .
Il faut alors croire qu'il s'agit d'une constante ... et alors :
a) pourquoi (puisque constante) créer dynamiquement des contrôles dont on connaît d'avance le nombre ? Il suffirait de les créer en mode création habituel, non ?
b) si ce nombre est élevé, ton userform va se trouver assez encombré. Il faudra alors croire que la conception est elle-même à revoir complètement
2) (dit mille et une fois) Dim i, j, X, Y As Integer ne type en Integer que la variable Y (toutes les autres étant des variant)
Conclusion : je me garderai de te faire une réponse utile sans connaître parfaitement les tenants et aboutissants, clairement exposés, de ton application. Ma toute première impression est une faiblesse de conception.
pijaku
Messages postés
12262
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
5 mars 2020
11
Bonjour ucfoutu,

Comment va?
Ravi de te croiser à nouveau par ici.
Messages postés
35
Date d'inscription
jeudi 30 juin 2011
Statut
Membre
Dernière intervention
23 octobre 2018

Bonjour Ucfoutu,

Merci pour toutes question et de prendre du temps pour répondre à mon problème. En effet, Nbr_AtomesPF est déclaré en public dans un module. Et il n'est pas constant, il est fixé par l'utilisateur. Le nombre de contrôles n'est donc pas constant et l'userform s'adapte au nombre de contrôle.

En effet, grosse boulette de ma part, pour la déclaration des variables. Merci de me l'avoir rappelé.

Si tu veux jeté un coup d'oeil au programme en cours de conception, tu pourras le télécharger ici:

http://filez.univ-bpclermont.fr/yfgik

Il est loin d'être finalisé. Mais je pense que cela vous permettra de mieux comprendre car cela est hardu de le faire par écrit. Quand vous serez sur le programme, je souhaite ajouter des actions aux boutons "+" de l'userform1 comme la création de nouvelles combobox et textbox.

Merci encore pour votre aide.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Désolé, mais des raisons de sécurité font que je n'ouvre jamais un classeur créé par d'autres. Il pourrait en effet contenir A LEUR INSU, des "bestioles" que je ne veux pas courir le risque d'importer sur ma machine. Le risque est encore plus grand lorsque le classeur est déposé sur un site de dépôt.
Messages postés
35
Date d'inscription
jeudi 30 juin 2011
Statut
Membre
Dernière intervention
23 octobre 2018

Ok sans problème, je comprends!

Donc je vais essayer de présenter le programme succinctement mais précisément. Donc je commence par présenter le lancement du programme où on a un premier userform qui apparait :


Son code est le suivant:


Public Sub BoutonOK2_Click()

Application.ScreenUpdating = False

Dim Reponse As String

Nbr_AtomesPF = TextBox1.Value

If Nbr_AtomesPF = 1 Then
Reponse = MsgBox("Êtes-vous certain(e) de vouloir continuer avec " & Nbr_AtomesPF & " atome ?", vbYesNo, "Nombre d'atomes !")
Else
Reponse = MsgBox("Êtes-vous certain(e) de vouloir continuer avec " & Nbr_AtomesPF & " atomes ?", vbYesNo, "Nombre d'atomes !")
End If

If Reponse = vbYes Then
UserForm2.Hide
UserForm1.Show
End If

Application.ScreenUpdating = True

End Sub

Private Sub SpinButton1_SpinDown()

TextBox1.Value = TextBox1.Value - 1

End Sub

Private Sub SpinButton1_SpinUp()

TextBox1.Value = TextBox1.Value + 1

End Sub

Private Sub UserForm_Initialize()

TextBox1.Value = 1
TextBox1.FontSize = 14

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
End
End If
End Sub



Les utilisateurs doivent choisir le nombre d'atomes qu'ils souhaitent, le fameux Nbr_AtomesPF. De là, une confirmation apparaît, pour laisser place au deuxième userform avec Nbr_AtomesPF = 5 ici :



Son code est le suivant:


Public Sub BoutonOK2_Click()

Application.ScreenUpdating = False

Dim Reponse As String

Nbr_AtomesPF = TextBox1.Value

If Nbr_AtomesPF = 1 Then
Reponse = MsgBox("Êtes-vous certain(e) de vouloir continuer avec " & Nbr_AtomesPF & " atome ?", vbYesNo, "Nombre d'atomes !")
Else
Reponse = MsgBox("Êtes-vous certain(e) de vouloir continuer avec " & Nbr_AtomesPF & " atomes ?", vbYesNo, "Nombre d'atomes !")
End If

If Reponse = vbYes Then
UserForm2.Hide
UserForm1.Show
End If

Application.ScreenUpdating = True

End Sub

Private Sub SpinButton1_SpinDown()

TextBox1.Value = TextBox1.Value - 1

End Sub

Private Sub SpinButton1_SpinUp()

TextBox1.Value = TextBox1.Value + 1

End Sub

Private Sub UserForm_Initialize()

TextBox1.Value = 1
TextBox1.FontSize = 14

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
End
End If
End Sub


Le code du module est:

Public MesBoutons() As New Classe1
Public Nbr_AtomesPF As Integer
Public choix As Integer
'Public r as integer
'Public d As Integer
'Public Inc As Integer
'Public Molecule As Double
'Public masseref As Double
'Public refmol As Double
'Public moleref As Double


Sub Calculmasse()

UserForm2.Show

Unload UserForm1
Unload UserForm2

End Sub


Enfin, le code du module de classe est:

Public WithEvents BoutonEvents As MSForms.CommandButton

Private Sub BoutonEvents_Click()

' Dim opt As Control
' Dim num As Integer
'
' Set opt = UserForm1.Controls.Add("Forms.ComboBox.1")
' With opt
' .Name = "Dop" & i
' .RowSource = "Classification!B2:B119"
' .Left = 30 + X
' .Height = 20
' .Width = 50
' .Top = 30
' .ListRows = 20
' .ListWidth = 50
' .Font.Bold = True
' .Font.Name = "Calibri"
' .Font.Size = 14
' End With

End Sub


Voilà je pense avoir fait le tour des codes et userforms.
Donc si je reviens au fonctionnement, le bouton "+" du deuxième userform doivent rajouter une combobox et une textbox en dessous de la combobox existante.

Voilà, j'espère avoir été clair dans mes explications. Je vous remercie encore pour votre aide,

Anthony