Autor
|
Thema: Per Code erzeugtes Steuerelement - (Klick-)Event erstellen (2481 mal gelesen)
|
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 05. Dez. 2011 13:34 <-- editieren / zitieren --> Unities abgeben:
Ich schon wieder Nach stundenlanger Recherche, bin ich meinem Ziel schon ziemlich nahe gekommen, aber es funktioniert einfach noch nicht.. Ich möchte dynamisch Steuerelemente (z.B. Button oder CheckBox) erstellen und gleichzeitig ein Click Ereignis erstellen.. Verwenden möcte ich den Code z.B. um eine Liste von Parts in einem Produkt oder Körpern in einem Part auszugeben.. Bisheriger Code: Code:
Private Sub CommandButton1_Click()Dim Button2 Set Button2 = UserForm1.Controls.Add("Forms.CommandButton.1") With Button2 .Name = "CommandButton2" .Caption = "Button2" End With Dim oAPC As New MSAPC.Apc Dim VBAEditor As VBIDE.VBE Dim VBProj As VBIDE.VBProject Dim VBComp As VBIDE.VBComponent Dim CodeMod As VBIDE.CodeModule Set VBAEditor = oAPC.VBE Set VBProj = VBAEditor.ActiveVBProject Set VBComp = VBProj.VBComponents("UserForm1") Set CodeMod = VBComp.CodeModule With CodeMod LineNum = .CreateEventProc("Click", "CommandButton2") LineNum = LineNum + 1 .InsertLines LineNum, "" End With End Sub
Also er erstellt den Button mit dem Namen "CommandButton2", doch beim erstellen des Click-Ereignisses kommt immer "Run-time error '57017': Event handler is invalid".. Ändere ich die entsprechende Zeile in Code: LineNum = .CreateEventProc("Click", "CommandButton1")
erstellt er das Ereignis für "CommandButton1".. Der "CommandButton2" ist aber definitiv da und heißt auch so.. Edit: Nach weiterer Recherche scheint das nicht so ohne weiteres möglich zu sein, habe mich jetzt an einer anderen Variante versucht, geht allerdings auch nicht :( Code:
Private Sub CommandButton1_Click()Dim Button2 Set Button2 = UserForm1.Controls.Add("Forms.CommandButton.1") With Button2 .Caption = "Button2" .Name = "CommandButton2" .OnClick = "=KlickEvent()" End With End Sub
Hier bringt er mir "Run-time error '438': Object doesn't support this property or method" bei der Zeile, wo ich der Eigenschaft ".OnClick" die Prozedur "KlickEvent()" zuweise.. Ist das denn überhaupt der richtige Ansatz, um so etwas umzusetzen? Bis jetzt hatte ich die Controls alle vorher erstellt und habe sie dann nur sichtbar gemacht, aber das kann doch nicht der beste Weg sein.. [Diese Nachricht wurde von geekv5 am 05. Dez. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gladly Mitglied
Beiträge: 56 Registriert: 02.11.2007 Catia V5R19SP9HF40 64Bit Windows XP Pro x64
|
erstellt am: 05. Dez. 2011 17:25 <-- editieren / zitieren --> Unities abgeben: Nur für geekv5
Guten Tag, am besten macht man dies mit einer Klasse. Hier ein Beispiel mit einer Kapsel-Klasse für einen CommandButton: Code:
'Klasse1 Option ExplicitPublic WithEvents myCmd As MSForms.CommandButton Private Sub myCmd_Click() MsgBox (myCmd.Name & " gedrückt") End Sub Private Sub Class_Initialize() 'Klasse erstellt End Sub Public Sub Init(Form As UserForm, Name As String) Set myCmd = Form.Controls.Add("Forms.CommandButton.1", Name) End Sub
Genutzt wird es dann ganz einfach folgend: Code:
Option Explicit Private myColl As New Collection 'Private bla As Klasse1 'Falls nur ein Objekt benötigt wird, was aber unwahrscheinlich ist, dieses an und Collection ausPrivate Sub CommandButton1_Click() Dim bla As Klasse1 Set bla = New Klasse1 Call bla.Init(Me, "cmd_Test") bla.myCmd.Caption = "Blablabla" myColl.Add bla 'Nur wenn auch Collection oben erstellt.
Wichtig ist das die Klasse in einem Global-Object ist. Solltest du die Collection auskommentieren wird der Code zwar druchlaufen, aber keine Events geschlossen. Also entweder das "Dim bla as Klasse1" außerhalb der Sub-Routine (Oben als Private bla as ... vorgemerkt) oder aber zur Globalen Collection hinzufügen!!!! mfg
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 05. Dez. 2011 18:04 <-- editieren / zitieren --> Unities abgeben:
Hallo gladly, habe mal versucht, deinen Code zu testen und zwar habe ich den ersten Code in ein leeres Klassenmodul kopiert, dann einen Button erstellt und ihm den zweiten Code zugewiesen.. Wenn ich jetzt den Button klicke bricht er bei Code: Dim bla As Klasse1
mit "User-defined type not defined" ab.. Muss ich "Klasse1" noch irgendwie deklarieren? Edit: Kommando zurück, die erstelle Klasse heißt bei mir "Class1", dementsprechend funktioniert es jetzt.. Danke erstmal, ist der Abend wieder gerettet [Diese Nachricht wurde von geekv5 am 05. Dez. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|