Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1784to1788
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
Inhaltsverzeichnis

Viele Button

Viele Button
28.09.2020 19:12:23
Eberhard
Guten Abend
Ich habe da mal eine Frage. Ich habe eine UserForm mit 150 Button.
Muss ich für jeden Butten den folgenden Befehl eingeben oder gibt es da vielleicht eine andere Möglichkeit?
Private Sub CommandButton1_Click()
End Sub

Private Sub CommandButton2_Click()
End Sub
usw...
Die Idee ist, dass ich einen Button auswählen kann und dieser auf das Tabellenblatt z.B. 01.01.2020 auf die Zeile 07.00 spring.
Habe eine Demo Datei angefügt. So könnt Ihr ein Bild davon machen.
https://www.herber.de/bbs/user/140500.xlsm
Besten Dank für Euer Feedback.
Gruss Daniel

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Viele Button
28.09.2020 19:24:42
Hajo_Zi
Hallo Daniel,
Klassenprogrammierung
http://hajo-excel.de/vba_userform_klasse.htm
Falls Link nicht ausgeführt wird:
1. Link kopieren
2. rechte Maustaste neues Fenter.
3. Umschaltstaste drücken und Klick auf den Link

AW: Viele Button
28.09.2020 20:16:59
Eberhard
Hallo
Puh, das sieht für ein Anfänger sehr kompliziert aus! Vielen Dank trotzdem!
AW: Viele Button
28.09.2020 20:17:00
Nepumuk
Hallo Daniel,
teste mal:
Im Modul des UserForms:
Option Explicit

Private mobjCommndButtonClassCollection As Collection

Private Sub CommandButton157_Click()
    
    Unload Me
    
End Sub

Private Sub UserForm_Initialize()
    
    Dim objControl As Control
    Dim objCommndButtonClass As clsCommandButton
    Dim lngIndex As Long
    
    Frame1.Caption = Format$(Tabelle1.Name, "DDDD, " & Tabelle1.Name)
    Frame3.Caption = Format$(Tabelle3.Name, "DDDD, " & Tabelle3.Name)
    Frame4.Caption = Format$(Tabelle4.Name, "DDDD, " & Tabelle4.Name)
    Frame5.Caption = Format$(Tabelle5.Name, "DDDD, " & Tabelle5.Name)
    Frame6.Caption = Format$(Tabelle6.Name, "DDDD, " & Tabelle6.Name)
    
    Set CommndButtonClassCollection = New Collection
    
    For lngIndex = 1 To 6
        
        For Each objControl In Controls("Frame" & CStr(lngIndex)).Controls
            
            If TypeOf objControl Is MSForms.CommandButton Then
                
                Set objCommndButtonClass = New clsCommandButton
                
                With objCommndButtonClass
                    
                    Set .CommandButton = objControl
                    
                    .FrameNumber = lngIndex
                    
                    Select Case objControl.Caption
                        Case "07:00 Uhr": .CommandButtonNumber = 4
                        Case "07:30 Uhr": .CommandButtonNumber = 5
                        Case "08:00 Uhr": .CommandButtonNumber = 6
                        Case "08:30 Uhr": .CommandButtonNumber = 7
                        Case "Pause": .CommandButtonNumber = 8
                        Case "09:30 Uhr": .CommandButtonNumber = 9
                        Case "10:00 Uhr": .CommandButtonNumber = 10
                        Case "10:30 Uhr": .CommandButtonNumber = 11
                        Case "11:00 Uhr": .CommandButtonNumber = 12
                        Case "11:30 Uhr": .CommandButtonNumber = 13
                        Case "13:00 Uhr": .CommandButtonNumber = 14
                        Case "13:30 Uhr": .CommandButtonNumber = 15
                        Case "14:00 Uhr": .CommandButtonNumber = 16
                        Case "14:30 Uhr": .CommandButtonNumber = 17
                        Case "15:00 Uhr": .CommandButtonNumber = 18
                        Case "15:30 Uhr": .CommandButtonNumber = 19
                        Case "16:00 Uhr": .CommandButtonNumber = 20
                        Case "16:30 Uhr": .CommandButtonNumber = 21
                        Case "17:00 Uhr": .CommandButtonNumber = 22
                        Case "17:30 Uhr": .CommandButtonNumber = 23
                        Case "18:00 Uhr": .CommandButtonNumber = 24
                        Case "18:30 Uhr": .CommandButtonNumber = 25
                        Case "19:00 Uhr": .CommandButtonNumber = 26
                        Case "19:30 Uhr": .CommandButtonNumber = 27
                        Case "20:00 Uhr": .CommandButtonNumber = 28
                    End Select
                    
                    Call CommndButtonClassCollection.Add(Item:=objCommndButtonClass)
                    
                End With
            End If
        Next
    Next
    Set objCommndButtonClass = Nothing
