Vba 在ActiveX上使用鼠标移动复选框创建工具提示

Vba 在ActiveX上使用鼠标移动复选框创建工具提示,vba,excel,tooltip,Vba,Excel,Tooltip,我正在尝试获取工具提示,以便在excel电子表格上的ActiveX复选框上显示 下面的代码确实显示和隐藏工具提示,但与预期不同。如果在复选框上移动鼠标过快,工具提示(标签)将保留在工作表上 Private Sub chkPrice_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) With sht If .lblTooltip.Visible

我正在尝试获取工具提示,以便在excel电子表格上的ActiveX复选框上显示

下面的代码确实显示和隐藏工具提示,但与预期不同。如果在复选框上移动鼠标过快,工具提示(标签)将保留在工作表上

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

With sht
     If .lblTooltip.Visible = False Then
          .lblTooltip.Visible = True
     ElseIf .lblTooltip.Visible = True Then
          .lblTooltip.Visible = False
     End If
End With
要使上述代码正常工作,如果有以下内容:

If mousehovers for 1 second Then display the tooltip
有没有办法检查鼠标停留在控件上的时间


还有别的方法吗?

你可以做一些非常棘手的事情,所以下面你可以找到你具体答案的起点

直接回答问题

在模块顶部,您声明Microsoft API获取鼠标坐标:

Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
注意:如果您使用的是32位系统,请从声明中删除
PtrSafe
关键字。 此外,在模块顶部添加以下类型:

Type POINTAPI
   Xcoord As Long
   Ycoord As Long
End Type
因此,在宏
chkPrice\u MouseMove
中,您可以执行以下操作:

  • 触发宏时,获取鼠标坐标
  • 等一会儿,比如说半秒
  • 因此,再次获取鼠标坐标。如果它们与以前相同,则表示用户将鼠标保持在同一点上,以便您可以触发事件
代码:

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

Dim llCoordBefore As POINTAPI
Dim llCoordAfter As POINTAPI

GetCursorPos llCoordBefore '<-- get first time
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now())+0.5)
GetCursorPos llCoordAfter '<-- get second time

If llCoordBefore.Xcoord = llCoordAfter.Xcoord And llCordBefore.Ycoord = llCoordAfter.Ycoord Then '<-- compare

    With sht
         If .lblTooltip.Visible = False Then
              .lblTooltip.Visible = True
         ElseIf .lblTooltip.Visible = True Then
              .lblTooltip.Visible = False
         End If
    End With
End If
Private Sub chkPrice\u MouseMove(ByVal按钮为整数,ByVal移位为整数,ByVal X为单个,ByVal Y为单个)
Dim llCoordBefore As POINTAPI
Dim llCoordAfter As POINTAPI

GetCursorPos llCoordBefore'您可以为此做一些非常棘手的事情,因此下面您可以找到具体答案的起点

直接回答问题

在模块顶部,您声明Microsoft API获取鼠标坐标:

Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
注意:如果您使用的是32位系统,请从声明中删除
PtrSafe
关键字。 此外,在模块顶部添加以下类型:

Type POINTAPI
   Xcoord As Long
   Ycoord As Long
End Type
因此,在宏
chkPrice\u MouseMove
中,您可以执行以下操作:

  • 触发宏时,获取鼠标坐标
  • 等一会儿,比如说半秒
  • 因此,再次获取鼠标坐标。如果它们与以前相同,则表示用户将鼠标保持在同一点上,以便您可以触发事件
代码:

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

Dim llCoordBefore As POINTAPI
Dim llCoordAfter As POINTAPI

GetCursorPos llCoordBefore '<-- get first time
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now())+0.5)
GetCursorPos llCoordAfter '<-- get second time

If llCoordBefore.Xcoord = llCoordAfter.Xcoord And llCordBefore.Ycoord = llCoordAfter.Ycoord Then '<-- compare

    With sht
         If .lblTooltip.Visible = False Then
              .lblTooltip.Visible = True
         ElseIf .lblTooltip.Visible = True Then
              .lblTooltip.Visible = False
         End If
    End With
End If
Private Sub chkPrice\u MouseMove(ByVal按钮为整数,ByVal移位为整数,ByVal X为单个,ByVal Y为单个)
Dim llCoordBefore As POINTAPI
Dim llCoordAfter As POINTAPI

GetCursorPos llCoordBefore'使用
应用程序.OnTime
在鼠标移动到复选框上1秒后隐藏标签

公共代码模块 工作表代码模式
Private Sub chkPrice\u MouseMove(ByVal按钮为整数,ByVal移位为整数,ByVal X为单个,ByVal Y为单个)
如果X>0且X
在鼠标移动到复选框上1秒后,使用
应用程序.OnTime
隐藏标签

公共代码模块 工作表代码模式
Private Sub chkPrice\u MouseMove(ByVal按钮为整数,ByVal移位为整数,ByVal X为单个,ByVal Y为单个)
如果X>0且X
执行此操作时,如果用户将鼠标悬停在复选框上,因为他希望实际看到它,那么工具提示将在一秒钟后隐藏。对于“用户错误地悬停”的情况,这是一个很好的解决方案,但对于真正的用例“用户悬停以查看工具提示”来说,这不是最好的解决方案。这样做时,如果用户悬停在复选框上是因为他想实际查看它,那么工具提示将在一秒钟后隐藏。对于“用户错误地悬停”的情况,这是一个很好的解决方案,但对于“用户悬停以查看工具提示”的实际用例,这不是最好的解决方案。@TinMan是的,我已经注意到这是该方法的两个缺点之一。但是VBA是单线程的,所以在使用OnTime进行调度(这可能会在后台崩溃,不再工作,或者只是在用户已经在做其他事情时突然调用代码,因此可能会导致冲突)之间,我更喜欢使用此选项而不是OnTime。我认为用例本身有一个更一般的设计问题。哦……我误读了它。你的风格非常适合我。你应该考虑做一些评论。“蒂曼,没错,我已经注意到这是该方法的两个缺点之一。但是VBA是单线程的,所以在使用OnTime进行调度(这可能会在后台崩溃,不再工作,或者只是在用户已经在做其他事情时突然调用代码,因此可能会导致冲突)之间,我更喜欢使用此选项而不是OnTime。我认为用例本身有一个更一般的设计问题。哦……我误读了它。你的风格非常适合我。你应该考虑做一些评论。