2012-04-19 18 views
17

Sto cercando di ottenere un pulsante che ho creato dinamicamente su un modulo utente excel per eseguire una macro denominata transfer che ho scritto in Module 1 della sezione "Moduli" del mio progetto .Assegna il codice a un pulsante creato dinamicamente

Qui di seguito ho incollato il codice che ho scritto finora nel userform che gestisce in realtà per creare il pulsante Transfer to Sheet nel telaio (che ho anche creato dinamicamente), ma per qualche ragione, quando corro VBA Ottengo un messaggio 438 error dicendo che Object doesn't support this property or method.

Qualcuno può dirmi come posso risolvere questo?

Ecco il codice:

Dim framecontrol1 As Control 

Set workitemframe = Controls.Add("Forms.Frame.1") 
With workitemframe 
    .Width = 400 
    .Height = 400 
    .Top = 160 
    .Left = 2 
    .ZOrder (1) 
    .Visible = True 
End With 

workitemframe.Caption = "Test" 
Set framecontrol1 = workitemframe.Controls.Add("Forms.commandbutton.1") 

With framecontrol1 
    .Width = 100 
    .Top = 70 
    .Left = 10 
    .ZOrder (1) 
    .Visible = True 
    .Caption = "Transfer to Sheet" 
End With 
framecontrol1.OnAction = "transfer" 

risposta

22

Ecco un esempio. Si prega di modificarlo in base alle proprie esigenze :)

Questo esempio creerà un pulsante di comando e assegnerà il codice ad esso in modo che quando viene premuto, verrà visualizzato "Hello World".

Incollare questo codice nell'evento click di un pulsante di comando che creerà dinamicamente un nuovo pulsante di comando e assegnerà il codice ad esso.

Option Explicit 

Dim cmdArray() As New Class1 

Private Sub CommandButton1_Click() 
    Dim ctl_Command As Control 
    Dim i As Long 

    i = 1 

    Set ctl_Command = Me.Controls.Add("Forms.CommandButton.1", "CmdXYZ" & i, False) 

    With ctl_Command 
     .Left = 100 
     .Top = 100 
     .Width = 255 
     .Caption = "Click Me " & CStr(i) 
     .Visible = True 
    End With 

    ReDim Preserve cmdArray(1 To i) 
    Set cmdArray(i).CmdEvents = ctl_Command 

    Set ctl_Command = Nothing 

End Sub 

e incollare questo codice in un modulo di classe

Option Explicit 

Public WithEvents CmdEvents As MSForms.CommandButton 

Private Sub CmdEvents_Click() 

    MsgBox "Hello Word" 

End Sub 

ISTANTANEA

enter image description here enter image description here

+0

+1 non sono del tutto sicuro che il pulsante era destinato a restare (il mio codice) o scomparire (il codice) alla fine. Il modulo di classe è una soluzione intelligente per fornire il codice al nuovo pulsante – brettdj

+0

Ciao Siddharth, il tuo esempio ha funzionato molto bene e il modo in cui hai spiegato è stato fantastico, soprattutto per un debuttante VBA come me! Non posso lasciarti andare senza farti spiegare cosa è il cmdArray (i). parte fa in ReDim Preserve cmdArray (1 To i) Set cmdArray (i) .CmdEvents = ctl_Command –

+0

(Ooops ... premuto invio prima che avessi finito di scrivere il mio messaggio!) Come stavo dicendo, sarebbe bene capire cosa cmdArray (i) è necessario perché ogni spiegazione che puoi fornire sia ottima. Grazie ancora per il tuo aiuto Siddharth! –

9

È necessario aggiungere il codice al form utente programatically. Ho usato il mio codice da questo vbax article come riferimento

Il codice qui sotto:

  1. viene eseguito da un modulo normale
  2. Aggiunge il pulsante per un form chiamato UserForm1
  3. aggiunge questo codice l'Userform per un evento Click

    Private Sub CommandButton1_Click() 
    Call Transfer 
    End Sub 
    

VBA dal modulo normale

Sub AddToForm() 
    Dim UF As Object 
    Dim frameCOntrol1 As Object 
    Set UF = ActiveWorkbook.VBProject.VBComponents("UserForm1") 
    Set frameCOntrol1 = UF.designer.Controls.Add("Forms.CommandButton.1") 
    With frameCOntrol1 
     .Width = 100 
     .Top = 70 
     .Left = 10 
     .ZOrder (1) 
     .Visible = True 
     .Caption = "Transfer to Sheet" 
    End With 

    With UF.CodeModule 
     .InsertLines 2, _ 
        "Private Sub " & frameCOntrol1.Name & "_Click()" & Chr(13) & _ 
        "Call Transfer" & Chr(13) & _ 
        "End Sub" 
    End With 

End Sub 
+0

+ 1 Un altro modo per affrontare il problema :) –

+2

+1 Non sono d'accordo con la valutazione VBAX di "facile" per questo codice. (Ho anche modificato un errore di battitura nella prima frase.) –

+1

+ 1 @DougGlancy :) Sono d'accordo con te. programmare il VBE o scrivere moduli di classe in nessun modo è 'facile' programmare :) Comunque credo che potrei sbagliarmi, si tratta di "facilità d'uso" piuttosto che livello di difficoltà del codice. Per un principiante, se dai tutto su un piatto, quel codice sarà sempre "Facile" per lui/lei da usare e immagino che questa sia quella pagina :) –

Problemi correlati