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.