Excel VBA:切换button只能用右键单击

我正在用户窗体中的Excel中工作。 基本上,我想要一个“Photoshop-esque”工具栏,在工作时浮在我的电子表格上,允许我select和使用各种工具。

我已经设置了一系列的切换button,这样当点击一个button时,任何其他切换button都会返回到未点击状态。 这有点复杂,因为我有子button,如果这是有道理的,这意味着一旦我点击了一个button,我可以点击其他四个button之一做出我的实际select,这四个button互相排斥以及。

奇怪的事情:我一直无法得到这些button的工作。 除。 出于某种原因,当我只用鼠标右键单击,button就像一个魅力。 左键单击:没有。 请帮助?

示例button代码:

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 

编辑:我试过什么build议打印切换button的值。 而我的电脑爆炸与消息框。 我已经将所有的操作改为Click()事件。 显然我是通过无限循环发送计算机的。 也许将button从真到假或反之亦然的行为就像点击并触发所有其他点击事件?

你有触发其他事件的事件。 你需要做的是设置一个布尔值AllowEventsToRunvariables(在模块或公共级别),并在代码开始时将其设置为false。 运行你需要做的任何事情,然后在最后把它设置为true。

诀窍是做一个if语句,以确保AllowEventsToRun在任何其他代码运行之前设置为true。 当你加载你的用户表单时,一定要将布尔值初始化为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 

来源: http : //www.cpearson.com/excel/SuppressChangeInForms.htm

我会build议使用“选项”控制,而不是“切换”控制。 如果你在一个框架上粘贴4个选项,那么这4个选项中只有一个将自动成为真实的。 只有当你想让它的多个实例同时为真时,你才应该使用“ToggleButton”控件。

但是,如果你拒绝这样做,只是真的想使用ToggleButtons。 然后你可以编写一个程序,一旦按下发送它的名字的button(或者其他能够唯一识别它的东西)就会被执行,作为一个过程的一个参数,除了它之外,其他所有的togglebuttons都是假的。

干杯!

表单参考

 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 

尝试这些基本的鼠标事件捕获潜艇,并修改,以满足您的需求(T鼠标=切换button名称):

 Private Sub tMouse_Click() 'MsgBox "tb value = " & tMouse.Value End Sub 

注意:如果下面的子被调用,上面的子将不起作用

 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