ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 获取直线坐标

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-2-29 21:24 | 显示全部楼层 |阅读模式
在EXCEL内已经存在一条直线,要求通过获取直线的端点坐标,用shape方法可获取到对象的左、顶、宽、高,着实际上是一个矩形的四个顶点坐标,可以组成两条直线(直线(x1,y1)-(x2,y2) 和直线(x1,y2)-(x2,y1)),怎么获取真正的直线坐标?有一个想法是分别对四个点所在位置的屏幕颜色进行计算,找出两点颜色相同的就是要求的直线顶点坐标,但是,计算屏幕颜色涉及到坐标换算,现在请教各位大大,该怎么写VBA,或者更好的确定方法

TA的精华主题

TA的得分主题

发表于 2020-2-29 22:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. sub test()
  2. Sheet1.Shapes(X).Top (顶位置)
  3. Sheet1.Shapes(X).Left (左边位置)
  4. Sheet1.Shapes(X).Width (宽度)
  5. Sheet1.Shapes(X).Height (高度)
  6. Sheet1.Shapes(X).Line.ForeColor.RGB (颜色)
  7. end sub
复制代码

TA的精华主题

TA的得分主题

发表于 2020-3-1 08:56 | 显示全部楼层
shape直线只能得到一个矩形范围,可以是2条对角线。
端点确实难确定。不知谁对此有高见。

TA的精华主题

TA的得分主题

发表于 2020-3-1 15:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
如何准确定位 shape图形的屏幕坐标?
1、GetPPI()函数用于获取显示硬件的PPI值,它是固定不变的;
2、shape图形的 .Left和.Top的值都是point(磅),而不是像素,用GetPPI()函数 转换为像素值;
3、ActiveWindow.PointsToScreenPixelsX(0)和ActiveWindow.PointsToScreenPixelsY(0) 返回的值是最左上角单元格的left和top的像素值,
    它的参数为0时,可以获取单元格"A1"的左/上的屏幕像素坐标,
    非0参数,只是得到"A1"单元格的左/上屏幕像素坐标与这个非0参数的和,并得不到指定单元格左/上的屏幕像素坐标。
以上观点、部分代码 引用 大灰狼1976overu88等 。

以下是 实践,未做更多测试。

331.jpg


识别直线方向.rar (19.8 KB, 下载次数: 9)

TA的精华主题

TA的得分主题

发表于 2020-3-1 15:13 | 显示全部楼层
  1. Sub 按钮1_Click()
  2. Dim hDC As Long, junk, Px, Py, PPI
  3. hDC = GetDC(0)
  4. PPI = GetPPI

  5. Px = ActiveWindow.PointsToScreenPixelsX(0)
  6. Py = ActiveWindow.PointsToScreenPixelsY(0)

  7. For Each shp In ActiveSheet.Shapes
  8. If shp.Type = msoLine Then
  9.    With shp
  10.       l = .Left / 72 * PPI
  11.       t = .Top / 72 * PPI
  12.       h = .Height / 72 * PPI
  13.       w = .Width / 72 * PPI
  14.       
  15.       temp = GetPixel(hDC, Px + l + w / 2, Py + t + h / 2)
  16.       
  17.       temp1 = GetPixel(hDC, Px + l + w / 4, Py + t + h / 4)
  18.       temp2 = GetPixel(hDC, Px + l + w / 4, Py + t + h * 3 / 4)
  19.    
  20.    'junk = SetCursorPos(Px + l + w / 4, Py + t + h * 3 / 4)
  21.    End With
  22.    Exit For
  23. End If
  24. Next
  25. junk = ReleaseDC(0, hDC)

  26. If temp1 = temp Then
  27.    If temp2 = temp Then MsgBox "水平或垂直" Else MsgBox "左上右下"
  28. ElseIf temp2 = temp Then
  29.    MsgBox "左下右上"
  30. Else
  31.    MsgBox "识别方向失败"
  32. End If
  33. End Sub
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-3-1 17:06 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
受教了!谢谢zopey!

TA的精华主题

TA的得分主题

发表于 2020-3-1 19:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
对于粗线条可以识别,对细线条则不能。
2020-3-1失败.png

TA的精华主题

TA的得分主题

发表于 2020-3-1 20:32 | 显示全部楼层
笨办法是 线条宽度 先加粗上色,再复原。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-12 11:34 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 09:27 , Processed in 0.038894 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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