【Excel VBA编程】鼠标滑动,文字“显形”:从屏幕像素到Word文本坐标的追踪术
- 2026-09-24 03:14:27
总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!
很早之间,就有小伙伴提出想学习如何通过屏幕坐标捕获鼠标位置。一直以来也没有太好的案例,因为针对Excel中数据处理,单元格就是最好的坐标,无需多此一举,因此该需求就搁置了
刚好,最近在处理word文档,会通过与鼠标配合,快速、精准地定位并捕获所需的文字,那就一起聊一聊吧
在打开电脑的瞬间,我们早已习惯了用鼠标在屏幕上“指指点点”。但你是否想过:鼠标在Word文档上滑过时,其背后竟然还隐藏着一套精密的“定位系统”呢?它不仅能告诉我们光标在哪里,更能像一位敏锐的侦探,瞬间锁定鼠标下的字、词,甚至整个段落
1 效果展示
在Word测试文档中,通过工具栏上的“开发工具”“宏”,打开宏对话框,并选择宏名“MainPro”执行,操作步骤同Excel宏类似
2 代码及说明
2.1 操作步骤
打开你的.docm文档,通过word文档另存为.docm类型获取
按下 Alt + F11 快捷键,打开VBA编辑器
选择 “插入” -> “模块”,将文中代码复制粘贴到新模块中 回到Word文档窗口,通过“开发工具”“宏”,选择宏名“mainPro”运行
以上操作完成后,就可以通过移动鼠标位置获取word中的文字了。为了让用户有充足的操作时间,读取时间控制在5秒钟(Sleep 5000),可根据实际情况自行调整

2.2 代码实现
代码参考:
' 在模块顶部声明API函数和自定义类型,兼容32位和64位系统#If VBA7 ThenPrivate Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long#ElsePrivate Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long#End IfPrivate Type POINTAPIX As LongY As LongEnd Type' 声明必要的API函数,用于延时#If VBA7 ThenPrivate Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)#ElsePrivate Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)#End IfSub MainPro()Dim endTime As DoubleDim durationSeconds As LongdurationSeconds = 20 ' 设置跟踪时长(秒)endTime = Timer + durationSecondsDo While Timer < endTimeSleep 5000GetObjectByMouse ' 调用函数DoEvents ' 转让控制权,避免程序无响应LoopMsgBox "鼠标跟踪结束。"End SubSub GetObjectByMouse()Dim lppt As POINTAPIDim res As LongDim objUnderMouse As ObjectDim resultText As String' 获取当前鼠标光标在屏幕上的位置res = GetCursorPos(lppt)' 使用屏幕坐标,通过RangeFromPoint获取该点的对象Set objUnderMouse = ActiveWindow.RangeFromPoint(lppt.X, lppt.Y)' 检查获取到的对象,并选中它If Not objUnderMouse Is Nothing ThenIf TypeName(objUnderMouse) = "Range" Then' 获取指向的文字If objUnderMouse.Words.Count > 0 ThenresultText = "鼠标指向了: " & objUnderMouse.Words(1).TextElseresultText = "鼠标位置没有文字。"End IfEnd IfEnd IfMsgBox "坐标(" & lppt.X & ", " & lppt.Y & "): " & resultTextEnd Sub
其中,在模块最上方声明了两个API函数GetCursorPos和Sleep,分别用来获取屏幕坐标和延时;接着,还声明了一个自定义类型POINTAPI,用于记录二维平面上坐标位置(屏幕左上角为原点(0,0))
由于RangeFromPoint方法可能返回"Range" 或"Shape",也可能返回 Nothing,所以使用前必须用 If 语句进行判断,并用 TypeName 函数区分类型
除了使用objUnderMouse.Words获取鼠标当前位置的字/词外,还可以通过objUnderMouse.Paragraphs获取鼠标当前位置的整个段落。有需要的小伙伴可以尝试一下
3 结尾
好了,今天的编程知识到此结束了,又到每日冷知识小分享时间了
今天分享的是“鼠标”:最早的鼠标是一个由木头制成的小盒子,底部装有金属滚轮,并通过一条长长的导线连接到计算机。正是这条拖在后面的长导线,让发明它的人联想到了老鼠的尾巴。于是便戏称这个新发明为“Mouse”(“老鼠”)。当这一设备传入中国后,人们根据其英文和酷似老鼠的外形,将其巧妙地意译为“鼠标”,既保留了原名的神韵,又准确反映了其作为屏幕光标定位指示器的功能
本公众号一直在不间断地分享免费的编程案例和实用技巧。无论您是用来提升自动化办公效率还是想提升自我,请关注我的公众号,解锁更多的编程知识