ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 查找离基站最近(且距离不为0)的站点(求老师帮忙优化一下代码,提高效率)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-3-8 13:28 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 qingwusigui 于 2013-3-8 13:47 编辑

见附件,因为表1只有20多行,需要运行15秒左右,如果达到2000行的话,直接卡死。求老师优化一下代码。

原理:从sheets(“基站数据库中”)查找出离sheets(“工具”)中所有站点最近的站点(距离不为零的站点)。通过经纬度求距离判定。

我做循环的话,要循环好久。。

是不是可以用字典方法来查询最小值??提升效率的

经纬度计算最近.rar

144.7 KB, 下载次数: 202

TA的精华主题

TA的得分主题

发表于 2013-3-8 13:34 | 显示全部楼层
按照经纬度计算的话,应该计算弧长吧。

TA的精华主题

TA的得分主题

发表于 2013-3-8 16:27 | 显示全部楼层
  1. Sub 计算1()
  2.     Application.ScreenUpdating = False
  3.     Dim tt As Double
  4.     tt = Timer
  5.     Dim rng1, rng2
  6.     Dim Row1 As Long, Row2 As Long
  7.     Dim Lat2 As Double, Lng2 As Double, Distance As Double, MinDistance As Double, CellID As String, CellName As String
  8.     rng1 = Sheet1.Range("A1:D3000").Value
  9.     rng2 = Sheet2.Range("A1:D6443").Value
  10.     For Row1 = 2 To UBound(rng1)
  11.         MinDistance = &H7FFFFFF
  12.         For Row2 = 2 To UBound(rng2)
  13.             If rng1(Row1, 3) <> rng2(Row2, 3) And rng1(Row1, 4) <> rng2(Row2, 4) Then
  14.                     Distance = GetDis(CDbl(rng1(Row1, 4)), CDbl(rng1(Row1, 3)), CDbl(rng2(Row2, 4)), CDbl(rng2(Row2, 3)))
  15.                     If Distance < MinDistance Then
  16.                         Lat2 = rng2(Row2, 4)
  17.                         Lng2 = rng2(Row2, 3)
  18.                         MinDistance = Distance
  19.                         CellID = rng2(Row2, 1)
  20.                         CellName = rng2(Row2, 2)
  21.                         LatDiff = rng1(Row1, 4) - rng2(Row2, 4)
  22.                         LngDiff = rng1(Row1, 3) - rng2(Row2, 3)
  23.                     End If
  24.                 End If
  25.         Next
  26.         Sheet1.Cells(Row1, 5) = Lng2
  27.         Sheet1.Cells(Row1, 6) = Lat2
  28.         Sheet1.Cells(Row1, 7) = MinDistance
  29.         Sheet1.Cells(Row1, 8) = CellID
  30.         Sheet1.Cells(Row1, 9) = CellName
  31.         Application.StatusBar = "已处理到:" & Row1 & "行,当前进度:" & CInt(Row1 * 100 / UBound(rng1)) & "%,用时:" & CInt(Timer - tt) & "秒"
  32.         DoEvents
  33.     Next
  34.     Application.ScreenUpdating = True
  35.     MsgBox Format(Timer - tt, "0.00") & "second", 64, "运行时长: "
  36.    

  37. End Sub
复制代码
试验了一下这个代码20多行只需要1秒,3000行需要2分钟左右

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-8 18:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 qingwusigui 于 2013-3-11 12:53 编辑
小fisher 发表于 2013-3-8 16:27
试验了一下这个代码20多行只需要1秒,3000行需要2分钟左右


多谢老师赐教,我的笔记本2.5G双核,2G内存。20多行要2.5秒,1000行耗时116.5秒(07中运行)。不知道是不是我的电脑不给力。不过相比于之前的已经提升了N倍了

对了,忘了补充一下,我在07中运行速度几乎是03的2倍多。

TA的精华主题

TA的得分主题

发表于 2013-3-9 16:42 | 显示全部楼层
怎么可能要这么长时间?!这样大循环算不要把那些搞地理信息系统的折腾死啊。
按经纬度划格子啊,快得感觉不到~~~

经纬度计算最近 By Lee1892.rar

154.98 KB, 下载次数: 229

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-11 10:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lee1892 发表于 2013-3-9 16:42
怎么可能要这么长时间?!这样大循环算不要把那些搞地理信息系统的折腾死啊。
按经纬度划格子啊,快得感觉 ...

未命名.jpg LEE老师好,为什么用你的代码会出现-1的最短距离,您运行一下看看。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-11 10:46 | 显示全部楼层
lee1892 发表于 2013-3-9 16:42
怎么可能要这么长时间?!这样大循环算不要把那些搞地理信息系统的折腾死啊。
按经纬度划格子啊,快得感觉 ...

LEE老师好,用了您的代码之后,感觉特别快,而且您的划格子的创新点实在 是高啊。。

可是,我运行了一下后发现有点小问题,比如会出现-1, 还有附件里的最后三行的最近距离不对。下面图示是正确的距离。 s.bmp.jpg



经纬度计算最近 By Lee1892.rar

169.05 KB, 下载次数: 113

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-11 10:58 | 显示全部楼层
lee1892 发表于 2013-3-9 16:42
怎么可能要这么长时间?!这样大循环算不要把那些搞地理信息系统的折腾死啊。
按经纬度划格子啊,快得感觉 ...

Private Const GRID_STEP = 0.5   该值的设置 出来的结果会不一样。

TA的精华主题

TA的得分主题

发表于 2013-3-11 12:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
之前的代码未经调试优化,匆忙发上来的。
改了一下,压力测试25000个工具站查找也不过3.5秒
网格步长的设置直接影响初始化和查找时间,应该是步长小则网格初始化时间长且占用内存多,但查找时间则相应缩短

地理信息的网格查找示例 By Lee1892.rar

155.94 KB, 下载次数: 541

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-11 12:25 | 显示全部楼层
lee1892 发表于 2013-3-11 12:01
好的,测试速度很快!!多谢 老师
未命名.jpg
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-23 09:59 , Processed in 0.044072 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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