2009-02-19 9 views
8

Sto creazione di pulsanti in modo dinamico su un userform Excel con il seguente codice:Assegna il clic funzione di VBA a un pulsante creato in modo dinamico in Excel Userform

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

mi piacerebbe assegnare una funzione da eseguire quando questi pulsanti sono cliccati, ma non riesco a trovare un modo semplice per farlo poiché non c'è alcuna proprietà come parte del pulsante stesso.

C'è un modo per farlo utilizzando l'idioma sopra? Dovrei parlare di tutto questo in un modo diverso?

risposta

8

È necessario creare dinamicamente gestori di codice/evento per ogni pulsante.

ci vuole un po 'di fare - vedere qui: http://navpadexcel.blogspot.com/2006/11/httpwwwcpearsoncomexcelvbehtm.html

Un modo migliore potrebbe essere quella di creare un gruppo di pulsanti del modulo (come molti come si pensi hai bisogno) prima del tempo. Crea anche il codice del gestore di eventi. Renderli tutti nascosti inizialmente.

Quindi, quando si apre il modulo, è possibile modificare dinamicamente i sottotitoli, renderli visibili e spostarli. Il codice evento che hai creato inizialmente sarà collegato ai pulsanti attivati ​​come previsto.

+2

Idea intelligente! Sembra che tutto in VBA richieda di essere intelligente. – notnot

0

Anche questo l'ho visto. Sembra è possibile eseguire una macro utilizzando la proprietà onClick:

Command1.OnClick = "Macro1" 

quindi creare una macro con quel nome che esegue la funzione desiderata. Questo è il mio trucco su questo finché non trovo qualcosa di meglio.

+0

Per un controllo userform excel, l'assegnazione di "onClick" ha comportato ... "L'oggetto non supporta questa proprietà o metodo" – PravyNandas

2

Il seguente codice dovrebbe funzionare

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

Intendo per i pulsanti aggiunti a userforms, non al foglio di lavoro – notnot

13

Per aggiungere un evento di controllo in modo dinamico in forma di Excel; è necessario prima aggiungere gli eventi in un modulo di classe. Per il mio esempio, ho intenzione di aggiungere un modulo di classe denominato clsTest con un evento, 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 

Come si può vedere, l'unica cosa che questo farà si trova la didascalia sul pulsante per allora il numero di volte lo hai fatto clic. Avanti, nel codice del modulo immettere la seguente:

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 

Quando si attiva il modulo, si creerà un pulsante. ogni volta che fai clic sul pulsante la didascalia cambierà.

+0

Questo ha funzionato molto bene per me. Mi chiedevo se ci fosse un modo per inviare una variabile alla classe. Ad esempio, se dovessi cambiare .caption in qualunque cosa io invii. Private Sub btn_Click (var1 As String) Ho provato questo ma ha provocato "Oggetto non supporta questa proprietà o metodo" – JahKnows

+0

Esatto. Gli eventi _Click() non accettano alcun parametro. Ciò che in alternativa puoi provare è impostare un'altra variabile privata all'interno della classe e assegnare prima la didascalia e quindi impostare l'evento sul gestore. – PravyNandas