Thema Datum  Von Nutzer Rating
Antwort
17.07.2023 16:48:54 Max64
Solved
17.07.2023 20:26:37 Gast3233
NotSolved
18.07.2023 09:24:15 Max64
NotSolved
17.07.2023 20:42:03 Gast7777
***
NotSolved
17.07.2023 21:50:00 Max64
NotSolved
17.07.2023 22:02:57 Gast7777
NotSolved
18.07.2023 10:18:33 Gast89977
NotSolved
18.07.2023 16:16:42 Max64
NotSolved
Rot viele Toggle Buttons über Array
17.07.2023 20:42:41 xlKing
****
NotSolved
17.07.2023 21:23:57 Max64
NotSolved
18.07.2023 09:33:32 Max64
NotSolved
18.07.2023 16:16:15 Max64
NotSolved

Ansicht des Beitrags:
Von:
xlKing
Datum:
17.07.2023 20:42:41
Views:
404
Rating: Antwort:
  Ja
Thema:
viele Toggle Buttons über Array

Hallo Max,

ich hab zwar keine Ahnung was du vorhast, aber ja es gibt einen Weg. Ich bin mir nur nicht sicher, wenn ich dir als Anfänger diesen jetzt aufzeige, ob du den dann schon verstehst. Bevor ich dir also die Lösung zeige möchte ich erstmal anmerken, dass dein Code so wie er jetzt aufgebaut ist, schnulli ergibt. Denn bei jedem versuchten Klick auf einen Button werden alle drei Ereignisse MouseMove, Mousedown und Change direkt nacheinander ausgeführt. Außerdem wird dabei gleich zweimal zwischendurch der IstZustand wieder hergestellt. Das kostet unnötig Zeit beim Laden der Bilder. Weil wirklich alle Bilder geladen werden. Und am Ende weiß man als Benutzer gar nicht mehr welches Bild denn nun wirklich angezeigt werden soll. Hier solltest du dir also nochmal eine sinnvolle Logik überlegen und dich für eines der drei Ereignisse entscheiden, sonst wirst du mit mehr als 64 Buttons massive Performance-Probleme bekommen.

So. Nun zum Profi-Wissen: Erstelle ein neues Klassenmodul namens Klasse1 (oder mit jedem anderen beliebigen Namen), und gib dort diese Codezeile ein:

Public WithEvents tb As MSForms.ToggleButton

Nun kanns du wie gewohnt oben links im Dropdownfeld tb als Objekt auswählen und oben rechts auf die Ereignisse eines Togglebuttons zugreifen. Nur dass eben z.B. im Klassenmodul anstelle von ToggleButton1 überall tb stehen muss. Der gesamte Code im Klassenmodul, basierend auf deinem falschen Beispiel, könnte  dann in etwa so aussehen:

Public WithEvents tb As MSForms.ToggleButton

Private Sub tb_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

Call Userform1.ist_zustand_herstellen

    If tb.Value = False Then
       tb.Picture = UserForm1.Image2.Picture
    Else
       tb.Picture = UserForm1.Image4.Picture
    End If
End Sub

Private Sub tb_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If tb.Value = False Then
        tb.Picture = UserForm1.Image3.Picture
    Else
        tb.Picture = UserForm1.Image1.Picture
    End If
End Sub

Private Sub tb_Change()
    If tb.Value = False Then
        tb.Picture = UserForm1.Image1.Picture
    Else
        tb.Picture = UserForm1.Image3.Picture
    End If
End Sub

Als nächstes machst du im Userform aus der Private Sub ist_zustand_herstellen eine Public sub, damit du aus dem Klassenmodul darauf zugreifen kannst, falls gewünscht.

Nun musst du im Modulkopf des Userforms ein Array dimensionieren, dem du über das userform_Initialze-Ereignis für jeden bestehenden Togglebutton ein neues Klasse1-Objekt zuweist. Jedes dieser Klasse1-Objekte im Array hat dann eine tb-Eigenschaft, der du dann den jeweiligen Togglebutton zuweist. Somit greift dann nur ein Ereignis für 64 oder mehr Togglebuttons. Der Code im Userform sieht dann etwa so aus:

Dim arr()
Public Sub ist_zustand_herstellen()

Dim a As Byte
        For a = 1 To 4
          If Me("ToggleButton" & a).Value = False Then
             Me("ToggleButton" & a).Picture = Image1.Picture
          Else
             Me("ToggleButton" & a).Picture = Image3.Picture
          End If
        Next a
End Sub


Private Sub Frame1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Call ist_zustand_herstellen
End Sub

Private Sub UserForm_Initialize()
  ReDim arr(1 To 16)
  For i = 1 To 16
    Set arr(i) = New Klasse1
    Set arr(i).tb = Me.Controls("ToggleButton" & i)
  Next i
End Sub

Wenn du Fragen zu dem Code hast, einfach melden. Ist schon etwas tricky.

Gruß Mr. K.


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
17.07.2023 16:48:54 Max64
Solved
17.07.2023 20:26:37 Gast3233
NotSolved
18.07.2023 09:24:15 Max64
NotSolved
17.07.2023 20:42:03 Gast7777
***
NotSolved
17.07.2023 21:50:00 Max64
NotSolved
17.07.2023 22:02:57 Gast7777
NotSolved
18.07.2023 10:18:33 Gast89977
NotSolved
18.07.2023 16:16:42 Max64
NotSolved
Rot viele Toggle Buttons über Array
17.07.2023 20:42:41 xlKing
****
NotSolved
17.07.2023 21:23:57 Max64
NotSolved
18.07.2023 09:33:32 Max64
NotSolved
18.07.2023 16:16:15 Max64
NotSolved