AW: Klasse f.Buttons ?
27.08.2013 15:08:35
Beverly
Hi Robert,
du erstellst zwar die CommandButton zur Laufzeit, weist sie aber 1. keiner Klasse zu und 2. gibt es keinen Code, den die CommandButton ausführen sollen.
Du musst also zuerst einmal ein Klassenmodul einfügen (z.B. mit Namen clsButton) - dort muss festgelegt werden, um was für Steuelemente es sich handelt, sodass Excel weiß, welche Aktionen zur Verfügung stehen müssen. Außerdem muss dort natürlich der Code stehen, den die Button ausführen sollen - also der Ereigniscode selbst. In deinem Fall der Code der festlegt, welches UserForm gestartet werden soll:
Option Explicit
' Klasse soll Ereignisse eines Objekts vom Typ CommandButton bereitstellen
Public WithEvents clButton As MSForms.CommandButton
Private Sub clButton_Click()
' UserForm entsprechend Tag-Inhalt + 1 des CommandButton wird gestartet
UserForms.Add(Application.VBE.ActiveVBProject.VBComponents("UserForm" & clButton.Tag + 1). _
Name).Show
End Sub
Im Inizialize-Ereignis des UserForms musst du die Klasse - also den Container für die Steuerelemente - erstellen und musst die während der Laufzeit erstellten CommandButton der Klasse zuweisen (siehe Kommentare an entsprechender Stelle):
Option Explicit
' Klasse (Conatiner für die CommandButton) mit Namen clsButton definieren
Dim arrButtons() As New clsButton
Private Sub UserForm_Initialize()
Dim i As Integer, cmb As MSForms.CommandButton
Dim h As Long, w As Long, a As Long, m As Long
a = Cells(Rows.Count, 1).End(xlUp).Row 'Anzahl Buttons
w = 100 'Breite
h = 40 'Höhe
m = 1 'in einer Reihe
' Größe der Klasse festlegen, d.h. wie viele CommandButton aufgenommen werden sollen
ReDim arrButtons(0 To a - 1)
For i = 1 To a
Set cmb = Me.Controls.Add("Forms.CommandButton.1", "cmd" & 1, True)
cmb.Width = w
cmb.Height = h
cmb.Left = ((i) Mod m) * 50
cmb.Top = (((i - 1) - ((i - 1) Mod m)) / m) * h
cmb.Caption = Cells(i, 1)
cmb.Tag = i
' erstellten Button der Klasse zuweisen
Set arrButtons(i - 1).clButton = cmb
Next i
UserForm1.cmbOK.Top = (a / m) * h + h '+ h
UserForm1.cmbOK.Width = w 'm * h + h
UserForm1.Width = w + 2 ' m * w + w + 10
UserForm1.Height = UserForm1.cmbOK.Top + h + 10
End Sub