ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 11734|回复: 34

[求助] 如何用API函数实现坐标转换

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-5-15 23:20 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:Windows API应用
恳请高手帮忙:
在excel中,如何能够通过API函数的运用,准确地知道某个单元格的坐标(用像素为单位或其它单位)?这个坐标如果是客户区坐标系的值,如何转换为屏幕坐标系的值(不要通过鼠标当前位置来判断)?
问题也可以说成这样:如何在屏幕坐标系excel中的workbook窗口的坐标系之间进行转换?没发现Workbook窗口有句柄属性,如果有这个属性的话,问题就解决了。
先谢谢了!

[ 本帖最后由 fdd 于 2009-5-21 22:48 编辑 ]

TA的精华主题

TA的得分主题

发表于 2009-5-15 23:33 | 显示全部楼层
刚开始学API,与楼主一起等答案

TA的精华主题

TA的得分主题

发表于 2009-5-15 23:40 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-5-16 14:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 xowi99 于 2009-5-16 13:50 发表
workbook窗口是有句柄的?
怎么获得呀,还望指教

workbook窗口是有句柄的,先用hwnd=FindWindow("XLMAIN",Application.Caption)得到Excel主窗口句柄(xp之后的版本可以直接用hwnd=Application.hwnd得到)然后用hwndDesk=FindWindowEx(hwnd,0,"XLDESK",VBNullString)得到工作区的窗口句柄
然后用hwndWkbk=FindWindowEx(hwndDesk0,,"EXCEL7",ActiveWorkBook.Caption)就可以得到工作簿的窗口了

TA的精华主题

TA的得分主题

发表于 2009-5-16 13:46 | 显示全部楼层
workbook窗口是有句柄的,我短信中已经回复了
但是ClientToScreen函数不能将单元格坐标精确转换为屏幕坐标,原因是单元格的Left和Top属性是相对于单元格A1左上角的,而ClientToScreen函数要求传入的参数是窗口客户区坐标,也就是相对于窗口客户区左上角的坐标,它和单元格A1之间还隔着一个行号和列标的区域,这个区域的宽度和高度既没有相应的VBA属性,也没有相应的API函数可以获取,而且行号的宽度是不固定的,当显示第100-140行和1000-1040行的时候,显而易见,后者的宽度更大,但具体大多少,还没找到规律,而且当工作表缩放显示的时候,这个宽度也不是严格成倍增大或缩小的
另外还需注意滚动的行数和列数,这个可以通过ActiveWindow或ThisWorkbook.Windows(1)的ScrollRows和ScrollColumns来获取
更严格一点来说,还要考虑是否有窗口拆分,要定位的单元格在哪个Pane里面

[ 本帖最后由 小fisher 于 2009-5-16 13:52 编辑 ]

TA的精华主题

TA的得分主题

发表于 2009-5-16 13:50 | 显示全部楼层

回复 4楼 小fisher 的帖子

workbook窗口是有句柄的?
怎么获得呀,还望指教

TA的精华主题

TA的得分主题

发表于 2009-5-16 13:54 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-16 13:58 | 显示全部楼层
原帖由 小fisher 于 2009-5-16 13:46 发表
workbook窗口是有句柄的,我短信中已经回复了
但是ClientToScreen函数不能将单元格坐标精确转换为屏幕坐标,原因是单元格的Left和Top属性是相对于单元格A1左上角的,而ClientToScreen函数要求传入的参数是窗口客户区 ...


我按照您给我短信的内容所示步骤做了,也发现了您所说的问题了。大侠毕竟功力深厚,能否潜心研究一下,而后把成果分享?我也再试试!
多谢“小fisher”的回复!

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-16 14:19 | 显示全部楼层
原帖由 小fisher 于 2009-5-16 14:00 发表

workbook窗口是有句柄的,先用hwnd=FindWindow("XLMAIN",Application.Caption)得到Excel主窗口句柄(xp之后的版本可以直接用hwnd=Application.hwnd得到)然后用hwndDesk=FindWindowEx(hwnd,0,"XLDESK",VBNullStrin ...


我把行列标题去掉,然后把单元格的left和top值换成像素值,按您的方法一转换,结果与鼠标置于相同位置所获取的值相同,证明与您所说一致。下面就寻找一下行列标题的宽度或高度如何动态获取。

TA的精华主题

TA的得分主题

发表于 2009-5-16 14:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 fdd 于 2009-5-16 13:58 发表


我按照您给我短信的内容所示步骤做了,也发现了您所说的问题了。大侠毕竟功力深厚,能否潜心研究一下,而后把成果分享?我也再试试!
多谢“小fisher”的回复!

我也没有实际操作过,不过有两种思路可以得到工作表中处于最左上角的单元格的坐标,您可以参考一下:
1。临时图表法。即在工作表中添加一个带句柄的临时控件,比如图表,将它与最左上角的单元格(通过ActiveWindow的ScrollRows和ScrollColumns可以知道它的行号和列标)对齐,用.Activate方法激活它,这时可以使用hwndChart=FindWindowEx(hwndDesk,0,"EXCELE",ActiveWorkBook.Caption)得到图表窗口的句柄(注:这里的hwndDesk是用前面方法得到的工作区窗口句柄),然后再使用GetWindowRect即可得到它的屏幕矩形坐标,同时也是左上角单元格的屏幕坐标,之后再删除这个临时控件就可以了。
2。扫描法。即从一个点(x,y)(开始设X=窗口屏幕Left,Y=窗口屏幕Top + 窗口宽度/2,如果窗口不是缩得很小,通常这个点正下方会有单元格)开始,使用For语句让x每次增加1个像素,使用ActiveWindow.RangeFromPoint(X,Y),如果得到的不是Nothing,说明这个点已经在单元格中,这样得到最上方的单元格在屏幕上的垂直坐标;再使用同样原理可以得到最左侧的单元格在屏幕上的水平坐标。 注意这里得到的最左上角的单元格不一定是A1,因为可能有滚动。

[ 本帖最后由 小fisher 于 2009-5-16 14:37 编辑 ]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-7 03:07 , Processed in 0.034381 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表