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

Forumthread: Dynamisch erstelltem Button ein Makro zuweisen

Dynamisch erstelltem Button ein Makro zuweisen
18.02.2017 13:45:25
Sascha
Hallo an alle Excel Interresierte,
ich habe eine ganze Weile Tante Google genervt aber ich komm immer wieder bei den gleichen Seiten raus und das MSDN DevCenter hilft mir auch nicht wirklich weiter :(
Wie kann ich einem CommandButton Objekt einen Prozeduraufruf zuweisen?
Die Eigenschaft .OnClick oder .OnAction scheint mir naheliegend aber wie genau funktioniert das?
Ich habe folgende Beispielprozedur (auf das relevante gekürzt), die direkt beim Anzeigen einer UserForm mit der Übergabe des Werts "1" aufgerufen wird.
Private Sub Neu(Zeile)
Dim VarControl As Control
Dim VarTop, VarTab As Integer
VarTop = 72 + ((Zeile - 1) * 24)
VarTab = 0 - 3 + (Zeile * 4)
'CommandButton: MEHR
Set VarControl = Me.Controls.Add("Forms.CommandButton.1", "Mehr" & Zeile, True)
With VarControl
.Height = 18
.Width = 72
.Top = VarTop
.Left = 426
.Caption = "Mehr"
.TabIndex = VarTab + 3
End With
End Sub

Der so erstellte CommandButton soll nun mit einem Ereignis belegt werden. Das Ereignis soll die gleiche Prozedur (Neu(Zeile)) erneut aufrufen. Einziger Unterschied ist, dass nun der Wert "2" an die Prozedur übergeben werden soll.
Funktioniert das irgendwie oder gibt es Alternativvorschläge?
Vielen Dank schonmal im Vorraus ;)
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bsp-Script
18.02.2017 13:55:54
Fennek
Hallo,
anbei mein Muster-Script für diese Aufgabe:

Sub Angelegen()
With ActiveSheet.CheckBoxes
For i = 8 To 208
.Add(Cells(i, "J").Left, Cells(i, "J").Top, 0, 0).Select
Selection.Caption = ""
Selection.OnAction = "Tabelle1.Kontrollkästchen_Klicken" 'im Kopf des sheets
Selection.LinkedCell = Cells(i, "K")
Next i
End With
End Sub
mfg
Anzeige
AW: Bsp-Script
18.02.2017 14:45:11
Sascha
Hallo Fennek,
danke für deine Antwort.
Du arbeitest mit Zellwerten und -bezügen. Ich habe erstmal nur eine UserForm erstellt, in der Textfelder, Comboboxen und Schaltflächen enthalten sein sollen. Das ganze soll dynamisch erstellt werden. Dafür benutze ich die Prozedur 'Neu(Zeile)', wobei "Zeile" nichts mit den Zeilenangaben eines Sheets zu tun hat. Initial wird die Prozedur "Neu(1)" aufgerufen.
Wie kann einer, durch diese Prozedur erstellten Schaltfläche, einen Prozeduraufruf für das Ereignis zuweisen, dass beim Klicken der Schaltfläche eintritt? Und dann eben nicht irgendeine Prozedur, sondern die gleiche nochmal, nur eben mit einer anderen Variable, die übergeben wird: In diesem Fall dann "Neu(2)".
So in der Art wie (stark verkürzt dargestellt):
Private Sub Neu(Zeile)
Set VarControl = Me.Controls.Add("Forms.CommandButton.1", "Mehr" & Zeile, True)
With VarControl
.OnClick = Neu(Zeile + 1)
End With
End Sub

Anzeige
Demo dynam. erzeugter CmdBtn mit Makro
19.02.2017 00:31:46
littletramp
Hallo Sascha
Ich habe dir eine Demo erstellt, die zeigt wie es geht https://www.herber.de/bbs/user/111569.xlsm
Die Demo besteht aus einem Klassenmodul, einer (leeren) UserForm und einem Standardmodul.
Hier der Code in den einzelnen Modulen:
Klassenmodul: clsCmdButton
Option Explicit
Public WithEvents CmdButton As MSForms.CommandButton
Private Sub CmdButton_Click()
Dim i As Integer
Dim proc As String, arg As String
i = InStr(CmdButton.Tag, ",")
If i = 0 Then      ' ohne Argument
proc = CmdButton.Tag
Application.Run proc
Else               ' mit Argument
proc = Left(CmdButton.Tag, i - 1)
arg = Right(CmdButton.Tag, Len(CmdButton.Tag) - i)
Application.Run proc, arg
End If
End Sub
UserForm: frmDynCmdButton