End Sub

Private Sub UserForm_Terminate()
    Set CommndButtonClassCollection = Nothing
End Sub

Private Property Get CommndButtonClassCollection() As Collection
    Set CommndButtonClassCollection = mobjCommndButtonClassCollection
End Property

Private Property Set CommndButtonClassCollection(ByRef probjCommndButtonClassCollection As Collection)
    Set mobjCommndButtonClassCollection = probjCommndButtonClassCollection
End Property

In einem Klassenmodul mit dem Namen "clsCommandButton"
Option Explicit

Private WithEvents mobjCommandButton As MSForms.CommandButton

Private mlngFrameNumber As Long
Private mlngCommandButtonNumber As Long

Private Sub Class_Terminate()
    Set CommandButton = Nothing
End Sub

Friend Property Get CommandButton() As MSForms.CommandButton
    Set CommandButton = mobjCommandButton
End Property

Friend Property Set CommandButton(ByRef probjCommandButton As MSForms.CommandButton)
    Set mobjCommandButton = probjCommandButton
End Property

Friend Property Get FrameNumber() As Long
    FrameNumber = mlngFrameNumber
End Property

Friend Property Let FrameNumber(ByVal pvlngFrameNumber As Long)
    mlngFrameNumber = pvlngFrameNumber
End Property

Friend Property Get CommandButtonNumber() As Long
    CommandButtonNumber = mlngCommandButtonNumber
End Property

Friend Property Let CommandButtonNumber(ByVal pvlngCommandButtonNumber As Long)
    mlngCommandButtonNumber = pvlngCommandButtonNumber
End Property

Private Sub mobjCommandButton_Click()
    Worksheets(FrameNumber).Select
    Cells(CommandButtonNumber, 1).Select
End Sub

Gruß
Nepumuk
Anzeige
AW: Viele Button
28.09.2020 20:53:56
Eberhard
Hallo Nepumuk
Das ist ja der Wahnsinn. Funktioniert wie gewünscht. Da habe ich als Anfänger nur ?.
Besten Dank.
Gruss Daniel
AW: Viele Button
29.09.2020 22:48:49
Eberhard
Hallo Nepumuk
Wie schon erwähnt, bin ich Anfänger. Dein Code ist der Hammer! ABER!!! Ich bin zu blöd um den Code zu verstehen! Nun möchte ich, dass z.B. den Button 07.00 rot wird, wenn die Zelle rechts neben der Zeit belegt ist. Kannst Du mir da behilflich sein?
Gruss Daniel
AW: Viele Button
30.09.2020 08:23:40
Nepumuk
Hallo Daniel,
füge nach End Select in der Prozedur UserForm_Initialize folgende Zeile ein:
If Not IsEmpty(Worksheets(lngIndex).Cells(.CommandButtonNumber, 2).Value) Then _
    objControl.BackColor = vbRed

