Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1948to1952
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Dynamische Buttons nach Fehler ohne Funktion

Dynamische Buttons nach Fehler ohne Funktion
15.10.2023 15:51:15
ExcelBallJunge
Hallo zusammen,

Da ich über die Suche nichts finden konnte (hier nicht und nicht in anderen Foren), möchte ich nun feststellen, ob ich grundsätzliche Verständnisprobleme mit Klassen habe oder es um normales Verhalten geht.

Folgende Anwendung: Ich habe dynamisch erstellte Buttons innerhalb eines Sheets, die einer Klasse zugeordnet sind und entsprechend in der Klasse definierte onClick Anweisungen ausführen. Unterschieden wird anhand des Namens (cmdButton_fct1 usw., nicht optimal aber zunächst pragmatisch).
Klassenmodul clsButton:
Option Explicit

Public WithEvents btnButton As MSForms.CommandButton
Private Sub btnButton_Click()
Dim dynStr As String
Dim lastRow As Integer
Dim rngLookup As Range
Dim FormLoc As String


'OnClick Code
[...]

End Sub


Die Sub, die den Button anlegt:


Public Sub ButtonCreate(TlName)
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"), "ButtonActivate"
End Sub


Und die Sub, die den Button zur Klasse zuweist:


Sub ButtonActivate()
Dim objButton As clsButton
Dim intCount As Integer
Dim colList As Collection
' alle Buttons initialisieren (Zuweisung zur Klasse und Hinzufügen zur Collection)
For intCount = 1 To Sheets("2Tab").OLEObjects.Count
If Left(Sheets("2Tab").OLEObjects(intCount).Name, 9) = "cmdButton" Then
Set objButton = New clsButton
Set objButton.btnButton = Sheets("2Tab").OLEObjects(intCount).Object
colList.Add objButton
End If
Next intCount
End Sub


Das klappt alles prima. Schließe und öffne ich die Mappe, muss die Zuweisung aller existenten Buttons zur Klasse erneut durchgeführt werden. Bei UserForms scheint hierfür eine initialize Funktion vorgesehen zu sein, ich habe mir in meinem Fall mit Auto_Open() und ButtonActivate() geholfen. Erste Frage: gibt es hier einen eleganteren Weg?

Nun die eigentliche Frage bzw. das eigentliche Problem: Ab und zu, ich würde sagen, jedes mal wenn ich während der Entwicklung einen Fehler in den Subs habe und ins Debugging wechsele, sind die bis dahin existenten Buttons ohne Funktion. Ich muss ButtonActivate() erneut aufrufen, damit die Methoden der Klasse wieder aufgerufen werden.
Vielleicht ist das Verhalten ganz normal und bei Fehlern und/oder Wechseln ins Debugging werden alle Klassen terminiert, jedoch konnte ich bislang keine Info dazu finden.


Vielen Dank für die Hilfe.

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dynamische Buttons nach Fehler ohne Funktion
15.10.2023 16:13:16
Alwin Weisangler
Hallo,

du musst die Klasse, da es sich um Oleobjects handelt, im Private Sub Workbook_Open() neu registrieren.
Da du ja mit Klassen schon weit zu sein scheinst, sollte dir folgendes helfen:
in einem allgmeinen Modul ein:


Option Explicit
Public btnButton As MSForms.CommandButton

Sub KlasseRegistrieren()
Dim ocBtn As OLEObject, i&
For Each ocBtn In ActiveSheet.OLEObjects
If ocBtn.OLEType = 2 Then
ReDim Preserve oleBtn(i)
Set oleBtn(i) = New clsCommandButton
Set oleBtn(i).btn = ocBtn.Object
i = i + 1
End If
Next ocBtn
End Sub

Diese rufst du dann im Workbook_open auf.
Sollte die Info nicht ausreichen, lade einfach mal die Datei anaymisiert hoch.

Gruß Uwe


Anzeige
AW: Dynamische Buttons nach Fehler ohne Funktion
15.10.2023 17:19:05
daniel
Hi
Wären für dynamische Buttons auf einem Tabellenblatt Formularfeldbuttons oder sonstige Grafikelemente nicht besser geeignet?

Denen kann man per OnAction-Befehl ein Makro aus einem allgemeinen Modul zuweisen, welches dann bei Klick ausgeführt wird.
Dabei kann dasselbe Makro mehreren Buttons zugewiesen werden.
Innerhalb eines solchen Makros kannst du dann über die Funktion Application.Caller den Namen des aufrufenden Buttons ermitteln.

Insgesamt scheint mir das etwas einfacher zu sein als Klassenprogrammierung für ActiveX-Steuerelemente, zumindest solange du lediglich das Click-Event benötigst.
Brauchst du auch andere Events, dann geht's nur über Klassenprogrammierung.

Gruß Daniel
Anzeige
AW: Dynamische Buttons nach Fehler ohne Funktion
15.10.2023 17:23:57
Alwin Weisangler
@Daniel,
da hast du allerdings recht.
Es kommt ja eher selten vor, dass mal jemand mit sowas um die Ecke kommt und da neige ich dann doch dazu mich draufzustürzen.