Option Explicit
Private ctlCmdButtons() As New clsCmdButton
Private Sub UserForm_Initialize()
Dim i As Integer
' Anzahl Buttons abfragen
Do
i = Application.InputBox(Prompt:="Anzahl Buttons [3..10]", Default:=5, Type:=1)
Loop While i  10
CreateDynamicButtons i
End Sub
Private Sub CreateDynamicButtons(intCount As Integer)
Dim i As Integer
Dim intTop As Integer
Dim ctlItem As Control
Const cintSpace = 5
Const cintWidth = 100
Const cintHeight = 20
Me.Caption = Me.Name
' Grösse der UserForm berechnen
intTop = cintSpace
Me.Height = 20 + intCount * cintHeight + (intCount + 1) * cintSpace
Me.Width = 5 + cintWidth + 2 * cintSpace
' CommandButtons erzeugen
For i = 1 To intCount
intTop = cintSpace + (i - 1) * (cintHeight + cintSpace)
' CommandButton erzeugen
Set ctlItem = Me.Controls.Add("Forms.CommandButton.1")
' CommandButton erzeugen
With ctlItem
.Top = intTop
.Left = cintSpace
.Width = cintWidth
.Height = cintHeight
' Beschriftung und ControlTipTexte festlegen
Select Case i
Case intCount
.Caption = "UserForm schliessen"
Case Else
.Caption = "Button " & i
End Select
' Aufzurufender Makro und Argumente festlegen -> Syntax: Makroname, Arg1, Arg2, ...
Select Case i
Case intCount       ' Schliessen-Button
.Tag = "UserFormClose"    ' Sub UserFormClose ohne Argument
Case Else
.Tag = "CmdButton, " & i  ' Sub CmdButton mit Argument, WICHTIG: mit Komma
End Select
End With
ReDim Preserve ctlCmdButtons(i - 1)
Set ctlCmdButtons(i - 1).CmdButton = ctlItem
Next
End Sub
Standardmodul: modHandleCmdBtn
Option Explicit
Public Sub ShowUserForm()
frmDynCmdButton.Show
End Sub
' Prozeduren, die von den dynamischen
' Schaltflächen aufgerufen werden
Public Sub CmdButton(Nummer As Integer)
MsgBox "Argument: " & Nummer
End Sub
Public Sub UserFormClose()
Unload frmDynCmdButton
End Sub
Gruss Markus
Anzeige
AW: Demo dynam. erzeugter CmdBtn mit Makro
19.02.2017 14:42:43
Sascha
Ah, vielen Dank, Markus. Das hat mir gut weiter geholfen.
Ich bin noch nicht so fit in der VBA Programmierung, da kommt mir der von dir geschriebene Code schon gut entgegen. Nach Anpassungen an meine Anforderungen habe ich dadurch gleich mehrere Probleme mit einmal aus dem Weg räumen und viele Zeilen mit komplizierten Umwegen sparen können.
Danke, danke, danke ;)
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Dynamisch erstelltem Button ein Makro zuweisen


Schritt-für-Schritt-Anleitung

Um einen dynamisch erstellten CommandButton in Excel VBA mit einem Makro zu versehen, befolge diese Schritte:

  1. Öffne den VBA-Editor: Drücke ALT + F11 in Excel.

  2. Erstelle ein neues Modul: Klicke mit der rechten Maustaste im Projekt-Explorer und wähle Einfügen > Modul.

  3. Füge den folgenden Beispielcode ein:

    Private Sub Neu(Zeile As Integer)
       Dim VarControl As Control
       Set VarControl = Me.Controls.Add("Forms.CommandButton.1", "Mehr" & Zeile, True)
       With VarControl
           .Height = 18
           .Width = 72
           .Top = 72 + ((Zeile - 1) * 24)
           .Left = 426
           .Caption = "Mehr"
           .OnAction = "Neu(" & Zeile + 1 & ")" ' Zuweisung des Makros
       End With
    End Sub
  4. Führe die Prozedur aus: Du kannst die Neu(1)-Prozedur aufrufen, um den ersten Button zu erstellen.

