VBA Code dynamisch erstellen
Servus allerseits,
nach Stunden der erfolglosen Suche im Netz wende ich mich an Euch mit folgendem Thema:
Voraussetzungen: Excel 2019, ein Workbook mit zwei Tabellen (Werte/Kategorien), in VBA eine dynamisch erstellte Userform, mit einer Reihe von CommandButtons, was soweit auch wunderbar funktioniert. Der usf_initialize-Code als Auszug:
Mein Problem: Ich habe nun iCat (z.B. 10) CommandButtons, für die ich je eine Sub benötige, die OnClick auszuführen ist. Lässt sich dieser Code irgendwie ebenfalls dynamisch erzeugen, oder kann man einfach alle Klicks auf Controlseiner Userform abfangen? (Das habe ich als Vorschlag mithilfe einer Klassegefunden, von deren Programmierung ich leider genau keine Ahnung habe) Der Event Userform_OnClick nimmt nur Klicks außerhalb von Controls entgegen.
Bisher behelfe ich mir mit deaktivierten Grafiken und dem Auslesen der MouseDown-Koordinaten und Select Case True ...
Hat jemand eine schlauere Idee??
Ganz lieben Dank und eine geruhsame Nacht / schöne Woche!
Spinnifex
nach Stunden der erfolglosen Suche im Netz wende ich mich an Euch mit folgendem Thema:
Voraussetzungen: Excel 2019, ein Workbook mit zwei Tabellen (Werte/Kategorien), in VBA eine dynamisch erstellte Userform, mit einer Reihe von CommandButtons, was soweit auch wunderbar funktioniert. Der usf_initialize-Code als Auszug:
iDist = 30
For i = 1 To iCat
Set ctr = Me.Controls.Add("Forms.CommandButton.1", "CAT_" & i, True)
sCat = wsK.Cells(i, 2)
sConTip = wsK.Cells(i, 1)
With ctr
.Height = 20
.Top = 15
.Left = iDist * i
.Width = 28
.Caption = sCat
.ControlTipText = sConTip & " " & ctr.Name
.Enabled = True
End With
Next i
Mein Problem: Ich habe nun iCat (z.B. 10) CommandButtons, für die ich je eine Sub benötige, die OnClick auszuführen ist. Lässt sich dieser Code irgendwie ebenfalls dynamisch erzeugen, oder kann man einfach alle Klicks auf Controlseiner Userform abfangen? (Das habe ich als Vorschlag mithilfe einer Klassegefunden, von deren Programmierung ich leider genau keine Ahnung habe) Der Event Userform_OnClick nimmt nur Klicks außerhalb von Controls entgegen.
Bisher behelfe ich mir mit deaktivierten Grafiken und dem Auslesen der MouseDown-Koordinaten und Select Case True ...
Hat jemand eine schlauere Idee??
Ganz lieben Dank und eine geruhsame Nacht / schöne Woche!
Spinnifex
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 6143719898
Url: https://administrator.de/contentid/6143719898
Ausgedruckt am: 22.11.2024 um 06:11 Uhr
7 Kommentare
Neuester Kommentar
Die Klasse ist der richtige und vernünftigste Weg
Und schon nutzt du für jeden Button ein und die selbe Event-Prozedur und kannst bspw. anhand des Namens oder einen anderen Property die du entsprechend setzt die Buttons unterscheiden.
h.
von deren Programmierung ich leider genau keine Ahnung habe
Das lässt sich einfach ändern- https://stackoverflow.com/questions/24558214/actions-for-multiple-simila ...
- https://stackoverflow.com/questions/51237250/call-same-sub-from-multiple ...
- Excel VBA: Mehrere Comboboxen auf UF auf Change überwachen
- https://www.vitoshacademy.com/vba-vba-class-modules-for-buttons/
Klasse "clsButton" erstellen
' öffentliche Property für die Zuweisung des Buttons zu dieser Instanz
Public WithEvents cButton As MSForms.CommandButton
' Click Event das dann jeweils für jeden Button ausgeführt wird
Private Sub cButton_Click()
MsgBox "Button '" & cButton.Caption & "' clicked."
End Sub
Bsp. Code einer Userform mit Nutzung der Klasse für die angelegten Buttons
' Collection für die Button Klasseninstanzen
Dim btnCollection As New Collection
Private Sub UserForm_Initialize()
' Variablen
Dim btnCount As Integer, btnClass As clsButton, cmd As MSForms.CommandButton
' Anzahl an Buttons
btnCount = 4
' Collection initialisieren
Set btnCollection = New Collection
' für Anzahl an Buttons
For i = 1 To btnCount
' erstelle einen neuen Button
Set cmd = Me.Controls.Add("Forms.CommandButton.1", "button" & i)
' platziere den Button
cmd.Top = 10
cmd.Left = 60 * i
cmd.Width = 50
cmd.Caption = "Button_" & i
' erstelle eine neue Klasseninstanz
Set btnClass = New clsButton
' weise der öffentlichen Button-Variable der Instanz den aktuellen Button zu
Set btnClass.cButton = cmd
' füge die Instanz der Collection hinzu
btnCollection.Add btnClass
Next
End Sub
h.
Userform1.Controls("Blablub").Text = "XYZ"
habe ich das Thema noch einmal auf ungelöst gesetzt, weil ich jetzt im zweiten Teil nicht weiterkomme
Kann man nur hoffen das das nicht wieder zu einer never ending story mit einem Mischmasch aus x Threadfremdem Fragen mutiert ...