Gruß Uwe
AW: Dynamische Buttons nach Fehler ohne Funktion
15.10.2023 17:30:52
ExcelBallJunge
Da wäre ich mehr als glücklich mit, zumal man die Einschränkung auf Windows Systeme damit vermutlich umgehen kann.
Hieße also, in meiner ButtonCreate() müsste ich keine OLEObjects sondern Shapes(?) anlegen? Wie würde das Makro zugewiesen werden?

Ich habe wirklich lange nach "dynamischen Buttons in VBA" gesucht, vermutlich war der Fehler mich unbewusst auf Buttons festzulegen. Das führte immer zur Anwendung von Klassen und ist auch eher im Kontext UserForms zu Hause.

Vielen Dank bereits an dieser Stelle!
Anzeige
AW: Dynamische Buttons nach Fehler ohne Funktion
15.10.2023 17:49:17
daniel
Das Zuweisen eines Makros aus einem allgemeinen Modul funktioniert mit jeden Grafikelemente einfach über den Befehl:

DeinShape.OnAction = "Makroname"

Wenn man vorhandene Shapes mit einer Makrozuweisung kopiert und einfügt, hat auch das neue Shape diese Makrozuweisung.
Wenn du eine Vorlage kopierst und einfügst (was sowieso sinnvoll wäre, damit du die ganze Grafikeinstellungen die für alle gleich sind nicht programmieren musst), musst du auch kein Makro mehr zuweisen (wenn alle Buttons das gleiche Makro erhalten)

Gruß Daniel
AW: Dynamische Buttons nach Fehler ohne Funktion
15.10.2023 18:53:16
Alwin Weisangler
anbei mal die Datei mit der funktionierenden Klasse.
https://www.herber.de/bbs/user/163457.xlsm

Gruß Uwe
Anzeige
AW: Dynamische Buttons nach Fehler ohne Funktion
15.10.2023 19:07:56
ExcelBallJunge
1000 Dank und Danke auch Uwe für seine Mühen. Aber ohne Klassen läuft das für mich viel einfacher und nachvollziehbarer. Code ist umgeschrieben und stabil.

Beste Grüße!
AW: Dynamische Buttons nach Fehler ohne Funktion
15.10.2023 16:20:48
Alwin Weisangler
Sorry für die Schreibfehler. Das passiert, wenn man versucht es mit dem Tablett zu machen.

in ein allgmeines Modul ein:



Option Explicit
Public btnButton As MSForms.CommandButton

Sub KlasseRegistrieren()
Dim ocBtn As OLEObject, i&
For Each ocBtn In ActiveSheet.OLEObjects
If ocBtn.OLEType = 2 Then
ReDim Preserve oleBtn(i)
Set oleBtn(i) = New clsCommandButton
Set oleBtn(i).btn = ocBtn.Object
i = i + 1
End If
Next ocBtn
End Sub


Diese rufst du dann im Workbook_open auf.
Sollte die Info nicht ausreichen, lade einfach mal die Datei anonymisiert hoch. Ich hoffe jetzt ist es ohne Fehler.

Gruß Uwe
Anzeige
AW: Dynamische Buttons nach Fehler ohne Funktion
15.10.2023 16:53:57
ExcelBallJunge
Hallo,

zunächst einmal vielen Dank für deine schnelle Antwort. Allerdings hast du mich spätestens beim zweiten Post abgehangen... die Subs von dir sind zumindest für mich und mein NPP identisch ;-)
Hochladen der Datei ist schwierig, weil alles etwas verwoben ist, wenn ich nicht drumherum komme, versuche ich es auseinanderzupflücken.
Das mit den Klassenkenntnissen geht so, ich musste mich gestern zum ersten Mal zwingenderweise damit auseinandersetzen.

Trotzdem habe ich dazu Fragen:
oleBtn ist bei dir nicht definiert, jedenfalls meckert VBA, dass die Variable nicht definiert sei. Als was müsste oleBtn den instanziiert oder initialisiert werden?
Inhaltlich scheint das selbe wie in meinem ButtonActivate() zu passieren, mit dem Unterschied, dass oleBtn selbst als Objekt der Klasse erstellt wird (clsCommandButton bei dir, clsButton bei mir). Das Objekt oleBtn existiert in mehreren Instanzen mit jeweils einem Member btn, dem jeweils wiederum ein OLEObject zugewiesen wird, ist das korrekt?

Viele Grüße!

Anzeige
AW: Dynamische Buttons nach Fehler ohne Funktion
15.10.2023 17:20:03
Alwin Weisangler
Hallo,

ja, da hatte ich doch noch was übersehen.
Teste mal:


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 clsCommandButton
Set btnButton(i).btn = ocBtn.Object
i = i + 1
End If
Next ocBtn
End Sub


Gruß Uwe



AW: Dynamische Buttons nach Fehler ohne Funktion
15.10.2023 18:03:11
ExcelBallJunge
Der Vollständigkeit halber: VBA erwartet hier ein Datenfeld, mit Public btnButton As MSForms.CommandButton haut das leider auch nicht hin.#

Viele Grüße!
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige