Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1540to1544
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
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 ;)

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
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 ;)

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige