Weisen Sie auf Sie auf VBA-Funktion zu einer dynamisch erzeugten Schaltfläche auf Excel Userform
-
05-09-2019 - |
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?
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.