Clever-Excel-Forum

Normale Version: Schaltfläche dynamisch wieder löschen - Objektorientierte Programmierung
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo meine VBA Helden,

ich habe auf meiner Userform 2 (nichtdynamische) CommandButtons. Den ersten Button habe ich so programmiert,
dass dieser eine weitere Schaltfläche mit einem kleinen Text dynamisch erzeugt und auf die Userform bringt. Das klappt
perfekt.
 
Für den zweiten CommandButton suche ich nun den passenden Code, um die soeben dynamisch erzeugte Schaltfläche wieder
löschen zu können. Das klappt überhaupt nicht.

Userform:
Code:
Option Explicit
Dim Befehle(200) As New clsElemente

Private Sub ErzeugeButton_Click()
Dim i As Integer
i = 200
Dim objVar As MSForms.CommandButton
Set objVar = Me.Controls.Add("Forms.CommandButton.1", "" & i, True)

With objVar
.Width = 230
.Height = 30
.Left = 300
.Top = 50
.Caption = "Hallo, ich wurde gerade dynamisch erzeugt. Klick mich!"
End With

Set Befehle(200).Knöpfe = objVar
End Sub
Private Sub LöscheButton_Click()
'Wie löscht man den gerade erzeugten Button ??

End Sub


Private Sub UserForm_Initialize()
Application.WindowState = xlMaximized
With Me
.Height = Application.Height
.Width = Application.Width
.BackColor = &H80000014
End With
End Sub
Klasse:
Code:
Option Explicit
Public WithEvents Knöpfe As MSForms.CommandButton
Private Sub Knöpfe_Click()
Knöpfe.BackColor = vbRed
Knöpfe.Font.Bold = True
Knöpfe.Caption = "Du hast gedrückt. Ich bin ganz rot geworden!"
Knöpfe.AutoSize = True
End Sub
Kann einfacher:
Hallo snb,

auch wenn ich deinen Code, deine Ideen zur Vereinfachung immer sehr zu schätzen weiß, darum geht es mir diesmal nicht.

Den visibel - Befehl kenne ich auch. Irgendwo bzw. überall im Netz schwirrt für das Löschen einer solchen

Schaltfläche Me.Control.Remove und dann natürlich ??? rum. Und übrigens Vereinfachung snb. Mit der Objektorientierung

kann man die Schaltfläche auch locker über Schleifen erzeugen. Anzahl, Lage, Steuerung. etc, aber das weiß jemand wie

du auch selbst. Ich bin jedenfalls begeistert davon und brauche jetzt genau dafür ein paar neue Befehle.

Aber danke für deine Mühe.
Code:
Sub Userform_besturingselement_delete()
  With ThisWorkbook.VBProject.VBComponents("invoer")
     .Designer.Controls.Remove "knop_einde"
  End With
End Sub


Sehe auch:

http://www.snb-vba.eu/VBA_Excel_VBproject_en.html#L121
Hallo Snb,

also ich bekomme mit der von dir vorgeschlagenen Lösung folgende Fehlermeldung:

Laufzeitfehler 1004
Der programmierte Zugriff auf das Visual Basic-Projekt ist nicht sicher.
ist nur eine Warnung:

Tue

Menüliste
File
Options
Trust Center
Macro Settings
Developer Macro Setting: einschalten.

evt. übersetzen in Deutsch.
Deine Einstellungsempfehlungen ergeben bei mir jetzt folgende (veränderte) Fehlermeldung:

Fehlermeldung 9
Index außerhalb des gültigen Bereichs
Hallo,
Private Sub LöscheButton_Click()
 Me.Controls.Remove "200"
End Sub
Gruß Uwe
Hallo Uwe,

danke für deine mehr als wertvolle Hilfe. Aber, wie das so ist im Leben, ich habe wieder ein neues Problem mit dem Code.
Ich habe meine Userform mal etwas weiterentwickelt und noch ein paar dynamisch erzeugte Schaltflächen draufgepackt.
Alle dynamischen Schaltflächen rufen in meiner Klasse die Prozedur Private Sub Knöpfe_Click auf (s. Code unten).
Mein Problem ist jetzt die einzelnen Schaltflächen sollen in dieser Prozedur unterschiedliche Ereignisse auslösen.
Dazu muss ich in dieser Prozedur Knöpfe_Click() unbedingt wissen, von welcher dynamischen Schaltfläche es aufgerufen
wurde. Wie lautet der Code anhand dessen ich diese Unterscheidung treffen kann? Der besseren Übersicht halber, habe ich
nochmal ein Attachment beigefügt. Ich hoffe ihr könnt mir helfen. Die Sache ist mir extrem wichtig. Danke.



Code:
Option Explicit
Public WithEvents Knöpfe As MSForms.CommandButton
Private Sub Knöpfe_Click()

'!!! Wichtig !!!
'Problem: Von welcher Schaltfläche stammt der Aufruf für diese Routine?
' Unterschiedliche Schaltflächen sollen unterschiedliche Aktionen in dieser Prozedur aufrufen

Knöpfe.BackColor = vbRed
Knöpfe.Font.Bold = True
Knöpfe.Caption = "Du hast mich gedrückt. Ich bin ganz rot geworden!"
Knöpfe.AutoSize = True
End Sub
Hallo,

z.b. so:

Klassenmodul clsElemente
Option Explicit 
Public WithEvents Knöpfe As MSForms.CommandButton
Private Sub Knöpfe_Click()

'!!! Wichtig !!!
'Problem: Von welcher Schaltfläche stammt der Aufruf für diese Routine?
' Unterschiedliche Schaltflächen sollen unterschiedliche Aktionen in dieser Prozedur aufrufen
 Select Case UserForm1.ActiveControl.Name
   Case "101" To "150"
     Knöpfe.BackColor = vbGreen
     Knöpfe.Font.Bold = True
     Knöpfe.Caption = "Du hast mich gedrückt. Ich bin ganz grün geworden!"
     Knöpfe.AutoSize = True
   Case "151" To "200"
     Knöpfe.BackColor = vbRed
     Knöpfe.Font.Bold = True
     Knöpfe.Caption = "Du hast mich gedrückt. Ich bin ganz rot geworden!"
     Knöpfe.AutoSize = True
   Case "201" To "999"
     Knöpfe.BackColor = vbYellow
     Knöpfe.Font.Bold = True
     Knöpfe.Caption = "Du hast mich gedrückt. Ich bin ganz gelb geworden!"
     Knöpfe.AutoSize = True
 End Select
End Sub


VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 14 - mit VBAHTML 12.6.0


Gruß Uwe
Seiten: 1 2