ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-17 15:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:Windows API应用
原帖由 小fisher 于 2009-5-17 14:52 发表
Winland版主,为什么我这句MsgBox ActiveWindow.PointsToScreenPixelsX(0)得到的总是0啊,而且不管括号内的数字是多少,结果都是0
示例
本示例确定活动窗口中选定单元格的高度和宽度(单位:像素),并将值返回到变 ...


to 小fisher 大师:用了您短信给我的代码,结果跟原来还是一样啊?即便有doevents语句,同样需要单击两次才能显示正确的屏幕坐标。为何?
to Winland 版主:我也测试了一下,结果跟上面大师测试结果一样,显示为0。为何?

TA的精华主题

TA的得分主题

发表于 2009-5-17 15:06 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 winland 于 2009-5-17 15:02 发表
小fisher版主,你是否从VBE中运行代码,这样得出来的结果都会是返回0的。只有Excel为活动窗口,而不是从VBE中运行才可以的。

谢谢,我明白了,我有个程序也要用到这个属性,哈哈,这下简单多了

TA的精华主题

TA的得分主题

发表于 2009-5-17 15:06 | 显示全部楼层
原帖由 fdd 于 2009-5-17 15:03 发表


to 小fisher 大师:用了您短信给我的代码,结果跟原来还是一样啊?即便有doevents语句,同样需要单击两次才能显示正确的屏幕坐标。为何?
to Winland 版主:我也测试了一下,结果跟上面大师测试结果一样,显示为 ...


应该是从VBE中运行代码的原因。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-17 15:09 | 显示全部楼层
原帖由 winland 于 2009-5-17 15:06 发表


应该是从VBE中运行代码的原因。


谢谢版主,才看到您的回帖!经测试,完全正确,比我原来的方法得到的数据各多一个像素值。
看来,这个问题还有得到更简单的解决!
谢谢版主赐教!

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-17 15:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
经进一步测试,问题得到圆满解决。
特别感谢:小Fisher大师和winland版主。小Fisher大师的语句让我进一步加深了对API函数的一些认识,而且启发了我的思维。winland版主的精炼代码,也让我找到了解决问题的捷径!
再次感谢,论坛之所以人气旺,最主要的原因是有象您们这样有实力的大师的存在,向您们学习!永远!

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
把解决问题的完整代码及附件传上来,方便大家了解:
  1. '--------------API函数声明及常数定义-------------------------------------------------------------------------
  2. Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
  3. Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
  4. Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
  5. Private Const LOGPIXELSX = 88 '求屏幕横向分辨率
  6. Private Const LOGPIXELSY = 90 '求屏幕纵向分辨率
  7. '--------------API函数声明及常数定义-------------------------------------------------------------------------
  8. Sub 单元格屏幕坐标显示()
  9.     Dim PixelsPerInchX As Long
  10.     Dim PixelsPerInchY As Long
  11.     Dim hdc As Long
  12.     Dim Rng As Range
  13. '----------------获取屏幕分辨率语句---------------------------------------------
  14.     hdc = GetDC(0)
  15.     PixelsPerInchX = GetDeviceCaps(hdc, LOGPIXELSX)
  16.     PixelsPerInchY = GetDeviceCaps(hdc, LOGPIXELSY)
  17.     ReleaseDC 0, hdc
  18. '----------------获取屏幕分辨率语句---------------------------------------------
  19.     Set Rng = Range(Range("g1").Value & "")
  20.    
  21. '----------------ActiveWindow.PointsToScreenPixelsX(0)为获取A1单元格左上角屏幕横坐标--------------
  22. '----------------ActiveWindow.PointsToScreenPixelsY(0)为获取A1单元格左上角屏幕纵坐标--------------
  23. '----------------PixelsPerInchX / 72意思为:点坐标(磅)转换为像素(pixel)坐标-----------------------------
  24.    
  25.    
  26.     With Rng
  27.         [h1] = "Left: " & ActiveWindow.PointsToScreenPixelsX(0) + .Left * PixelsPerInchX / 72
  28.         [h2] = "Top : " & ActiveWindow.PointsToScreenPixelsY(0) + .Top * PixelsPerInchY / 72
  29.     End With
  30.   
  31. '--------------------------------------------------------------------------------------------------------------------------------------
  32. End Sub


复制代码

[ 本帖最后由 fdd 于 2009-5-17 15:53 编辑 ]

单元格屏幕坐标获取.rar

10.48 KB, 下载次数: 153

TA的精华主题

TA的得分主题

发表于 2009-7-7 09:36 | 显示全部楼层
'--------------API函数声明及常数定义-------------------------------------------------------------------------
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Const LOGPIXELSX = 88 '求屏幕横向分辨率
Private Const LOGPIXELSY = 90 '求屏幕纵向分辨率
'--------------API函数声明及常数定义-------------------------------------------------------------------------

Private Sub UserForm_Initialize()
    Dim PixelsPerInchX As Long
    Dim PixelsPerInchY As Long
    Dim hdc As Long
    Dim X, Y As Long
'----------------获取屏幕分辨率语句---------------------------------------------
    hdc = GetDC(0)
    PixelsPerInchX = GetDeviceCaps(hdc, LOGPIXELSX)
    PixelsPerInchY = GetDeviceCaps(hdc, LOGPIXELSY)
    ReleaseDC 0, hdc
'----------------获取屏幕分辨率语句---------------------------------------------


'----------------ActiveWindow.PointsToScreenPixelsX(0)为获取A1单元格左上角屏幕横坐标---------------------------------------------
'----------------ActiveWindow.PointsToScreenPixelsY(0)为获取A1单元格左上角屏幕纵坐标---------------------------------------------
'----------------PixelsPerInchX / 72意思为:点坐标(磅)转换为像素(pixel)坐标-----------------------------------------------------



With TRng
X = ActiveWindow.PointsToScreenPixelsX(0) + .Left * PixelsPerInchX / 72
Y = ActiveWindow.PointsToScreenPixelsY(0) + .Top * PixelsPerInchY / 72

'MsgBox TRng.AddressLocal
'MsgBox X
'MsgBox Y
End With


With STD_DLG
.Left = X
.Top = Y
End With

程序中的TRng是个公用变量,就是我点击的那个单元格.

引用了你的以上代码,我需要在点击单元格时,在单元格的右边显示对话框,结果位置始终不正确,请问怎么回事?

[ 本帖最后由 foxlandy 于 2009-7-7 09:37 编辑 ]

TA的精华主题

TA的得分主题

发表于 2009-7-7 09:57 | 显示全部楼层
关注一下,不过个人感觉这种获取没啥实际意义,受太多因素的影响

TA的精华主题

TA的得分主题

发表于 2009-7-7 10:05 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-8-18 16:13 | 显示全部楼层
试了一下,当改变缩放比例及冻结,拆分的情况,获取的单元格坐标是不对的。如何精确获得活动单元的的屏幕坐标?

TA的精华主题

TA的得分主题

发表于 2010-10-24 10:18 | 显示全部楼层
高手过招,让我等菜鸟看呆了
这个网站人气高,真不是浪得虚名
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-19 16:41 , Processed in 0.046638 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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