2009-02-19 14 views
8

ich Tasten dynamisch auf einer Excel-Userform mit dem folgenden Code erstellen:Assign auf Sie auf VBA-Funktion zu einer dynamisch erzeugten Schaltfläche auf Excel Userform

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 zu laufen, wenn Diese Schaltflächen werden angeklickt, aber ich kann keine direkte Methode finden, da es keine Eigenschaft als Teil der Schaltfläche selbst gibt.

Gibt es eine Möglichkeit, dies unter Verwendung des obigen Idioms zu tun? Sollte ich das Ganze anders machen?

Antwort

8

Sie müssen Code/Event-Handler für jede Schaltfläche dynamisch erstellen.

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

Ein besserer Weg sein könnte, ein paar Tasten auf dem Formular zu erstellen (so viele, wie Sie denken, Sie brauchen) vor der Zeit. Erstellen Sie auch den Event-Handler-Code. Machen Sie alle zunächst versteckt.

Wenn Sie Ihr Formular öffnen, können Sie die Schaltflächenbeschriftungen dynamisch ändern, sichtbar machen und verschieben. Der Ereigniscode, den Sie ursprünglich erstellt haben, wird erwartungsgemäß mit den aktivierten Schaltflächen verknüpft.

+2

Clevere Idee! Alles in VBA scheint clever zu sein. – notnot

0

Ich habe mir das auch angesehen. Scheint ein Makro mithilfe der onClick Eigenschaft ausführen können:

Command1.OnClick = "Macro1" 

Dann ein Makro erstellen, mit diesem Namen, die die gewünschte Funktion ausgeführt wird. Das ist mein hack um dies, bis ich etwas besseres finde.

+0

Für ein Excel-Benutzerformular Steuerelement Assingin "onClick" führte zu ... "Objekt unterstützt diese Eigenschaft oder Methode nicht" – PravyNandas

2

Der Code unten sollte

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

Ich meine für Schaltflächen hinzugefügt Benutzerformulare, nicht auf das Arbeitsblatt – notnot

13

Um ein Steuerelement Ereignis dynamisch in einem Excel-Formular hinzufügen zu arbeiten; Sie müssen zuerst die Ereignisse in einem Klassenmodul hinzufügen. Für mein Beispiel, ich werde ein Klassenmodul namens ClsTest mit einem Ereignis hinzuzufügen, 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 

Wie Sie sehen können, tun das einzige, was dies die Beschriftung auf die Schaltfläche eingestellt ist dann Anzahl Mal, als du darauf geklickt hast. Als nächstes wird in Form Code eingeben folgendes:

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, ändert sich die Beschriftung.

+0

Dies funktionierte sehr gut für mich. Ich habe mich gefragt, ob ich eine Variable an die Klasse senden kann. Zum Beispiel, wenn ich .caption zu dem ändern wollte, was ich sende. Private Sub btn_Click (var1 als String) Ich versuchte dies, aber es führte zu "Objekt unterstützt diese Eigenschaft oder Methode nicht" – JahKnows

+0

Das ist richtig. _Click() Ereignisse akzeptieren keine Parameter. Alternativ können Sie versuchen, eine andere private Variable in der Klasse festzulegen und zuerst die Beschriftung zuzuweisen und dann Ihr Ereignis für den Handler einzurichten. – PravyNandas