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:
1 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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.
|