【发布时间】:2019-02-13 15:29:02
【问题描述】:
我想为 VBA 中的 ActiveX 按钮分别处理单击和双击事件。我的问题是单击和双击都调用了单击事件。当双击事件发生时,有没有办法抑制/绕过单击过程?我确信有一个简单的答案,但在网上找不到任何东西......
【问题讨论】:
标签: vba mouseclick-event
我想为 VBA 中的 ActiveX 按钮分别处理单击和双击事件。我的问题是单击和双击都调用了单击事件。当双击事件发生时,有没有办法抑制/绕过单击过程?我确信有一个简单的答案,但在网上找不到任何东西......
【问题讨论】:
标签: vba mouseclick-event
来自帮助
如果Click事件中有代码,则DblClick事件永远不会触发,因为Click事件是两者之间最先触发的事件。结果鼠标点击被Click事件拦截,所以不会发生DblClick事件。
尝试捕获 Mouse Down 和 Mouse Up,等待 500 毫秒,如果没有 Mouse Down,那么它是单击,如果有等待鼠标按下的时间。
双击速度 HKCU\控制面板\鼠标
数据类型范围默认值 REG_SZ 100 - 900(十进制毫秒) 500
【讨论】:
Brad Yundt 在 this post 的 Experts-Exchange 上提供了这个巧妙的解决方法。
我假设你已经问过这个 Excel - 如果我弄错了请告诉我
您可以尝试使用 Application.OnTime 来安排对 在说 1 秒延迟后左键单击。如果双击或右键单击 在此期间发生,然后在 OnTime 子中的 leftclick 事件 不会发生。
以下代码位于正在查看的工作表的代码窗格中。请注意,它使用该工作表的代码名称,而不是选项卡名称。
如所写,代码会监视 A1:A10 的左键单击、右键单击或双击单个单元格。然后它会显示一个消息框,命名被单击的单元格和单击类型。
工作表事件代码
Dim bTrapped As Boolean
Dim cel As Range, rgWatch As Range
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(cel, Target) Is Nothing Then
MsgBox "Doubleclick at " & cel.Address
bTrapped = True
Cancel = True
End If
End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(cel, Target) Is Nothing Then
MsgBox "Rightclick at " & cel.Address
bTrapped = True
Cancel = True
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim targ As Range
Set rgWatch = Range("A1:A10")
Set targ = Intersect(Target, rgWatch)
If Not targ Is Nothing Then
If targ.Cells.Count = 1 Then
bTrapped = False
Set cel = targ.Cells(1, 1)
'Allow 1 second for user to complete a rightclick or doubleclick before trapping leftclick
Application.OnTime Now + 1 / 86400, "Sheet1.DelayedWatch" 'Note that Sheet1 is codename for worksheet (not tabname)
End If
End If
End Sub
Private Sub DelayedWatch()
If bTrapped = False Then
MsgBox "Leftclick at " & cel.Address
End If
End Sub
【讨论】:
我知道这个回复迟了几年,但要取消一个事件,以防止另一个事件发生(在同一个事件上)(即当你双击时防止单击发生)执行以下操作;
Private Sub CheckBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
'Do your stuff in here to handle the doubleClick event
Cancel = True 'send back a true boolean to cancel the singleClick
End Sub
【讨论】: