ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求一个VBA ,根据经纬度求出是否在区域内。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-3-19 16:36 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
说明:表1 A2单元格是一个区域的经纬度,根据“查询表C列提供的经纬度,分析所在的经纬度是否在该区域内”

区域经纬度.rar

14.91 KB, 下载次数: 12

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-3-19 16:58 | 显示全部楼层
  1. <span style="background-color: transparent; color: inherit; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: inherit; white-space: pre-wrap;">def IsPtInPoly(aLon, aLat, pointList):  </span>
复制代码
   '''''     :param aLon: double 经度     :param aLat: double 纬度     :param pointList: list [(lon, lat)...] 多边形点的顺序需根据顺时针或逆时针,不能乱     '''            iSum = 0      iCount = len(pointList)            if(iCount < 3):          return False                  for i in range(iCount):                    pLon1 = pointList[0]          pLat1 = pointList[1]                    if(i == iCount - 1):                            pLon2 = pointList[0][0]              pLat2 = pointList[0][1]          else:              pLon2 = pointList[i + 1][0]              pLat2 = pointList[i + 1][1]                    if ((aLat >= pLat1) and (aLat < pLat2)) or ((aLat>=pLat2) and (aLat < pLat1)):                            if (abs(pLat1 - pLat2) > 0):                                    pLon = pLon1 - ((pLon1 - pLon2) * (pLat1 - aLat)) / (pLat1 - pLat2);                                    if(pLon < aLon):                      iSum += 1        if(iSum % 2 != 0):          return True      else:          return False  这是网上的一个代码   有没有高人帮忙改成VBA的

TA的精华主题

TA的得分主题

发表于 2022-3-19 18:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
........................

区域经纬度.rar

26.31 KB, 下载次数: 8

TA的精华主题

TA的得分主题

发表于 2022-3-19 18:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
以前搞过一个,网优的

TA的精华主题

TA的得分主题

发表于 2022-3-19 19:06 | 显示全部楼层
请测试!
Option Explicit
Sub ggh()
Dim ws1 As Worksheet, ws2 As Worksheet, arr, k, d, i
Set d = CreateObject("scripting.dictionary")
Set ws1 = Sheets("1"): Set ws2 = Sheets("查询")
arr = Split(ws1.[a2], ";")
For i = 1 To UBound(arr)
    d(arr(i)) = ""
Next i
k = ws2.[c2]
ws2.[d2] = ""
If d.exists(k) Then
    ws2.[d2] = "是"
Else
    ws2.[d2] = "否"
End If
End Sub

区域经纬度.rar

20.34 KB, 下载次数: 7

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-3-19 19:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
夏天的风shh4695 发表于 2022-3-19 19:06
请测试!
Option Explicit
Sub ggh()

给出的是边界  不是数值   你这个不对哈  不过谢谢你  

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-3-19 20:02 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-7-20 10:33 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-7-20 16:07 | 显示全部楼层
不知道对不对
  1. Sub pd()
  2. Dim x(1 To 9999), y(1 To 9999)
  3. a = Sheets("1").[a2].Value
  4. sp = Split(a, ";")
  5. For i = 0 To UBound(sp)
  6.     b = Split(sp(i), ",")
  7.     n = n + 1
  8.     x(n) = Val(b(0))
  9.     y(n) = Val(b(1))
  10. Next i
  11. 东经 = WorksheetFunction.Min(x)
  12. 西经 = WorksheetFunction.Max(x)
  13. 北纬 = WorksheetFunction.Max(y)
  14. 南纬 = WorksheetFunction.Min(y)


  15. With Sheets("查询")
  16.     lr = .Cells(Rows.Count, 3).End(3).Row
  17.     arr = .Range("C1:D" & lr)

  18.     For i = 2 To lr
  19.         jwd = Split(arr(i, 1), ",")
  20.         Select Case Val(jwd(0))
  21.             Case 东经 To 西经
  22.                 jd = 1
  23.             Case Else
  24.                 jd = 0
  25.         End Select
  26.         
  27.         Select Case Val(jwd(1))
  28.             Case 南纬 To 北纬
  29.                 wd = 1
  30.             Case Else
  31.                 wd = 0
  32.         End Select
  33.         
  34.         If jd = 1 And wd = 1 Then
  35.             arr(i, 2) = "Y"
  36.         Else
  37.             arr(i, 2) = "N"
  38.         End If
  39.     Next i
  40. .Range("C1:D" & lr) = arr
  41. End With
  42. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 04:56 , Processed in 0.037371 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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