如何获取光标相对于Excel矩形形状的相对坐标?
解决Excel中获取光标相对于形状的相对坐标问题
你碰到的核心问题确实是坐标系不统一:GetCursorPos返回的是屏幕像素坐标系下的位置,而形状的Left/Top是Excel工作表的点坐标系(1点=1/72英寸),直接相减自然会出错。要修正这个问题,关键是把形状的左上角坐标从工作表点坐标转换为屏幕像素坐标,再和光标位置做计算。
修正步骤和代码
首先,保持你的GetCursorPos函数声明不变,然后修改宏代码,添加坐标系转换的逻辑:
' 保持API声明不变(放在模块顶部) Declare PtrSafe Function GetCursorPos Lib "user32" (Point As POINTAPI) As Long Type POINTAPI X As Long Y As Long End Type Sub SH03G13() Dim Point As POINTAPI GetCursorPos Point ' 获取光标屏幕像素坐标 Dim rectang As Shape Set rectang = ThisWorkbook.Sheets("Sheet1").Shapes("SH03G13BACK") ' 把形状左上角的工作表点坐标转换为屏幕像素坐标 Dim shapeScreenLeft As Long Dim shapeScreenTop As Long With ActiveWindow shapeScreenLeft = .PointsToScreenPixelsX(rectang.Left) shapeScreenTop = .PointsToScreenPixelsY(rectang.Top) End With ' 计算光标相对于形状左上角的像素坐标 Dim ABCISSA As Long Dim ORDENAD As Long ABCISSA = Point.X - shapeScreenLeft ORDENAD = Point.Y - shapeScreenTop MsgBox "相对坐标:" & ABCISSA & ", " & ORDENAD End Sub
关键说明
PointsToScreenPixelsX和PointsToScreenPixelsY是Excel窗口对象的方法,专门用来把工作表中的点坐标转换为屏幕像素坐标,会自动考虑:- 工作表窗口在屏幕上的位置
- 工作表的缩放比例(比如100%、120%缩放)
- 窗口的滚动位置(如果工作表有滚动,形状的
Left/Top是相对于工作表原点,转换后会对应到实际屏幕位置)
- 现在点击形状左上角的控制点时,返回的坐标会接近(0,0),完全符合你的预期。
内容的提问来源于stack exchange,提问作者Pspl
相关产品推荐
相关产品推荐

