ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 获取鼠标当前位置的单元格或对象信息

获取鼠标当前位置的单元格或对象信息

作者:绿色风 分类: 时间:2022-08-18 浏览:232
楼主
chrisfang
RangeFromPoint函数可以获取某个坐标位置上的单元格或对象,如果配合API函数GetCursorPos,则可以获取鼠标所在位置的单元格或对象信息。此思路并非本人首创,Button和chijanzen等前辈都曾有过相关论述,在此仅对此方法进行进一步的整理总结和改进。

由于工作表和工作簿没有MouseMove事件,要想实时地获取鼠标移动后的位置信息,可以借用死循环或用计时器定时反复运行程序来扫描鼠标的移动事件,以牺牲系统资源为代价换取模拟的MouseMove事件。

图表对象具有Mouse事件,不需要借用死循环或计时器即可编写出可以根据鼠标位置获取图表内容信息的程序。

以下程序根据以上思路编写,点击开始按钮开启扫描状态后,鼠标所在位置的信息可以显示在A1、A2单元格中——如果鼠标所在位置为单元格,则A1、A2单元格分别显示鼠标所在单元格的行号和列号,如果鼠标所在位置为对象(如图形、图表、文本框、艺术字、控件等等),则在A1单元格中显示其名称。

方法1:使用Loop循环

  1. Private Declare Function GetCursorPos Lib "user32" (lpPoint As MyPoint) As Long
  2. Private Type MyPoint: X As Long: Y As Long: End Type
  3. Public flag
  4. Sub mousetarget()
  5.     Dim CurPos As MyPoint
  6.     Do While flag
  7.     GetCursorPos CurPos
  8.     x1 = CurPos.X: y1 = CurPos.Y
  9.     Set CurRng = ActiveWindow.RangeFromPoint(x1, y1)
  10.     If CurRng Is Nothing Then Exit Sub
  11.     On Error Resume Next
  12.     If TypeName(CurRng) = "Range" Then
  13.         Range("A1") = CurRng.Row
  14.         Range("A2") = CurRng.Column
  15.     Else
  16.         Range("A1") = CurRng.Name
  17.         Range("A2") = ""
  18.     End If
  19.     DoEvents
  20.     Loop
  21. End Sub

  22. Sub startscan()
  23.     MsgBox "开始"
  24.     flag = True
  25.     mousetarget
  26. End Sub
  27. Sub endscan()
  28.     MsgBox "结束"
  29.     flag = False
  30. End Sub
附件如下:

鼠标位置new.rar
2楼
chrisfang
方法2:借用VBS的重复工作定时器setInterval,方法来源于chijanzen大侠:
需要在工作表中增加一个DHTML控件

  1. Private Declare Function GetCursorPos Lib "user32" (lpPoint As MyPoint) As Long
  2. Private Type MyPoint: X As Long: Y As Long: End Type
  3. Public flag
  4. Sub mousetarget()
  5.     Dim CurPos As MyPoint
  6.     GetCursorPos CurPos
  7.     x1 = CurPos.X: y1 = CurPos.Y
  8.     Set CurRng = ActiveWindow.RangeFromPoint(x1, y1)
  9.     If CurRng Is Nothing Then Exit Sub
  10.     On Error Resume Next
  11.     If TypeName(CurRng) = "Range" Then
  12.         Range("A1") = CurRng.Row
  13.         Range("A2") = CurRng.Column
  14.     Else
  15.         Range("A1") = CurRng.Name
  16.         Range("A2") = ""
  17.     End If
  18. End Sub
  19. Sub SetTimer()
  20.     Dim Src As String
  21.     Src = Src & "<Script Language = VBS>" & vbCrLf
  22.     Src = Src & "Dim tId, Target, ProcName" & vbCrLf
  23.     Src = Src & "Sub CallBack()" & vbCrLf
  24.     Src = Src & "  On Error Resume Next" & vbCrLf
  25.     Src = Src & "  Target.Run ProcName" & vbCrLf
  26.     Src = Src & "  On Error GoTo 0" & vbCrLf
  27.     Src = Src & "End Sub" & vbCrLf
  28.     Src = Src & "Sub StartTimer(Arg1, Arg2)" & vbCrLf
  29.     Src = Src & "  Set Target = Arg1: ProcName = Arg2" & vbCrLf
  30.     Src = Src & "  If tId <> 0 Then StopTimer " & vbCrLf
  31.     Src = Src & "  tId = Window.setInterval(""CallBack"", 100) " & vbCrLf
  32.     Src = Src & "End Sub" & vbCrLf
  33.     Src = Src & "Sub StopTimer()" & vbCrLf
  34.     Src = Src & "  Set Target = Nothing: Window.clearInterval tId" & vbCrLf
  35.     Src = Src & "  tId = 0" & vbCrLf
  36.     Src = Src & "End Sub" & vbCrLf
  37.     Src = Src & "</Script>"
  38.     With ThisWorkbook.Worksheets(1).DHTMLEdit1
  39.         .Width = 0: .Height = 0
  40.         .DocumentHTML = Src: .BrowseMode = True
  41.         Do While .Busy: DoEvents: Loop
  42.         .DOM.Script.StartTimer ThisWorkbook.Application, "mousetarget"
  43.     End With
  44. End Sub
  45. Sub startscan()
  46.     MsgBox "开始"
  47.     SetTimer
  48. End Sub
  49. Sub endscan()
  50.     MsgBox "结束"
  51.     On Error Resume Next
  52.     ThisWorkbook.Worksheets(1).DHTMLEdit1.DOM.Script.StopTimer
  53.     On Error GoTo 0
  54. End Sub



鼠标位置2.rar
3楼
chrisfang
方法3:使用Ontime定时+循环,反复运行。
扫描间隔时间较长,需要鼠标停留片刻以后才能显示。

  1. Private Declare Function GetCursorPos Lib "user32" (lpPoint As MyPoint) As Long
  2. Private Type MyPoint: X As Long: Y As Long: End Type
  3. Public flag
  4. Sub mousetarget()
  5.     Dim CurPos As MyPoint
  6.     GetCursorPos CurPos
  7.     x1 = CurPos.X: y1 = CurPos.Y
  8.     Set CurRng = ActiveWindow.RangeFromPoint(x1, y1)
  9.     If CurRng Is Nothing Then Exit Sub
  10.     On Error Resume Next
  11.     If TypeName(CurRng) = "Range" Then
  12.         Range("A1") = CurRng.Row
  13.         Range("A2") = CurRng.Column
  14.     Else
  15.         Range("A1") = CurRng.Name
  16.         Range("A2") = ""
  17.     End If
  18. End Sub

  19. Sub startscan()
  20.     MsgBox "开始"
  21.     flag = True
  22.     loopsub
  23. End Sub
  24. Sub endscan()
  25.     MsgBox "结束"
  26.     flag = False
  27. End Sub
  28. Sub loopsub()
  29.     If flag = True Then
  30.         mousetarget
  31.         Application.OnTime Now + TimeValue("00:00:01"), "loopsub"  
  32.     End If
  33.     DoEvents
  34. End Sub


鼠标位置3.rar
4楼
gvntw
方兄API也学得这么好!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap