Excel VBA:切换按钮仅在右键单击时可用

Excel VBA:切换按钮仅在右键单击时可用,excel,vba,Excel,Vba,我正在Excel中处理一个用户表单。基本上,我想要一个“Photoshop风格”的工具栏,在我工作时可以漂浮在我的电子表格上,允许我选择和使用各种工具 我已经设置了一系列切换按钮,这样当单击其中一个按钮时,任何其他切换按钮都会返回到未单击状态。这有点复杂,因为我有子按钮,如果这有意义的话,这意味着一旦我点击了一个按钮,我可以点击其他四个按钮中的一个来进行实际选择,这四个按钮也是相互排斥的 奇怪的是:我没能让这些按钮工作。除了出于某种原因,当我只右键单击时,按钮就像一个符咒。左键单击:无。请帮忙

我正在Excel中处理一个用户表单。基本上,我想要一个“Photoshop风格”的工具栏,在我工作时可以漂浮在我的电子表格上,允许我选择和使用各种工具

我已经设置了一系列切换按钮,这样当单击其中一个按钮时,任何其他切换按钮都会返回到未单击状态。这有点复杂,因为我有子按钮,如果这有意义的话,这意味着一旦我点击了一个按钮,我可以点击其他四个按钮中的一个来进行实际选择,这四个按钮也是相互排斥的

奇怪的是:我没能让这些按钮工作。除了出于某种原因,当我只右键单击时,按钮就像一个符咒。左键单击:无。请帮忙

示例按钮代码:

Private Sub tMouse_MouseUp(ByVal button As Integer, _
       ByVal shift As Integer, ByVal X As Single, ByVal Y As Single)


tMouse.Value = True
tActual.Value = False
tSched.Value = False
tX.Value = False
tDiam.Value = False
tCirc.Value = False
tTri.Value = False
tTrash.Value = False
tText.Value = False

End Sub
编辑:
我尝试了关于打印切换按钮值的建议。我的电脑被信息盒炸了。我已将所有操作更改为Click()事件。显然,我是通过一个无限循环发送计算机的。也许将按钮从“真”更改为“假”或从“假”更改为“真”的行为就像单击并触发所有其他单击事件一样?

我建议使用“选项”控件而不是“切换”控件。 如果在一帧中粘贴4个选项,那么这4个选项中只有1个会自动允许自己一次为真。仅当希望“ToggleButton”控件的多个实例同时为true时,才应使用该控件

然而,如果你拒绝这样做,只是真的想使用切换按钮。然后,您可以编写一个过程,该过程在按下按钮后执行,该按钮将其名称(或唯一标识它的其他内容)作为参数发送到一个过程,该过程将除它之外的所有其他togglebuttons设置为false

干杯

Private Sub ToggleButton1_Click()
    Dim s As String
    s = "ToggleButton1"
    Evaluate_Options s
End Sub

Private Sub ToggleButton2_Click()
    Dim s As String
    s = "ToggleButton2"
    Evaluate_Options s
End Sub

Private Sub ToggleButton3_Click()
    Dim s As String
    s = "ToggleButton3"
    Evaluate_Options s
End Sub

Private Sub ToggleButton4_Click()
    Dim s As String
    s = "ToggleButton4"
    Evaluate_Options s
End Sub

Private Sub ToggleButton5_Click()
    Dim s As String
    s = "ToggleButton5"
    Evaluate_Options s
End Sub

Private Sub ToggleButton6_Click()
    Dim s As String
    s = "ToggleButton6"
    Evaluate_Options s
End Sub

Private Sub ToggleButton7_Click()
    Dim s As String
    s = "ToggleButton7"
    Evaluate_Options s
End Sub

Private Sub ToggleButton8_Click()
    Dim s As String
    s = "ToggleButton8"
    Evaluate_Options s
End Sub

Private Sub Evaluate_Options(s As String)
    Dim tgl As Control

    For Each tgl In UserForm1.Frame1.Controls
        If InStr(tgl.Name, s) Then Set_Toggles_1 tgl
    Next
    For Each tgl In UserForm1.Frame2.Controls
        If InStr(tgl.Name, s) Then Set_Toggles_2 tgl
    Next
End Sub

Private Sub Set_Toggles_1(tglTrue As Control)
    Dim tglFalse As Control
    For Each tglFalse In UserForm1.Frame1.Controls
        If tglFalse.Name = tglTrue.Name Then tglFalse = True Else tglFalse = False
    Next
End Sub

Private Sub Set_Toggles_2(tglTrue As Control)
Dim tglFalse As Control
    For Each tglFalse In UserForm1.Frame2.Controls
        If tglFalse.Name = tglTrue.Name Then tglFalse = True Else tglFalse = False
    Next
End Sub


尝试这些基本的鼠标事件捕获子项并进行修改以满足您的需要(tMouse=切换按钮名称):

注:如果调用下部接头,上部接头将不工作

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

If Button = 1 Then MsgBox "Left"
If Button = 2 Then MsgBox "Right"
End Sub

您有触发其他事件的事件。您需要做的是设置一个布尔AllowEventsToRun变量(在模块或公共级别),并在代码开始时将其设置为false。运行您需要执行的任何操作,然后在最后将其设置为true

诀窍是执行if语句,以确保在运行任何其他代码之前将AllowEventsToRun设置为true。加载userform时,请确保将布尔值初始化为true(因为布尔值的默认值为false。因此如下所示:

Option Explicit
Private AllowEventsToRun As Boolean

Private Sub ToggleButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If AllowEventsToRun Then

    AllowEventsToRun = False

    'whatever you're doing that's causing the events to chain fire

    AllowEventsToRun = True
End If

End Sub


Private Sub ToggleButton2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If AllowEventsToRun Then

    AllowEventsToRun = False

    'whatever you're doing that's causing the events to chain fire

    AllowEventsToRun = True
End If
End Sub


Private Sub UserForm_Initialize()
AllowEventsToRun = True
End Sub

来源:

您发布的内容中没有任何内容会吞噬鼠标左键。当您按下鼠标左键时,事件是否会触发,但什么也没有发生,或者事件甚至没有用鼠标左键注册?当我用鼠标左键单击切换按钮时,它会立即不动。如果有其他按钮切换为真(通过右键单击完成)当我用鼠标左键单击某个按钮时,该切换按钮将变为false,而我单击的按钮将再次循环为true和false。对于相同的按钮,您是否混合了MouseUp和click事件?不,我总是有所有MouseUp或所有click事件。每个按钮只有一个事件。您是否尝试过设置断点@tMouse.Value,然后设置st浏览每一行,看看你是否在某个意想不到的地方被反弹,从而改变了值?这会提供新的信息,谢谢!请参阅编辑我的原始帖子。我非常确定选项按钮正是我想要的功能,但我认为切换按钮的美学效果会更好。不过,谢谢!我我对这个网站太陌生了,无法提升投票率,但我在精神上提升投票率:)当然。很乐意帮忙=D
Option Explicit
Private AllowEventsToRun As Boolean

Private Sub ToggleButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If AllowEventsToRun Then

    AllowEventsToRun = False

    'whatever you're doing that's causing the events to chain fire

    AllowEventsToRun = True
End If

End Sub


Private Sub ToggleButton2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If AllowEventsToRun Then

    AllowEventsToRun = False

    'whatever you're doing that's causing the events to chain fire

    AllowEventsToRun = True
End If
End Sub


Private Sub UserForm_Initialize()
AllowEventsToRun = True
End Sub