Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Klick-Event in Klassenmodul

Forumthread: Klick-Event in Klassenmodul

Klick-Event in Klassenmodul
15.08.2016 09:22:20
Martin
In einem Klassenmodul wird dynamisch ein Button erzeugt. Das Klick-Ereignis auf den Button soll in der Klasse bearbeitet werden. Das funktioniert leider nicht. Folgendes habe ich probiert:
Ich habe eine Userform mit einem Frame Frame1. Beim Initialisieren wird die Methode AddIntoFrame aus meiner Klasse CTimePicker aufgerufen, die in Frame1 einen Button einfügt:
Option Explicit
Private Sub UserForm_Initialize()
Dim TP As New CTimePicker
TP.AddIntoFrame Me.Frame1
End Sub

Die Klasse sieht so aus:
Option Explicit
Private WithEvents B As MSForms.CommandButton
Public Sub AddIntoFrame(ByVal F As MSForms.Frame)
Set B = F.Controls.Add("Forms.CommandButton.1", "cmd1")
B.Caption = "Taste B"
End Sub
Private Sub B_Click()
MsgBox B.Caption & " was pressed!"
End Sub

Die Methode AddIntoFrame fügt wie gewünscht einen Button B in den als Parameter übergebenen Frame F ein. Klickt man auf den Button, sollte B_Click ausgeführt werden. Das klappt leider nicht, obwohl B als WithEvents deklariert ist. Wo liegt der Fehler?
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Klick-Event in Klassenmodul
15.08.2016 09:29:30
Hajo_Zi
die CommandButton werden nicht in der Klasse erstellet sondern in der UserForm, oder sehe ich das falsch?
Die Klasse macht die Verarbeitung der Aktionen, oder sehe ich das auch falsch?

AW: Klick-Event in Klassenmodul
15.08.2016 09:49:22
Nepumuk
Hallo,
du musst im Userform eine Instanz der Klasse erstellen und den Commandbutton zuweisen. Dein Ansatz ist daher falsch.
Gruß
Nepumuk
Anzeige
AW: Klick-Event in Klassenmodul
15.08.2016 14:18:09
snb
Und das alles scheint mir viel zu kompliziert für eine einfache Aufgabe.
AW: Klick-Event in Klassenmodul
15.08.2016 14:21:07
Martin
Richtig. Es gibt eine Userform, darin ein Frame. Die Methode im Klassenmodul erhält als Parameter den Frame und schreibt dort dynamisch einen Button rein (in der finalen Anwendung natürlich mehr). Das Klick-Ereignis auf dem Button soll im Klassenmodul verarbeitet werden.
Hintergrund: Es gab füher in Excel standardmäßig die Klasse "DateTimePicker". Die hat in einem Rahmen in einer userform einen Kalender reingeschrieben (31 Tasten) und die Klicks verarbeitet. Ähnlich soll meine Anwendung laufen: Die Klasse schreibt in einen Rahmen der Userform Tasten und reagiert auf deren Klick.
Anzeige
AW: Klick-Event in Klassenmodul
15.08.2016 14:30:13
Planlos
Hallo
eigentlich haste es ja schon, nur musst du deine Klasse in der Userform auch am Leben erhalten, denn so wie jetzt wird sie ja am Ende von UserForm_Initialize() wieder zerstört.
Option Explicit
Private TP As CTimePicker

Private Sub UserForm_Initialize()
Set tp = new CTimePicker
TP.AddIntoFrame Me.Frame1
End Sub

Anzeige
AW: Klick-Event in Klassenmodul
15.08.2016 16:42:14
Martin
Ganz herzlichen Dank an "Planlos". Genau das war das Problem, dass die Deklaration der Klasse natürlich außerhalb der Init-Prozedur erfolgen muss, damit sie später für den Event noch vorhanden ist. Vollkommen logisch und leicht zu fixen. Problem gelöst.
;
Anzeige
Anzeige

Infobox / Tutorial

Klick-Event in Klassenmodul von VBA UserForms


Schritt-für-Schritt-Anleitung

Um ein Klick-Ereignis in einem Klassenmodul für einen dynamisch erzeugten Button in einer VBA UserForm zu implementieren, folge diesen Schritten:

  1. Erstelle die UserForm:

    • Füge ein Frame hinzu, das die dynamisch erzeugten Buttons aufnehmen soll.
  2. Erstelle die Klasse:

    • Definiere deine Klasse (z.B. CTimePicker) und füge den folgenden Code hinzu, um den Button zu erstellen:
    Option Explicit
    Private WithEvents B As MSForms.CommandButton
    
    Public Sub AddIntoFrame(ByVal F As MSForms.Frame)
       Set B = F.Controls.Add("Forms.CommandButton.1", "cmd1")
       B.Caption = "Taste B"
    End Sub
    
    Private Sub B_Click()
       MsgBox B.Caption & " was pressed!"
    End Sub
  3. Initialisiere die UserForm:

    • Im Code der UserForm musst du eine Instanz der Klasse erstellen und den Button hinzufügen:
    Option Explicit
    Private TP As CTimePicker
    
    Private Sub UserForm_Initialize()
       Set TP = New CTimePicker
       TP.AddIntoFrame Me.Frame1
    End Sub
  4. Testen:

    • Starte die UserForm und klicke auf den neuen Button. Das Klick-Ereignis (B_Click) sollte jetzt korrekt ausgelöst werden.

Häufige Fehler und Lösungen

  • Fehler: Klick-Ereignis wird nicht ausgeführt:

    • Lösung: Stelle sicher, dass die Instanz der Klasse (TP) außerhalb der UserForm_Initialize-Prozedur deklariert ist, damit sie nicht beim Verlassen der Prozedur gelöscht wird.
  • Fehler: Button wird nicht angezeigt:

    • Lösung: Überprüfe, ob das Frame korrekt in der UserForm platziert ist und ob der Button tatsächlich hinzugefügt wird.

Alternative Methoden

Falls du eine einfachere Möglichkeit suchst, um Klick-Ereignisse zu verwalten, kannst du auch die Buttons direkt im UserForm-Code definieren und die Click-Ereignisse dort behandeln, anstatt sie dynamisch zu erstellen. Dies könnte die Komplexität verringern, wenn nur wenige Buttons benötigt werden.


Praktische Beispiele

Hier ist ein einfaches Beispiel, das die oben genannten Schritte illustriert:

' Klasse: CTimePicker
Option Explicit
Private WithEvents B As MSForms.CommandButton

Public Sub AddIntoFrame(ByVal F As MSForms.Frame)
    Set B = F.Controls.Add("Forms.CommandButton.1", "cmd1")
    B.Caption = "Taste B"
End Sub

Private Sub B_Click()
    MsgBox B.Caption & " wurde gedrückt!"
End Sub

In der UserForm:

Option Explicit
Private TP As CTimePicker

Private Sub UserForm_Initialize()
    Set TP = New CTimePicker
    TP.AddIntoFrame Me.Frame1
End Sub

Tipps für Profis

  • Objektverwaltung: Halte deine Objekte sauber und achte darauf, dass du keine zurückgebliebenen Objekte hast, um Speicherlecks zu vermeiden.
  • Debugging: Nutze Debug.Print in den Klick-Ereignissen, um sicherzustellen, dass die Events wie gewünscht ausgelöst werden.
  • Erweiterbarkeit: Überlege, wie du deine Klasse erweitern kannst, um mehrere Buttons in einem Frame zu verwalten, ohne den Code zu duplizieren.

FAQ: Häufige Fragen

1. Warum wird das Klick-Ereignis nicht ausgelöst? Das Klick-Ereignis wird nicht ausgelöst, wenn die Instanz der Klasse am Ende der UserForm_Initialize-Prozedur gelöscht wird. Stelle sicher, dass die Klasse als Member-Variable deklariert ist.

2. Kann ich mehrere Buttons mit dieser Methode erstellen? Ja, du kannst die Methode AddIntoFrame so anpassen, dass sie mehrere Buttons erstellt, indem du eine Schleife verwendest, um die Buttons hinzuzufügen.

3. Welche Excel-Version wird benötigt? Die beschriebenen Funktionen sind in Excel VBA ab Version 2000 verfügbar. Stelle sicher, dass du eine kompatible Version verwendest, um die oben genannten Beispiele auszuführen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige