VBA CommandButton Click-Event dynamisch erzeugen

Hallo zusammen.

Ich generiere über folgenden Code einen CommandButton in einem Formular.

Dim cmdBox As MSForms.CommandButton
Dim x as Integer

fieldInfo = x & "\_edit"
Set cmdBox = Me.Controls.Add("Forms.CommandButton.1", "cmd" & fieldInfo, True)

cmdBox.Caption = "Ändern"
cmdBox.Left = 210
cmdBox.Top = topPosition
cmdBox.Height = 20
cmdBox.Width = 60

Das funktioniert auch einwandfrei.

Nun möchte ich diesem CommandButton das Click-Event anhängen, zB, dass bei Click auf den Button, die Function ModLine(x,„edit“) ausgeführt wird.

Ich habe schon einiges versucht, jedoch ohne Erfolg.

Könnt ihr mir weiterhelfen?

Danke.

Beste Grüße,
Sebastian

hallo Sebastian,

sind fieldinfo und topPositon globale Variablen?
Wenn nicht benutzt du kein Option Explicit was schon mal destruktiv ist.

Dann, um es potentiellen helfern so einfach wie möglich zu machen (Es ist deien zeit die wegläuft wenn sie Zusatzdunge tun müssen!) schreibe bitte komplett einzeln lauffähige Prozeduren.
Also auch globale variablen in der Sub mit einem Wert ausstatten.

Was ich nicht kapiere ist z.B. dies:

Dim x as Integer
fieldInfo = x & „_edit“

Da kannn man doch das x weglassen *denk*

Zur Laufzeit einen CB erstellen und ihm ein Click-Ereignis zuordnen geht schon.

Thomas liest evtl. grad mit, vielleicht hat er da Code parat o.ä.

Google mal nach CodeModule InsertLines

Gruß
Reinhard

Hi Reinhard.

Dann, um es potentiellen helfern so einfach wie möglich zu
machen (Es ist deien zeit die wegläuft wenn sie Zusatzdunge
tun müssen!) schreibe bitte komplett einzeln lauffähige
Prozeduren.
Also auch globale variablen in der Sub mit einem Wert
ausstatten.

Werde den kompletten lauffähigen Code weiter unten posten.

Was ich nicht kapiere ist z.B. dies:

Dim x as Integer
fieldInfo = x & „_edit“

Da kannn man doch das x weglassen *denk*

Würde ich nicht meinen, denn dieser Index (x as Integer) brauche ich um die dynamisch erzeugten CommandButtons eindeutig zu identifizieren.

Zur Laufzeit einen CB erstellen und ihm ein Click-Ereignis
zuordnen geht schon.

Das freut mich! Dachte schon das ist unmöglich. :frowning:

Google mal nach CodeModule InsertLines

Das mit dem CodeModule hat mir schon mal weitergeholfen.

Hier nun der komplette lauffähige Code:

Sub Foo()
Dim topPosition As Integer
Dim letztePositionMenge As Integer
Dim LetztePosition As Integer
Dim Modell As String

Modell = "foo"

 For startIndex = 2 To 10 Step 1
 LetztePosition = Worksheets("Modell").Range("A10000").End(xlUp).row

 For Start = 2 To LetztePosition Step 1
 If Modell = Worksheets("Modell").Range("A" & Start).Value Then
 letztePositionMenge = Worksheets("Menge").Range("A10000").End(xlUp).row

 topPosition = 480

 For x = 2 To letztePositionMenge Step 1
 Dim cmdBox As MSForms.CommandButton
 Dim tboBox As MSForms.TextBox
 Dim cboBox As MSForms.ComboBox

 Dim nextTop As Integer
 Dim titleBarHeight As Integer
 Dim fieldInfo As String

 fieldInfo = "\_" & x & "\_edit"

 Set cmdBox = Me.Controls.Add("Forms.CommandButton.1", "cmd" & fieldInfo, True)

 Dim code As String

 code = code & vbLf

 code = code & "Private Sub cmd" & fieldInfo & "\_Click()" & vbLf
 code = code & " cmdNeueMenge.Visible = false" & vbLf
 code = code & "End Sub"

 ThisWorkbook.VBProject.VBComponents("frmMengeneingabe").CodeModule.AddFromString code

 cmdBox.Caption = "Ändern"
 cmdBox.Left = 210
 cmdBox.Top = topPosition
 cmdBox.Height = 20
 cmdBox.Width = 60

 fieldInfo = x & "\_delete"

 Set cmdBox = Me.Controls.Add("Forms.CommandButton.1", "cmd" & fieldInfo, True)

 cmdBox.Caption = "Delete"
 cmdBox.Left = 270
 cmdBox.Top = topPosition
 cmdBox.Height = 20
 cmdBox.Width = 60

 topPosition = topPosition + 30
 Next x
 End If
 Next Start
 Next startIndex
End Sub

Nun mein Problem besteht weiterhin, über CodeModule.AddFromString code kann ich Zeilen meiner Form hinzufügen. Ich sehe den erzeugten Code in meiner Code-Anzeige der Form frmMengeneingabe. Jedoch, wenn ich nun auf einen der erzeugten CommandButtons klicke, wird der Code nicht ausgeführt. Ich meine zu wissen weshalb, denn dieser Code wird zur Laufzeit erzeugt und vom Compiler nicht mit kompiliert. Deshalb, kann das auch nicht klappen, stimmt das so?

