Domanda

Sto creando pulsanti dinamicamente su un modulo utente di Excel con il seguente codice:

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

Vorrei assegnare una funzione da eseguire quando si fa clic su questi pulsanti, ma non riesco a trovare un modo semplice per farlo poiché non esiste alcuna proprietà come parte del pulsante stesso.

C'è un modo per farlo usando l'idioma sopra?Dovrei affrontare tutta questa faccenda in un modo diverso?

È stato utile?

Soluzione

È necessario creare dinamicamente codice/gestori eventi per ciascun pulsante.

Ci vuole un po' di impegno - vedi qui: http://navpadexcel.blogspot.com/2006/11/httpwwwcpearsoncomexcelvbehtm.html

Un modo migliore potrebbe essere quello di creare in anticipo una serie di pulsanti nel modulo (tanti quanti ritieni di averne bisogno).Crea anche il codice del gestore eventi.Inizialmente rendili tutti nascosti.

Quindi, quando il modulo si apre, puoi modificare dinamicamente le didascalie dei pulsanti, renderle visibili e spostarle.Il codice evento creato inizialmente verrà collegato ai pulsanti attivati ​​come previsto.

Altri suggerimenti

Per aggiungere un evento di controllo in modo dinamico in forma di Excel; è necessario aggiungere prima l'evento (s) 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 che si cliccato. Successivamente, nel codice del modulo inserire il 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 si fa clic sul pulsante la didascalia cambierà.

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"""
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

Sono stato a guardare questo. Sembra che si può 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 mod attorno a questo fino a trovare qualcosa di meglio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top