Mit dieser Methode kannst du die excel vba button funktion zuweisen, um den CommandButton ein Makro zuzuordnen.


Häufige Fehler und Lösungen

  • Fehler: Der Button reagiert nicht auf Klicks.

    • Lösung: Stelle sicher, dass die .OnAction-Eigenschaft korrekt gesetzt ist. Der angegebene Makroname muss existieren.
  • Fehler: Der Button wird nicht dynamisch erstellt.

    • Lösung: Überprüfe, ob die Prozedur, die den Button erstellt, tatsächlich aufgerufen wird.

Alternative Methoden

Eine alternative Methode zur Zuweisung von Makros zu CommandButtons ist die Verwendung von Klassenmodulen. Mit Klassenmodulen kannst du Ereignisse besser verwalten und mehrere Buttons effektiver steuern. Hier ein Beispiel:

  1. Erstelle ein Klassenmodul: Nenne es clsCmdButton.

  2. Füge den folgenden Code hinzu:

    Option Explicit
    Public WithEvents CmdButton As MSForms.CommandButton
    
    Private Sub CmdButton_Click()
       MsgBox "Button " & CmdButton.Caption & " wurde gedrückt."
    End Sub
  3. Verwende die Klasse in deinem Hauptmodul, um dynamische Buttons zu erstellen:

    Dim ctlCmdButtons() As New clsCmdButton
    
    Sub CreateDynamicButtons()
       Dim i As Integer
       For i = 1 To 5
           Dim btn As Control
           Set btn = UserForm1.Controls.Add("Forms.CommandButton.1")
           With btn
               .Caption = "Button " & i
               .Top = i * 30
               .Width = 100
           End With
           Set ctlCmdButtons(i - 1).CmdButton = btn
       Next i
    End Sub

Praktische Beispiele

Hier ist ein komplettes Beispiel, wie du einen Excel-Makro-Button erstellen und einem Makro zuweisen kannst:

Sub ShowUserForm()
    UserForm1.Show
End Sub

Private Sub UserForm_Initialize()
    Call CreateDynamicButtons
End Sub

Sub CreateDynamicButtons()
    Dim btn As MSForms.CommandButton
    Set btn = Me.Controls.Add("Forms.CommandButton.1")
    btn.Caption = "Click Me"
    btn.OnAction = "MyMacro"
End Sub

Sub MyMacro()
    MsgBox "Der Button wurde gedrückt!"
End Sub

In diesem Beispiel wird ein Button erstellt, der eine einfache Nachricht anzeigt, wenn er gedrückt wird.


Tipps für Profis

  • Verwende Selection.OnAction: Dies ist eine nützliche Methode, um ein Makro einem Button zuzuweisen, der bereits existiert.
  • Error Handling: Nutze On Error Resume Next, um potenzielle Fehler beim Zuweisen von Makros zu behandeln.
  • Dokumentation: Halte deinen Code gut dokumentiert, um die Wartung und Anpassung zu erleichtern.

FAQ: Häufige Fragen

1. Wie kann ich mehrere Makros mit einem Button verknüpfen?
Du kannst die .OnAction-Eigenschaft nutzen, um Makros mithilfe von Bedingungen oder Schleifen zu steuern.

2. Was mache ich, wenn mein Button nicht funktioniert?
Überprüfe die Zuweisung des Makros und stelle sicher, dass die Benennung korrekt ist. Debugge gegebenenfalls den Code, um Fehler zu finden.

3. Kann ich einen Button in einer UserForm erstellen?
Ja, du kannst Buttons in einer UserForm erstellen und ihnen Makros zuweisen, genau wie in einem Arbeitsblatt.

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