2012-04-19 16 views
17

Ich versuche, eine Schaltfläche zu erhalten, die ich dynamisch in einem Excel-Benutzerformular erstellt habe, um ein Makro namens transfer auszuführen, das ich in Module 1 des Abschnitts "Module" meines Projekts geschrieben habe .Code einer dynamisch erstellten Schaltfläche zuweisen

Im Folgenden werde ich den Code eingefügt habe ich bisher in der Userform geschrieben haben, die es tatsächlich schafft, die Transfer to Sheet Schaltfläche in dem Rahmen zu schaffen (die ich auch dynamisch erstellt haben), aber aus irgendeinem Grund, wenn ich laufe VBA Ich bekomme eine 438 error Nachricht, die besagt, dass Object doesn't support this property or method.

Kann mir jemand sagen, wie ich das lösen kann?

Hier ist der Code:

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" 

Antwort

22

Hier ist ein Beispiel. Bitte ändern Sie es nach Ihren Wünschen :)

In diesem Beispiel wird eine Befehlsschaltfläche erstellt und ihr Code zugewiesen, so dass nach dem Drücken von "Hello World" angezeigt wird.

Fügen Sie diesen Code in das click -Ereignis einer Befehlsschaltfläche ein, die dynamisch eine neue Befehlsschaltfläche erstellt und ihr Code zuweist.

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 

und fügen Sie diesen Code in einem Klassenmodul

Option Explicit 

Public WithEvents CmdEvents As MSForms.CommandButton 

Private Sub CmdEvents_Click() 

    MsgBox "Hello Word" 

End Sub 

SCHNAPPSCHUSS

enter image description here enter image description here

+0

+1 Ich bin nicht ganz sicher, dass die Schaltfläche gemeint war (mein Code) bleiben oder (dieser Code) am Ende verschwinden. Das Klassenmodul ist ein cleverer Workaround, um Code für die neue Schaltfläche bereitzustellen. – brettdj

+0

Hallo Siddharth, dein Beispiel hat wirklich gut funktioniert und die Art, wie du es erklärt hast, war großartig, besonders für einen VBA-Anfänger wie mich! Ich kann dich nicht gehen lassen, ohne dich zu erklären, was der cmdArray (i) ist. Teil tut in ReDim Preserve cmdArray (1 bis ich) Set cmdArray (i) .CmdEvents = ctl_Command –

+0

(Hoppla ... gedrückt, bevor ich fertig mit dem Schreiben meiner Nachricht!) Wie ich sagte, wäre es gut zu verstehen, was cmdArray (i) wird benötigt, damit jede Erklärung, die Sie zur Verfügung stellen können, großartig wäre. Nochmals vielen Dank für Ihre Hilfe Siddharth! –

9

Sie müssen programmatisch den Code der Userform hinzuzufügen. Ich habe meinen Code aus diesem vbax article als Referenz

Der folgende Code:

  1. Runs von einem normalen Modul
  2. Fügt die Taste, um eine Userform UserForm1
  3. genannt
  4. Fügt diesen Code zu die Benutzerform für ein Klickereignis

    Private Sub CommandButton1_Click() 
    Call Transfer 
    End Sub 
    

VBA aus normalen Modul

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 Eine andere Möglichkeit, das Problem anzugehen :) –

+2

+1 Ich stimme nicht mit der VBAX Bewertung von "easy" für diesen Code obwohl. (Ich habe auch einen leicht humorvollen Tippfehler im ersten Satz bearbeitet.) –

+1

+ 1 @DougGlancy :) Ich stimme dir zu. Programmieren der VBE oder Schreiben von Klassenmodulen ist keine einfache Programmierung :) Aber ich denke, und ich könnte falsch liegen, es spricht über "Ease of Use" und nicht Schwierigkeitsgrad des Codes. Für einen Neuling, wenn Sie alles auf einem Teller geben, dann ist dieser Code immer "einfach" für ihn/sie zu benutzen und ich denke, das ist, dass diese Seite tut :) –

Verwandte Themen