2009-02-19 9 views
8

Je crée des boutons dynamiquement sur un userform Excel avec le code suivant:Assign-cliquez sur la fonction VBA à un bouton dynamiquement créé sur Excel Userform

With Me.CurrentFrame.Controls.Add("Forms.CommandButton.1") 
    .Caption = "XYZ" 
    .name = "AButton" 
    .Font.Bold = True 
    .ForeColor = &HFF& 
    ... blah blah blah 
End With 

J'aimerais 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 bouton lui-même.

Y at-il un moyen de le faire en utilisant l'idiome ci-dessus? Dois-je aller à propos de cette chose d'une manière différente?

Répondre

8

Vous devez créer dynamiquement des gestionnaires de code/d'é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éez également le code du gestionnaire d'événements. Faites-les tous cachés au départ.

Ensuite, lorsque votre formulaire s'ouvre, vous pouvez modifier dynamiquement les légendes des boutons, les rendre visibles et les déplacer. Le code d'événement que vous avez créé initialement sera lié aux boutons activés comme prévu.

+2

Une idée géniale! Semble tout dans VBA exige d'être intelligent. – notnot

0

J'ai regardé cela 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. C'est mon hack autour de ça jusqu'à ce que je trouve quelque chose de mieux.

+0

Pour un contrôle de forme d'utilisateur excel, assingin "onClick" aboutit à ... "L'objet ne supporte pas cette propriété ou méthode" – PravyNandas

2

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""" 
1
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 
+0

Je veux dire pour les boutons ajoutés aux userforms, pas à la feuille de calcul – notnot

13

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 Comme vous pouvez le voir 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 

, la seule chose que cela va faire est de définir la légende sur le bouton pour ensuite nombre de fois vous l'avez cliqué. 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, la légende change.

+0

Cela a très bien fonctionné pour moi. Je me demandais s'il y avait un moyen d'envoyer une variable à la classe. Par exemple, si je devais changer .caption à tout ce que j'envoie. Private Sub btn_Click (var1 As String) J'ai essayé cela mais il en résulte que "l'objet ne supporte pas cette propriété ou méthode" – JahKnows

+0

C'est vrai. Les événements _Click() n'acceptent aucun paramètre. Vous pouvez également essayer de définir une autre variable privée à l'intérieur de la classe et d'attribuer votre légende en premier, puis de configurer votre événement pour le gestionnaire. – PravyNandas

Questions connexes