Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

CommandButtons in Tabelle erstellen und über Klasse ansprech

Forumthread: CommandButtons in Tabelle erstellen und über Klasse ansprech

CommandButtons in Tabelle erstellen und über Klasse ansprech
20.12.2024 09:11:48
sigiF
Guten Morgen,
warum wird das Click Ereignis nicht ausgelöst?
Danke!
Gruß Sigi

'Standard Modul
Option Explicit
Option Compare Text
Dim Buttons() As New clsButton

Sub TicketButtons()
Dim ws As Worksheet
Dim i As Long
Dim btn As MSForms.CommandButton
Dim TicketInfo As Variant
Call DeleteTicketButtons
' Arbeitsblatt festlegen
Set ws = ThisWorkbook.Sheets("Start")

' Ticketinformationen (Zeile, URL, Suchtext)
TicketInfo = Array( _
Array(2, "https://www.vrs.de/fileadmin/01_Tickets/Downloads_und_Informationen/Preistabelle_Regeltarif_und_HandyTicket_01012025.pdf", "Preisübersicht :"), _
Array(3, "https://www.vrs.de/tickets/ticket-finden/einzelticket", "EinzelTicket : VRS Website"), _
Array(4, "https://www.vrs.de/tickets/ticket-finden/4erticket", "4erEinzelTicket : VRS Website"))


' Schaltflächen erstellen
For i = LBound(TicketInfo) To UBound(TicketInfo)
Set btn = ws.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Left:=ws.Cells(TicketInfo(i)(0), 3).Left, _
Top:=ws.Cells(TicketInfo(i)(0), 3).Top, _
Width:=100, Height:=20).Object
btn.Caption = Split(TicketInfo(i)(2), ":")(0)

'Schaltfläche in Klasse einfügen
ReDim Preserve Buttons(1 To i + 1)
Set Buttons(i + 1).btn = btn
Buttons(i + 1).TicketURL = TicketInfo(i)(1)
Buttons(i + 1).TicketSuch = TicketInfo(i)(2)
Next i

End Sub


Sub DeleteTicketButtons()
Dim ws As Worksheet
Dim i As Long

' Arbeitsblatt festlegen
Set ws = ThisWorkbook.Sheets("Start")

' Alle Schaltflächen löschen
On Error Resume Next
For i = LBound(Buttons) To UBound(Buttons)
On Error Resume Next
ws.OLEObjects(Buttons(i).btn.Name).Delete
On Error GoTo 0
Next i

' Array zurücksetzen
Erase Buttons
End Sub

'Klassenmodul Name clsButton
Option Explicit
Option Compare Text

Public WithEvents btn As MSForms.CommandButton
Public TicketURL As String
Public TicketSuch As String

Private Sub btn_Click()
MsgBox "Klasse: clsButton"
Call Browser_Open(TicketURL, TicketSuch)
End Sub
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: CommandButtons in Tabelle erstellen und über Klasse ansprech
20.12.2024 09:55:13
Alwin Weisangler
Hallo,

du musst der Registrierung der Klassenobjekte (OleObjectButtons) Zeit geben und nicht in einem Rutsch. Das ist leider so.
Erzeuge deine Buttons und registriere via:


Application.OnTime Now + TimeValue("00:00:01"), "KlasseRegistrieren"

danach deine Objekte in der Klasse.

Beispielhaft so (ungetestet):



Option Explicit
Public btnButton() As clsButton

Sub ButtonnamenErzeugen()
ButtonCreate 1
End Sub

Public Sub ButtonCreate(TlName)
Dim btnName&
On Error Resume Next
'Button eindeutig entsprechend TL bennen und evtl vorhandene Buttons löschen
btnName = "cmdButton_" & TlName
Sheets("2Tab").Shapes(btnName).Delete
' Button anlegen
With Sheets("2Tab").OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Height:=20)
.Name = btnName
.Object.Caption = TlName & ": Pauschalpreis übernehmen"
End With
' Buttons minimal verzögert initialisieren
Application.OnTime Now + TimeValue("00:00:01"), "KlasseRegistrieren"
End Sub
allgemeines Modul:
Sub KlasseRegistrieren()
Dim ocBtn As OLEObject, i&
For Each ocBtn In ActiveSheet.OLEObjects
If ocBtn.OLEType = 2 Then
ReDim Preserve btnButton(i)
Set btnButton(i) = New clsButton
Set btnButton(i).btnButton = ocBtn.Object
i = i + 1
End If
Next ocBtn
End Sub


Klasse (clsButton):


Option Explicit
Public WithEvents btnButton As MSForms.CommandButton

Private Sub btnButton_Click()
MsgBox "hier bin ich"
End Sub


