2016-07-25 10 views
0

Ich habe den folgenden Code entsprechend drei ToggleButtons in einem VBA-Programm in Excel. Wenn ein Button angeklickt wird, soll er "gedrückt" bleiben und die anderen beiden Buttons sollen "loslassen". Aber mit dem Code, den ich habe, muss ich zweimal auf eine Taste klicken, um die anderen Tasten loszulassen und die andere, um die ursprüngliche gedrückt zu halten.VBA Excel Toggle Button "Latching"

Wenn ich jedoch "ToggleButtonX.Value = True" zu jedem der Subs hinzufüge, kann beim Klicken auf eine Schaltfläche die Schaltfläche nicht freigegeben werden, selbst wenn Sie auf eine andere Schaltfläche klicken. Wie könnte man das so konfigurieren, dass wenn man auf eine Taste klickt, diese Taste gedrückt bleibt UND die anderen Tasten losgelassen werden?

EDIT: Ich möchte TOGGLEBUTTONS HALTEN.

Private Sub ToggleButton1_Click() 
    ToggleButton2.Value = False 
    ToggleButton3.Value = False 
End Sub 

Private Sub ToggleButton2_Click() 
    ToggleButton1.Value = False 
    ToggleButton3.Value = False 
End Sub 

Private Sub ToggleButton3_Click() 
    ToggleButton1.Value = False 
    ToggleButton2.Value = False 
End Sub 
+0

Warum nicht Optionsschaltflächen anstelle von Umschalttasten verwenden? Sie sind Funktionalität für diesen Zweck ist völlig zuverlässig – RGA

+0

Der Grund, warum es unzuverlässig ist, dass jedes Mal, wenn Sie den Wert des ToggleButton ändern VBA sieht es als ein Klick und es löst das 'Click'-Ereignis und damit jedes Stück Code jedes Mal. –

+0

Also, wie würde ich das beheben? Ich möchte es als ToggleButtons –

Antwort

3

von ToggleButtonx.Value = False rufen Sie auf dieser Schaltfläche einen Klick simulieren, und es wird so eigenen Code ausführen , und legen Sie den Wert der Schaltfläche, auf die Sie gerade geklickt haben, auf "false" fest.

verwenden, anstatt die MouseDown Veranstaltung:

Private Sub ToggleButton1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
    ToggleButton2.Value = False 
    ToggleButton3.Value = False 
End Sub 
Private Sub ToggleButton2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
    ToggleButton1.Value = False 
    ToggleButton3.Value = False 
End Sub 
Private Sub ToggleButton3_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
    ToggleButton1.Value = False 
    ToggleButton2.Value = False 
End Sub 
+0

Dies setzt die anderen Schaltflächen auf false (nicht geklickt), unabhängig davon, ob die ursprüngliche Schaltfläche wahr oder falsch ist (angeklickt oder nicht). –

1

Dies ist leicht mit Option Buttons getan (Wenn das mit dem Rest Ihrer Implementierung arbeitet)

Private Sub OptionButton1_Click() 
    OptionButton1.Value = True 
    OptionButton2.Value = False 
    OptionButton3.Value = False 
End Sub 

Private Sub OptionButton2_Click() 
    OptionButton1.Value = False 
    OptionButton2.Value = True 
    OptionButton3.Value = False 
End Sub 

Private Sub OptionButton3_Click() 
    OptionButton1.Value = False 
    OptionButton2.Value = False 
    OptionButton3.Value = True 
End Sub 
2

Neben Oliver Antwort, die wahrscheinlich einfacher und sauberer zu implementieren ist, gibt es eine andere Möglichkeit, es auch tun Logik verwenden, die nur die Werte ändern wird von die anderen beiden Tasten, wenn eine Taste gedrückt wird. Der Code für die anderen Tasten Click Ereignis wird ausgelöst, aber die Variable sButton wird feststellen, dass der Code nur eine der Taste ausgelöst wird phyiscally vom Benutzer gedrückt wird.

Beachten Sie auch die Verwendung von Not Me.ToggleButton1.Value. Dies stellt sicher, dass die Tasten 2 und 3 das Gegenteil von Taste 1 mit jedem Klick sind. Die Art, wie Sie Code geschrieben wurde, würde immer die anderen Tasten zu False egal was, wenn die angeklickte Taste war True oder False.

Option Explicit 

Public sButton As String 

Private Sub ToggleButton1_Click() 

ButtonLoad 1 

End Sub 

Private Sub ToggleButton2_Click() 

ButtonLoad 2 

End Sub 

Private Sub ToggleButton3_Click() 

ButtonLoad 3 

End Sub 

Sub ButtonLoad(iButton As Integer) 

Select Case iButton 
    Case 1 
     If sButton = "" Then 
      sButton = "1" 'set so that other buttons don't trigger 
      Me.ToggleButton2.Value = Not Me.ToggleButton1.Value 
      Me.ToggleButton3.Value = Not Me.ToggleButton1.Value 
      sButton = "" 'reset for next button click 
     End If 
    Case 2 
     If sButton = "" Then 
      sButton = "2" 
      Me.ToggleButton1.Value = Not Me.ToggleButton2.Value 
      Me.ToggleButton3.Value = Not Me.ToggleButton2.Value 
      sButton = "" 
     End If 
    Case 3 
     If sButton = "" Then 
      sButton = "3" 
      Me.ToggleButton2.Value = Not Me.ToggleButton3.Value 
      Me.ToggleButton1.Value = Not Me.ToggleButton3.Value 
      sButton = "" 
     End If 
End Select 

End Sub