Assigner en fonction VBA cliquez sur un bouton dynamiquement créé sur Excel Userform
-
05-09-2019 - |
Question
Je crée des boutons dynamiquement sur un userform Excel avec le code suivant:
With Me.CurrentFrame.Controls.Add("Forms.CommandButton.1")
.Caption = "XYZ"
.name = "AButton"
.Font.Bold = True
.ForeColor = &HFF&
... blah blah blah
End With
Je voudrais assigner une fonction à exécuter lorsque ces boutons sont cliqués, mais je ne peux pas trouver un moyen simple de le faire car il n'y a pas de propriété dans le cadre du bouton lui-même.
Est-il possible de le faire en utilisant l'idiome ci-dessus? Au cas où je vais toute cette affaire d'une manière différente?
La solution
Vous devez créer dynamiquement des gestionnaires code / événement pour chaque bouton.
Il prend un peu de faire - voir ici: http://navpadexcel.blogspot.com /2006/11/httpwwwcpearsoncomexcelvbehtm.html
Une meilleure façon peut-être de créer un tas de boutons sur la forme (autant que vous pensez que vous aurez besoin) à l'avance. Créer le code de gestionnaire d'événements ainsi. Faites-les tous cachés au départ.
Ensuite, lorsque votre formulaire vous ouvre pouvez modifier dynamiquement les sous-titres de bouton, les rendre visibles et de les déplacer. Le code d'événement créé sera d'abord liée aux boutons activés comme prévu.
Autres conseils
Pour ajouter un événement de contrôle dynamique sous une forme Excel; vous devez d'abord ajouter l'événement (s) dans un module de classe. Pour mon exemple, je vais ajouter un module de classe nommé clsTest avec un événement, btn_click ()
'#### CLASS NAMED clsTEST
Public WithEvents btn As MSForms.CommandButton
Public frm As UserForm
Dim iCount As Long
Private Sub btn_Click()
iCount = IIf(iCount < 1, 1, iCount + 1)
btn.Caption = "Count " & Str(iCount)
End Sub
'### END CLASS
Comme vous pouvez le voir, la seule chose que cela va faire est de définir la légende sur le bouton pour ensuite nombre de fois que vous avez cliqué il. Ensuite, dans le code de forme entrez:
Dim mColButtons As New Collection '## SET A NEW COLLECTION
Private Sub UserForm_Activate()
'
Dim btnEvent As clsTEST
Dim ctl As MSForms.Control
'
Set ctl = Me.Controls.Add("Forms.CommandButton.1")
'
With ctl
.Caption = "XYZ"
.Name = "AButton"
END With
'
Set btnEvent = new clsTEST
Set btnEvent.btn = ctl
set btnEvent.frm = Me
'
mColButtons.add btnEvent
'End Sub
Lorsque vous activez la forme, il va créer un bouton. chaque fois que vous cliquez sur le bouton de la légende changera.
Le code ci-dessous devrait fonctionner
Dim NewButton As OLEObject
Dim CodeModule As Object
Set NewButton = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=52.5, Top:=Hght, _
Width:=202.5, Height:=26.25)
NewButton.Object.Caption = "Click Me!"
Set CodeModule = ActiveWorkbook.VBProject.VBComponents.VBE.ActiveCodePane.CodeModule
CodeModule.InsertLines CodeModule.CreateEventProc("Click", NewButton.Name) + 1, vbTab & "MsgBox ""Hello world"""
Sub Oval1_Click()
file = ActiveWorkbook.Name
Set Output = Workbooks.Add()
ActiveWorkbook.SaveAs Filename:="Try.xls"
Sheets(1).Select
ActiveSheet.Buttons.Add(460, 10, 140, 30).Select
ActiveSheet.Buttons.Text = "DATA"
ActiveSheet.Shapes("Button 1").Select
Selection.OnAction = "Book1.xlsm!data_Click"
End Sub
Sub data_Click()
MsgBox "you have clicked me"
ActiveSheet.DrawingObjects.Delete
End Sub
J'ai regardé aussi. Semble vous pouvez exécuter une macro en utilisant la propriété onClick:
Command1.OnClick = "Macro1"
Ensuite, créez une macro de ce nom qui exécute la fonction souhaitée. Ceci est mon bidouille autour jusqu'à ce que je trouve quelque chose de mieux.