Gruß Uwe
Anzeige
AW: CommandButtons in Tabelle erstellen und über Klasse ansprech
20.12.2024 10:16:56
Ulf
Hi,
deine Klasse wird implizit erzeugt, stellt man erst die Klasse zur Verfügung feuern die Button auch


Option Explicit
Option Compare Text
'Unbedeutendes New
Dim Buttons() As New clsButton

Sub TicketButtons()
Dim ws As Worksheet
Dim i As Long
Dim btn As MSForms.CommandButton
Dim TicketInfo As Variant
Call DeleteTicketButtons
' Arbeitsblatt festlegen
Set ws = ThisWorkbook.Sheets(1)
' Ticketinformationen (Zeile, URL, Suchtext)
TicketInfo = Array( _
Array(2, "https://www.vrs.de/fileadmin/01_Tickets/Downloads_und_Informationen/Preistabelle_Regeltarif_und_HandyTicket_01012025.pdf", "Preisübersicht :"), _
Array(3, "https://www.vrs.de/tickets/ticket-finden/einzelticket", "EinzelTicket : VRS Website"), _
Array(4, "https://www.vrs.de/tickets/ticket-finden/4erticket", "4erEinzelTicket : VRS Website"))
' Schaltflächen erstellen
For i = LBound(TicketInfo) To UBound(TicketInfo)
Set btn = ws.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Left:=ws.Cells(TicketInfo(i)(0), 3).Left, _
Top:=ws.Cells(TicketInfo(i)(0), 3).Top, _
Width:=100, Height:=20).Object
btn.Caption = Split(TicketInfo(i)(2), ":")(0)
'Schaltfläche in Klasse einfügen
ReDim Preserve Buttons(1 To i + 1)
Set Buttons(i + 1) = New clsButton
Set Buttons(i + 1).btn = btn
Buttons(i + 1).TicketURL = TicketInfo(i)(1)
Buttons(i + 1).TicketSuch = TicketInfo(i)(2)
Next i
End Sub

Sub DeleteTicketButtons()
Dim ws As Worksheet
Dim i As Long
' Arbeitsblatt festlegen
Set ws = ThisWorkbook.Sheets(1)
' Alle Schaltflächen löschen
On Error Resume Next
For i = LBound(Buttons) To UBound(Buttons)
On Error Resume Next
ws.OLEObjects(Buttons(i).btn.Name).Delete
On Error GoTo 0
Next i
' Array zurücksetzen
Erase Buttons
End Sub

hth
Ulf
Anzeige
AW: CommandButtons in Tabelle erstellen und über Klasse ansp
20.12.2024 10:50:22
sigiF
Hallo,
danke erstmal für Eure Hilfe.
Leider funktioniert es nicht!

Die folgenden Verweise aktiviert sind:

Microsoft Forms 2.0 Object Library
Microsoft HTML Object Library
Microsoft Internet Controls
Microsoft XML, v6.0
Das Klassenmodul lautet "clsButton"
Option Explicit
Option Compare Text

Public WithEvents btn As MSForms.CommandButton
Public TicketURL As String
Public TicketSuch As String

Private Sub btn_Click()
MsgBox "Klasse: clsButton"
' Call Browser_Open(TicketURL, TicketSuch)
End Sub

Die Buttons werden erzeugt, jedoch kein Ereignis!
Auch wenn ich das Beispiel von Uwe verwende keine Reaktion.
Danke!
Gruß Sigi
Anzeige
AW: CommandButtons in Tabelle erstellen und über Klasse ansp
20.12.2024 15:29:45
Alwin Weisangler
Hallo,

so jetzt habe ich mal etwas Zeit. Ich habe die Sache aufgeräumt und in den On Error Kram rausgeworfen. Das benötigt man eigentlich nur höchst selten.
Des Weiteren habe ich die Variablen via Property angelegt.

https://www.herber.de/bbs/user/174450.xlsm

Momentan, da alle Elemente (OleButtons) der Klasse gelöscht werden, habe ich den Weg via Erase die Klasse komplett zu entladen drin gelassen. Das kann man in diesem Beispiel so machen, ist aber nicht unbedingt auf andere Konstellationen übertragbar und ist mit Vorsicht zu betrachten.
Ich hoffe es hilft dir weiter.

Gruß Uwe
Anzeige
AW: CommandButtons in Tabelle erstellen und über Klasse ansp
20.12.2024 15:35:31
sigiF
Hallo Uwe,
vielen Dank!
Gruß
Sigi
AW: CommandButtons in Tabelle erstellen und über Klasse ansprech
20.12.2024 10:00:31
Alwin Weisangler
Ach ja, bei solchen Sachen ist sauber programmierte Fehlerbehandlung eine Grundbedingung. Also besser kein On Error, wenn dies auf normalen Wegen (was fast immer sich so lösen lässt) behandelbar ist.

Gruß Uwe
Anzeige
Anzeige