【问题标题】:Handling single click and double click events on activeX button in VBA在 VBA 中处理 activeX 按钮上的单击和双击事件
【发布时间】:2019-02-13 15:29:02
【问题描述】:

我想为 VBA 中的 ActiveX 按钮分别处理单击和双击事件。我的问题是单击和双击都调用了单击事件。当双击事件发生时,有没有办法抑制/绕过单击过程?我确信有一个简单的答案,但在网上找不到任何东西......

【问题讨论】:

    标签: vba mouseclick-event


    【解决方案1】:

    来自帮助

    如果Click事件中有代码,则DblClick事件永远不会触发,因为Click事件是两者之间最先触发的事件。结果鼠标点击被Click事件拦截,所以不会发生DblClick事件。

    尝试捕获 Mouse Down 和 Mouse Up,等待 500 毫秒,如果没有 Mouse Down,那么它是单击,如果有等待鼠标按下的时间。

    双击速度 HKCU\控制面板\鼠标

    数据类型范围默认值 REG_SZ 100 - 900(十进制毫秒) 500

    【讨论】:

      【解决方案2】:

      Brad Yundtthis 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
      

      【讨论】:

      • 感谢布雷特的评论。不幸的是,我的问题模棱两可——抱歉。是的,我正在使用excel。然而,我的问题与 ActiveX 控件而不是单元格有关——我不认为“SelectionChange”函数适用于控件。你知道有什么替代品吗?
      【解决方案3】:

      我知道这个回复迟了几年,但要取消一个事件,以防止另一个事件发生(在同一个事件上)(即当你双击时防止单击发生)执行以下操作;

      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
      

      【讨论】:

        猜你喜欢
        • 2017-10-25
        • 2014-05-17
        • 1970-01-01
        • 2017-08-12
        • 1970-01-01
        • 2016-12-27
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多