大家好,欢迎来到IT知识分享网。
先舔一下Excel,当你想要某个特性,正在犹豫Excel会不会有呢,Excel已经迫不及待的点头:Yes。即使大部分人用一辈子电子表格都不会提及。
昨天想给Excel添加一个“额外的”聚光灯效果(这个真没有,Wps都有了,高版本未知),想要获取某个单元格的物理坐标。,,,
==============正题============
1、Excel 里面单元格的物理坐标,是以表格里面 “A1” 单元格为原点的。(准确的是A1左上角那个点)
比如下图中E5的坐标,需要参照A1获取,这样的好处是微软只需要测量到A1的坐标,其他都是基于A1偏移的,可以通过计算可得。
2、注意是A1的左上角点,这个参照点是跟随“A1”跑的,即使A1被滚动到不见的位置。
不是你屏幕中看到的标题的交叉点。
即使A1被滚动顶到了屏幕之外,Excel仍然测量的是A1的坐标,如图2中,A1坐标为-1086 -228。
Excel中获取A1坐标的方法:
Application.ActiveWindow.PointsToScreenPixelsX(0)
Application.ActiveWindow.PointsToScreenPixelsY(0)
3、如何获取“指定单元格”的偏移值呢
既然老妖前面提到了所得数据是“基于A1的偏移值”,怎么获取呢?以图3为例,我要获取E5的偏移值。
获取E5偏移值的方法:
Range("E5").left
Range("E5").top
4、坐标原点有了,偏移值有了,是不是直接加一下就可以了呢?
还不行,微软在记录这个偏移值的时候不是用的像素,用的是磅,很奇怪吧。所以需要换算。
第一步、磅转成英寸,好在excel本身提供这个转换,函数是英寸转磅,所以取个倒数即可。
磅转英寸=1/Application.InchesToPoints(1)
第二步、英寸转像素点,这个涉及到屏幕大小、分辨率等等,好在windows有API可以取得
hDC := DllCall("GetDC", Ptr, 0, Ptr)
LPX := DllCall("GetDeviceCaps", Ptr, hDC, UInt, 0x58) ;LOGPIXELSX 横向每英寸逻辑像素数量
LPY := DllCall("GetDeviceCaps", Ptr, hDC, UInt, 0x5A) ;LOGPIXELSY 纵向每英寸逻辑像素数量
这是ahk的代码写法。
第三步、excel的表格可能实施了缩放,比如75%、300%等等,这个缩放系数倒是简单
applicaiton.ActiveWindow.Zoom
第四步、综合计算一下看看
以X坐标为例:
A1的x坐标+E5横向偏移值*zoom/100 * 磅转英寸 * 英寸转像素点
附上完整代码,第一次对此挖掘,有错漏的欢迎交流指正
F9::
hDC1 := DllCall("GetDC", Ptr, 0, Ptr)
logpixelsx := DllCall("GetDeviceCaps", Ptr, hDC1, UInt, 0x58) ;LOGPIXELSX
logpixelsy := DllCall("GetDeviceCaps", Ptr, hDC1, UInt, 0x5A) ;LOGPIXELSY
DllCall("ReleaseDC", Ptr, 0, Ptr, hDC1)
ox:=ox() ;实际上就是官网Excel_Get函数,没有的请自行找一下,或者去群里问一下
pointsPerInch := ox.InchesToPoints(1)
缩放及转换系数X := (ox.ActiveWindow.Zoom/100)*logpixelsx/pointsPerInch ; 缩放因子,zoom、ppi、逻辑
缩放及转换系数Y := (ox.ActiveWindow.Zoom/100)*logpixelsy/pointsPerInch
;A1 坐标 当前sheet的“A1”的坐标,此为其他单元格的参照点,滚动上去不可见时,为负数、
A1物理坐标X := ox.ActiveWindow.PointsToScreenPixelsX(0) ; PointsToScreenPixelsX/Y(0)是工作表上单元格A1左上端坐标系原点,以此为参照
A1物理坐标Y := ox.ActiveWindow.PointsToScreenPixelsY(0) ; 所以冻结情况下,显然会出问题,Excel的逻辑需要进一步了解
;A1 坐标 当前sheet的“A1”的坐标,此为其他单元格的参照点,滚动上去不可见时,为负数、
E5偏移值x := ox.Range("E5").left ; PointsToScreenPixelsX/Y(0)是工作表上单元格A1左上端坐标系原点,以此为参照
E5偏移值y := ox.Range("E5").top ; 所以冻结情况下,显然会出问题,Excel的逻辑需要进一步了解
E5坐标x:=A1物理坐标X+E5偏移值x*缩放及转换系数X
E5坐标y:=A1物理坐标y+E5偏移值y*缩放及转换系数y
msg:= "单元格A1的坐标:`n==========A1`nX=" A1物理坐标X "`tY=" A1物理坐标Y
msg.= "`n单元格E5的坐标:`n==========A1`nX=" E5坐标x "`tY=" E5坐标y
msg.= "`n单元格E5的坐标偏移值:`n==========A1`nX=" E5偏移值x "`tY=" E5偏移值y
ToolTip %msg%
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/65201.html