Gruß
Nepumuk
Anzeige
AW: Viele Button
30.09.2020 09:16:20
Eberhard
Hallo Nepumuk
Danke für die Rückmeldung. Funktioniert noch nicht ganz wie ich es möchte. Der Button wird rot nach schliessen & wieder öffnen der UserForm. Schön wäre, wenn der Button ohne die USerForm zu schliessen rot wird. Eine weitere Frage habe ich noch! Wo muss ich eine MsgBox einfügen damit die Meldung erscheint "Kunde überschreiben" erscheint?
Gruss Daniel
AW: Viele Button
30.09.2020 09:56:34
Nepumuk
Hallo Daniel,
das mit dem Einfärben des Buttons habe ich eingebaut. Was ich jetzt nicht verstehe ist die MsgBox. In welchem Fall soll die erscheinen?
Gruß
Nepumuk
AW: Viele Button
30.09.2020 10:29:22
Eberhard
Hallo Nepumuk
Ich möchte, dass wenn der Button rot ist & dieser trotzdem angeklickt wird, sich eine MsgBox öffnet mit der Frage "Soll der Kunde gelöscht werden?".
Gruss Daniel
Anzeige
AW: Viele Button
30.09.2020 11:04:53
Nepumuk
Hallo Daniel,
ich lade besser die Mappe hoch. Es hat sich geändert: Der Code im UserForm, im Klassenmodul und im Modul "DieseArbeitsmappe". Zudem, damit du in der Tabelle arbeiten kannst trotz angezeigtem UserForm, musst du im Eigenschaftsfenster des UserForms die Eigenschaft "ShowModal" auf False setzen.
https://www.herber.de/bbs/user/140537.xlsm
Gruß
Nepumuk
AW: Viele Button
04.10.2020 10:48:56
Eberhard
Guten Tag Nepumuk
Sorry für das lange warten. Hatte gerade viel zu tun. Vielen Dank für Deine geleistete Arbeit. Ist es schwierig weitere Button hinzu zu fügen? So das ich es selber machen könnte?
Gruss Dänu
Anzeige
AW: Viele Button
04.10.2020 12:33:07
Nepumuk
Hallo Daniel,
wo willst du weiter Buttons einfügen?
Gruß
Nepumuk
AW: Viele Button
05.10.2020 07:03:04
Eberhard
Hallo Nepumuk
Bei den 6 Feldern wo die Zeit Buttons drin stehen. Recht unten nach 20.00 Uhr. Wenn Du mir das irgendwie einbauen kannst, so das ich vielleicht selber dann noch weiterfahren kann. Der Button soll dann eine Sub ansprechen.
Gruss Daniel
AW: Viele Button
05.10.2020 10:44:18
Nepumuk
Hallo Daniel,
kann ich mir so nicht vorstellen. Lade mal eine Mappe hoch.
Gruß
Nepumuk
AW: Viele Button
06.10.2020 07:16:48
Eberhard
Guten Morgen Nepumuk
Wie gewünscht, habe ich eine Datei Hochgeladen. Vielleicht hilft Dir dies weiter?
https://www.herber.de/bbs/user/140678.xlsm
Gruss und einen schönen Tag.
Dänu
Anzeige
AW: Viele Button
06.10.2020 10:47:49
Nepumuk
Hallo Daniel,
folgende Prozeduren ändern:
Private Sub UserForm_Initialize()
    
    Dim objControl As Control
    Dim objCommndButtonClass As clsCommandButton
    Dim lngIndex As Long
    
    Frame1.Caption = Format$(Tabelle1.Name, "dddd, dd.mm.yyyy")
    Frame2.Caption = Format$(Tabelle2.Name, "dddd, dd.mm.yyyy")
    Frame3.Caption = Format$(Tabelle3.Name, "dddd, dd.mm.yyyy")
    Frame4.Caption = Format$(Tabelle4.Name, "dddd, dd.mm.yyyy")
    Frame5.Caption = Format$(Tabelle5.Name, "dddd, dd.mm.yyyy")
    Frame6.Caption = Format$(Tabelle6.Name, "dddd, dd.mm.yyyy")
    
    Set CommndButtonClassCollection = New Collection
    
    For lngIndex = 1 To 6
        
        For Each objControl In Controls("Frame" & CStr(lngIndex)).Controls
            
            If TypeOf objControl Is MSForms.CommandButton Then
                
                Set objCommndButtonClass = New clsCommandButton
                
                With objCommndButtonClass
                    
                    Set .CommandButton = objControl
                    
                    .FrameNumber = lngIndex
                    
                    Select Case objControl.Caption
                        Case "07:00 Uhr": .CommandButtonNumber = 4
                        Case "07:30 Uhr": .CommandButtonNumber = 5
                        Case "08:00 Uhr": .CommandButtonNumber = 6
                        Case "08:30 Uhr": .CommandButtonNumber = 7
                        Case "Pause": .CommandButtonNumber = 8
                        Case "09:30 Uhr": .CommandButtonNumber = 9
                        Case "10:00 Uhr": .CommandButtonNumber = 10
                        Case "10:30 Uhr": .CommandButtonNumber = 11
                        Case "11:00 Uhr": .CommandButtonNumber = 12
                        Case "11:30 Uhr": .CommandButtonNumber = 13
                        Case "13:00 Uhr": .CommandButtonNumber = 14
                        Case "13:30 Uhr": .CommandButtonNumber = 15
                        Case "14:00 Uhr": .CommandButtonNumber = 16
                        Case "14:30 Uhr": .CommandButtonNumber = 17
                        Case "15:00 Uhr": .CommandButtonNumber = 18
                        Case "15:30 Uhr": .CommandButtonNumber = 19
                        Case "16:00 Uhr": .CommandButtonNumber = 20
                        Case "16:30 Uhr": .CommandButtonNumber = 21
                        Case "17:00 Uhr": .CommandButtonNumber = 22
                        Case "17:30 Uhr": .CommandButtonNumber = 23
                        Case "18:00 Uhr": .CommandButtonNumber = 24
                        Case "18:30 Uhr": .CommandButtonNumber = 25
                        Case "19:00 Uhr": .CommandButtonNumber = 26
                        Case "19:30 Uhr": .CommandButtonNumber = 27
                        Case "20:00 Uhr": .CommandButtonNumber = 28
                        Case "Kopieren": .CommandButtonNumber = 1
                    End Select
                    
                    If Not IsEmpty(Worksheets(lngIndex).Cells(.CommandButtonNumber, 2).Value) Then _
                        objControl.BackColor = vbRed
                    
                    Call CommndButtonClassCollection.Add(Item:=objCommndButtonClass, _
                        Key:=CStr(lngIndex) & "|" & CStr(.CommandButtonNumber))
                    
                End With
            End If
        Next
    Next
    Set objCommndButtonClass = Nothing
