Vba 在ActiveX上使用鼠标移动复选框创建工具提示
我正在尝试获取工具提示,以便在excel电子表格上的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
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。我认为用例本身有一个更一般的设计问题。哦……我误读了它。你的风格非常适合我。你应该考虑做一些评论。