Weisen Sie auf Sie auf VBA-Funktion zu einer dynamisch erzeugten Schaltfläche auf Excel Userform

StackOverflow https://stackoverflow.com/questions/566770

Frage

Ich erstelle Tasten dynamisch auf einer Excel-Userform mit dem folgenden Code:

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

Ich mag eine Funktion zuweisen laufen, wenn diese Tasten geklickt, aber ich kann eine einfache Art und Weise nicht finden, dies zu tun, da keine Eigenschaft als Teil der Schaltfläche gibt es selbst.

Gibt es eine Möglichkeit, dies unter Verwendung des oben Idiom zu tun? Sollte ich über diese ganze Sache auf eine andere Art und Weise gehen?

War es hilfreich?

Lösung

Sie müssen dynamisch Code / Event-Handler für jede Taste erstellen.

Es dauert ein wenig zu tun - siehe hier: http://navpadexcel.blogspot.com /2006/11/httpwwwcpearsoncomexcelvbehtm.html

Eine bessere Möglichkeit könnte sein, eine Reihe von Schaltflächen auf dem Formular zu erstellen (so viele, wie Sie denken, Sie brauchen) vor der Zeit. Erstellen Sie den Event-Handler-Code als auch. Machen Sie sich alle zunächst versteckt.

Dann, wenn das Formular öffnet können Sie dynamisch die Schaltfläche Beschriftungen ändern, machen sie sichtbar und sie bewegen. Der Ereigniscode Sie zunächst erstellt wird an die aktivierten Tasten verknüpft werden, wie erwartet.

Andere Tipps

Um ein Steuerelement Ereignis dynamisch in einem Excel-Formular hinzufügen; Sie müssen zuerst die Veranstaltung (en) in einem Klassenmodul hinzufügen. Für mein Beispiel werde ich eine Klasse-Modul namens ClsTest mit einem Ereignis, btn_click ()

hinzufügen
    '#### 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

Wie Sie sehen können, das einzige, was dies tun wird die Beschriftung auf den Button, um dann einige Male eingestellt ist Sie darauf geklickt. in Form Code Als nächstes geben Sie die folgenden Schritte aus:

    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

Wenn Sie das Formular aktivieren, wird es eine Schaltfläche erstellen. jedes Mal, wenn Sie auf die Schaltfläche klicken Sie auf die Beschriftung ändern wird.

Der Code unten sollte funktionieren

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

Ich habe auch in diesem gesucht. Scheinen Sie können einen Makro ausführen, indem Sie die OnClick Eigenschaft mit:

Command1.OnClick = "Macro1"

Erstellen Sie dann ein Makro mit diesem Namen, die die gewünschte Funktion ausgeführt wird. Das ist mein Hack um, bis ich etwas bessere finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top