Trotzdem muss ich das Click-Event dynamisch erzeugen, kannst du mir weiterhelfen?

Danke dir.

Gruß Sebastian

Hallo Sebastian,

Werde den kompletten lauffähigen Code weiter unten posten.

mit Option Explicit ist er nicht lauffähig da Variablen nicht deklariert sind.

Würde ich nicht meinen, denn dieser Index (x as Integer)
brauche ich um die dynamisch erzeugten CommandButtons
eindeutig zu identifizieren.

Ist ja okay, in deinem beispiel hat x den Wert nix gehabt :smile:

Nun mein Problem besteht weiterhin, über
CodeModule.AddFromString code kann ich Zeilen meiner Form
hinzufügen. Ich sehe den erzeugten Code in meiner Code-Anzeige
der Form frmMengeneingabe. Jedoch, wenn ich nun auf einen der
erzeugten CommandButtons klicke, wird der Code nicht
ausgeführt. Ich meine zu wissen weshalb, denn dieser Code wird
zur Laufzeit erzeugt und vom Compiler nicht mit kompiliert.
Deshalb, kann das auch nicht klappen, stimmt das so?

Jain, VBA kompiliert nur recht wenig, der Rest wird interpretiert.

Zitat von Wiki:
„Beispielsweise wird ein VBA-Skript zwar vorkompiliert, um Variablen-
und Konstantentabellen aufzubauen und syntaktische Überprüfungen
durchzuführen, ein Kompilieren bis hin zu ausführbarem Maschinencode
ist jedoch nicht möglich.“

Deshalb schreibe alle DIMs zu Anfang der Prozedur. Alle DIMs werden bei Start des Moduls kompiliert.

Trotzdem muss ich das Click-Event dynamisch erzeugen, kannst
du mir weiterhelfen?

Ich probiere es. Bei der Recherche stieß ich auf ähnlichen Code von mir wo ich genau das Gleiche Problem hatte und nachfragte, naja, geantwortet hat keiner.

Gruß
Reinhard

Hi Reinhard.

mit Option Explicit ist er nicht lauffähig da Variablen nicht
deklariert sind.

Das habe ich vergessen. Danke für den Hinweis.

Ist ja okay, in deinem beispiel hat x den Wert nix gehabt :smile:

Stimmt, deshalb auch der vollständige Code! :smile:

Zitat von Wiki:
„Beispielsweise wird ein VBA-Skript zwar vorkompiliert, um
Variablen-
und Konstantentabellen aufzubauen und syntaktische
Überprüfungen
durchzuführen, ein Kompilieren bis hin zu ausführbarem
Maschinencode
ist jedoch nicht möglich.“

Deshalb schreibe alle DIMs zu Anfang der Prozedur. Alle DIMs
werden bei Start des Moduls kompiliert.

Wieder was gelernt.

Trotzdem muss ich das Click-Event dynamisch erzeugen, kannst
du mir weiterhelfen?

Ich probiere es. Bei der Recherche stieß ich auf ähnlichen
Code von mir wo ich genau das Gleiche Problem hatte und
nachfragte, naja, geantwortet hat keiner.

Das wäre super von dir, wenn du mir einen Lösungsansatz präsentieren könntest! Ich bin mal gespannt! Danke für deine Hilfe.

Gruß Sebastian

Ich probiere es. Bei der Recherche stieß ich auf ähnlichen
Code von mir wo ich genau das Gleiche Problem hatte und
nachfragte, naja, geantwortet hat keiner.

Das wäre super von dir, wenn du mir einen Lösungsansatz
präsentieren könntest! Ich bin mal gespannt! Danke für deine
Hilfe.

Hallo Sebastian,

ein Ansatz ist, zur laufzeit der ersten UF erstellest du bei bedarf eine weitere UF, bestückst sie nach Wunsch und füllst das Modul der neuen UF mit Code wie z.B. einem Klick-eriegnis-Code.

Dann präsentierst du die neue UF anstelle der alten UF.

Eine neue UF erstellst du so:

Sub tt()
Dim myUF
Set myUF = ThisWorkbook.VBProject.VBComponents.Add(3)
With myUF
 .Name = "frmNeu"
End With
End Sub

Gruß
reinhard

Hi Reinhard.

ein Ansatz ist, zur laufzeit der ersten UF erstellest du bei
bedarf eine weitere UF, bestückst sie nach Wunsch und füllst
das Modul der neuen UF mit Code wie z.B. einem
Klick-eriegnis-Code.

Das werde ich gleich versuchen. Danke für den Tipp.

Dann präsentierst du die neue UF anstelle der alten UF.
Eine neue UF erstellst du so:

Sub tt()
Dim myUF
Set myUF = ThisWorkbook.VBProject.VBComponents.Add(3)
With myUF
.Name = „frmNeu“
End With
End Sub

Ok das wäre mir klar, aber kann ich in einer Form eine UF einbetten?

Gruß Sebastian