End Sub

Private Sub mobjCommandButton_Click()
    If CommandButton.Caption = "Kopieren" Then
        Call CopyRange
    ElseIf CommandButton.BackColor = vbRed Then
        If MsgBox("Soll der Kunde gelöscht werden?", vbQuestion Or vbYesNo, _
            "Sicherheitsabfrage") = vbYes Then Call SelectTime
    Else
        Call SelectTime
    End If
End Sub

Neu im Klassenmodul:
Private Sub CopyRange()
    With Tabelle7
        Call Worksheets(FrameNumber).Range("B4:E28").Copy(Destination:=.Range("A2"))
        Call .Select
    End With
End Sub

Gruß
Nepumuk
Anzeige
AW: Viele Button
06.10.2020 20:49:45
Eberhard
Hallo Nepumuk
Vielen Dank. Funktioniert wuderbar!
Schönen Abend und bis bald...
Gruss Daniel
AW: Viele Button
28.09.2020 21:06:22
Daniel
Hi
wenns nur ne Klickhilfe sein soll um zur richtigen Zeile im passenden Tabellenblatt zu springen, würde ich zwei Listboxen erstellen:
eine für das Datum/Tabellenblatt und eine für die Uhrzeit.
da muss der Anwender dann zwar zweimal klicken, aber du brauchst viel weniger Platz, so dass die Userform parallel zum Tabellenblatt geöffnet bleiben kann.
und du hast nur zwei Steuerelmente, die du erstellen und "betreuen" musst.
Gruß Daniel

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige