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

Forumthread: dynamische Button Click-Event

dynamische Button Click-Event
Patrick
Hallo liebe VBA-Kenner,
ich stehe wiedermal vor einem kleinen Problem, bei dem mir bisher auch das große weite Internet nicht helfen konnte.
Ich erstelle während der Laufzeit in einer Userform Commandbuttons:
Private Sub UserForm_Initialize()
Dim mycmdbtn As MSForms.CommandButton
Set mycmdbtn = Me.Controls.Add("Forms.CommandButton.1", "cmd" & i, True)
With mycmdbtn
.Left = 336
.Height = 24
.Top = 84
.Width = 30
.Font.Size = 18
End With
End
Nun will ich auf das Click-Event des soeben erstellten Buttons zugriff erhalten, aber das geht natürlich nicht über "Sub mycmdbtn_Click()", da er den ja vorher noch nicht kennt. Im Internet habe ich dann Dinge wie "AddHandler mycmdbtn.Click, Adressof Prozedur_fuer_click" gefunden, allerdings beziehen die sich immer auf vb.net...ich hab aber nur VB 6.5. Was kann ich nun machen?
Zur Info: Ich brauche das Userform zur Eingabe von Baugruppen eines Moduls...da nicht jedes Modul gleich viele Baugruppen enthält muss das daher dynamisch sein. Der Button den ich erstelle steht für den "Eine Baugruppe hinzufügen"-Button...ich hoffe das war verständlich. Falls sich das obige nicht unter VB 6.5 lösen lässt....seht ihr andere Möglichkeiten einer solchen dynamischen Eingabe, die angenehm und übersichtlich für den Nutzer ist?
Vielen Dank für Eure Mühen im Voraus!!!!!!!
Patrick
Anzeige
AW: dynamische Button Click-Event
07.09.2009 10:29:58
JogyB
Hi.
Ich sehe zwei Möglichkeiten:
1. Du schreibst die entsprechenden Ereignisprozeduren einfach schon mal in den Code der Tabelle. Ob der Button da ist oder nicht interessiert ja nicht weiter. Du mußt dann nur die Buttons sauber benennen, damit es keine Probleme gibt.
2. Du erzeugst den Code zur Laufzeit, siehe http://www.office-loesung.de/ftopic229690_0_0_asc.php
Gruss, Jogy
Anzeige
AW: dynamische Button Click-Event
07.09.2009 10:44:10
Patrick
Danke für die schnelle Antwort.
1.) habe ich probiert....das geht aber nicht, wahrscheinlich weil bei Codeerstellung noch kein solcher Button (cmd1) vorhanden ist und VB deswegen denkt es wäre ne normale Prozedur. Ergebnis ist, dass das Programm auf das Klicken des Buttons leider nicht reagiert.
2.) in dem Link finde ich nur Hilfestellungen zum löschen von Code, aber nichts zum hinzufügen
Patrick
Anzeige
AW: dynamische Button Click-Event
07.09.2009 10:57:20
JogyB
Hi.
1. Hast recht... habe das nur mit einem nachträglich hinzugefügten Button getestet und da ging es
2. Schau in dem Forum mal über dem "Thread erstellen"-Button, da gibt es ein "zurück" und ein "weiter". Damit kommst Du zu den anderen Themen.
3. Eine Möglichkeit wäre auch noch eine Klasse, der Du die CommandButtons nach Erstellung zuweist. Dort könntest Du dann über den Namen des Buttons den auszuführenden Code ermitteln.
So spontan würde ich 3. nehmen, Code während der Laufzeit einzufügen ist ein ziemliches Gefummel.
Gruss, Jogy
Anzeige
AW: dynamische Button Click-Event
07.09.2009 11:14:16
Patrick
Ich habs mit dem Code einfügen probiert und es kam "der programatische Zugriff auf Visual Basic ist nicht sicher" als Fehlermeldung.
Ich glaube ich werde mir Gedanken über eine andere Art der Realisierung machen müssen! Es sei denn jemand hat noch ne Idee?
Viele Grüße
Patrick
AW: dynamische Button Click-Event
07.09.2009 11:28:08
JogyB
Hi.
In der Tabelle Extras - Makros - Sicherheit - Vertrauenswürdige Herausgeber
Haken bei "Zugriff auf Visual Basis-Projekt vertrauen" setzen.
Und mach es über die Klasse, das ist wesentlich einfacher.
Gruss, Jogy
Anzeige
AW: dynamische Button Click-Event
07.09.2009 11:39:32
Patrick
Das mit dem Hinzufügen klappt...allerdings nicht in den Codeteil vom Userform sondern als extramodul.
Könntest du mir bzgl der Klassenerstellung auf die Sprünge helfen oder eine Seite an die Hand geben wo ich etwas ähnliches nachvollziehen kann? Leider habe ich nämlich keinen Schimmer wie das gehen soll :-(
VIELEN DANK!
Patrick
Anzeige
AW: dynamische Button Click-Event
07.09.2009 11:45:31
JogyB
Hi.
Mal ein Beispiel:
Erstelle ein Klassenmodul mit dem Namen cls_Test
Dort kommt dann folgender Code rein:
Option Explicit
Public WithEvents myCmd As MSForms.CommandButton
Private Sub myCmd_Click()
MsgBox (myCmd.Name & " gedrückt")
End Sub
In den Code des Formulars kommt dann folgendes:
Option Explicit
Dim myColl As New Collection
Private Sub UserForm_Initialize()
Dim myClass As cls_Test
Set myClass = New cls_Test
Set myClass.myCmd = Me.Controls.Add("Forms.CommandButton.1", "cmd_Test" & 2, True)
With myClass.myCmd
.Left = 336
.Height = 24
.Top = 84
.Width = 30
.Font.Size = 18
End With
myColl.Add myClass
End Sub
Das "Set myClass as New cls_Test" muss vor jede Zuweisung eines Objekts an die Klasse, da sonst die alte Zuweisung überschrieben wird.
Gruss, Jogy
Anzeige
AW: dynamische Button Click-Event
07.09.2009 12:12:53
Patrick
Wie geil ist das denn....es geht tatsächlich!
Könntest du mir jetzt noch erklären was ich da eigentlich gemacht habe? *schämfürdieFrage*
Vielen Vielen Dank!
Patrick
AW: dynamische Button Click-Event
07.09.2009 13:12:09
JogyB
Hi.
Eine Klasse erlaubt Dir, allgemeine Ergeignisprozeduren für von Dir gewählte Elemente zu verfassen.
Im konkreten Fall legst Du eine Klasse an, definierst in ihr einen CommandButton mit Ereignissen (dafür das WithEvents) und schreibst für diesen eine Prozedur für das Click-Ereignis.
Damit das ausgeführt wird, mußt Du den/die entsprechenden Command-Button(s) noch der Klasse zuordnen. Das passiert hier gleich bei der Erstellung des Buttons.
Damit das auch für mehrere geht, benutze ich noch eine eine Collection, in der alle Steuerelemente, die der Klasse zugeordnet, gesammelt werden. Ginge auch mit einem Array, ich mag die Collection aber lieber, da ich mir dann keine Gedanken über die Dimensionierung machen muss. Die Collection ist global für das UF definiert, da sie ja immer zur Verfügung stehen muss.
Wichtig ist auch noch das Set ... = New cls_Test. Damit erzeugst Du eine neue Instanz der Klasse. Das ist deswegen notwendig, weil Du sonst bei mehreren Elementen (in Deinem Fall CommandButtons) immer dieselbe Instanz der Klasse überschreiben würdest, so dass letztendlich nur das zuletzt hinzugefügte Element in der Collection wäre. Du könntest das New auch gleich in die Variablendeklaration schreiben, aber das würde dann nur die erste Instanz automatisch erzeugen. Anders wäre es, wenn Du statt der Collection einen Array verwendest, in dem Du die Elemente sammelst, da sollte das New in der Deklaration stehen, dann kannst Du es Dir im weiteren sparen.
Gruss, Jogy
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Dynamische Button Click-Events in Excel VBA


Schritt-für-Schritt-Anleitung

Um ein dynamisches Button Click-Event in einer Excel VBA Userform zu implementieren, kannst du folgende Schritte befolgen:

  1. Erstelle eine neue Userform in Excel.

  2. Füge ein Klassenmodul hinzu:

    • Gehe zu "Einfügen" -> "Klassenmodul".
    • Benenne das Klassenmodul z.B. cls_Test.
  3. Füge folgenden Code in das Klassenmodul ein:

    Option Explicit
    Public WithEvents myCmd As MSForms.CommandButton
    
    Private Sub myCmd_Click()
       MsgBox (myCmd.Name & " gedrückt")
    End Sub
  4. Füge den folgenden Code in das Userform ein:

    Option Explicit
    Dim myColl As New Collection
    
    Private Sub UserForm_Initialize()
       Dim myClass As cls_Test
       Set myClass = New cls_Test
       Set myClass.myCmd = Me.Controls.Add("Forms.CommandButton.1", "cmd_Test" & 2, True)
       With myClass.myCmd
           .Left = 336
           .Height = 24
           .Top = 84
           .Width = 30
           .Font.Size = 18
       End With
       myColl.Add myClass
    End Sub
  5. Starte die Userform. Wenn du auf den Button klickst, wird eine MessageBox angezeigt, die den Namen des Buttons zeigt.


Häufige Fehler und Lösungen

  • Fehler beim Hinzufügen von Code: Wenn du beim Versuch, Code zur Laufzeit hinzuzufügen, die Meldung "Der programatische Zugriff auf Visual Basic ist nicht sicher" erhältst, prüfe die Einstellungen unter "Extras" -> "Makros" -> "Sicherheit". Setze das Häkchen bei "Zugriff auf Visual Basic-Projekt vertrauen".

  • Button reagiert nicht: Achte darauf, dass du die Buttons korrekt benennst. Andernfalls kann es zu Namenskonflikten und unerwartetem Verhalten kommen.


Alternative Methoden

Eine weitere Möglichkeit, um mit VBA Userform Command Button Click Events umzugehen, ist die Verwendung von Arrays anstelle von Collections. Dies kann nützlich sein, wenn du eine festgelegte Anzahl von Buttons hast:

Dim myButtons(1 To 10) As cls_Test

Erstelle und initialisiere die Buttons in einer Schleife, um redundanten Code zu vermeiden.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie du mehrere VBA Excel Button Click Events dynamisch erstellen kannst:

Private Sub UserForm_Initialize()
    Dim i As Integer
    For i = 1 To 5
        Dim myClass As cls_Test
        Set myClass = New cls_Test
        Set myClass.myCmd = Me.Controls.Add("Forms.CommandButton.1", "cmd" & i, True)
        With myClass.myCmd
            .Caption = "Button " & i
            .Left = 10
            .Top = 10 + (i * 30)
            .Width = 100
        End With
        myColl.Add myClass
    Next i
End Sub

Tipps für Profis

  • Verwende WithEvents: Damit kannst du Ereignisse für Objekte in einer Klasse definieren, was die Handhabung von VBA Button Click Events erheblich vereinfacht.

  • Verwende Collections: Sie sind nützlich, um dynamisch erstellte Objekte zu verwalten und zu speichern.

  • Testen der Userform: Teste die Userform gründlich, um sicherzustellen, dass alle dynamisch erstellten Buttons wie gewünscht funktionieren.


FAQ: Häufige Fragen

1. Warum funktioniert mein Button Click Event nicht? Stelle sicher, dass der Button korrekt benannt und dem Klassenmodul zugewiesen wurde. Überprüfe auch, ob das Zugriffsrecht auf Visual Basic-Projekt gesetzt ist.

2. Wie kann ich mehrere Buttons gleichzeitig erstellen? Du kannst eine Schleife verwenden, um mehrere Buttons zu erstellen und in einer Collection zu speichern, wie im praktischen Beispiel gezeigt.

3. Kann ich auch HTML-Buttons in Excel verwenden? In Excel VBA ist die Verwendung von HTML-Buttons nicht direkt möglich. Du kannst jedoch ähnliche Funktionalitäten mit VBA Userform Command Buttons erreichen.

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