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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top