ExcelHome技术论坛

 找回密码
 免费注册
QQ登录 只需一步,快速开始
   
高效办公必会的Office99uu优优 永久免费,网表让Excel秒变数据库 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! 国内首部Excel函数公式学习大典 职场充电黑科技, Office微99uu优优 免费下载Excel行业应用视频
300集Office 2010微99uu优优 Tableau-数据可视化工具 突破Excel限制,用活字格提高效率 12门Excel免费公开课任你学
你的Excel 201099uu优优学习锦囊 欲罢不能, 过目难忘的 Office 新界面 免费的Excel考勤计算系统
查看: 232|回复: 11
打印 上一主题 下一主题

[求助] 数据量大时程序运行缓慢

[复制链接]
TA的精华主题TA的得分主题
跳转到指定楼层
1
发表于 2017-10-10 17:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,现在当表格内数据量达到一定程度后,运行宏脚本明显感觉变慢,算法用的是双重for循环,请教大神是否能进行优化?烦请不吝赐教,谢谢!
test.rar 56.22 KB, 下载次数: 21
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 有用有用 无用无用
TA的精华主题TA的得分主题
2
 楼主| 发表于 2017-10-10 17:43 | 只看该作者 |楼主
TA的精华主题TA的得分主题
3
发表于 2017-10-10 17:57 | 只看该作者
TA的精华主题TA的得分主题
4
 楼主| 发表于 2017-10-10 18:35 | 只看该作者 |楼主
TA的精华主题TA的得分主题
5
发表于 2017-10-10 18:47 | 只看该作者
TA的精华主题TA的得分主题
6
 楼主| 发表于 2017-10-10 18:53 | 只看该作者 |楼主
duquancai 发表于 2017-10-10 18:47
任何程序代码 当数据量大时 程序运行 都会缓慢!

这个可以理解,在vba方面我是小白,就想问问像我附件里的这种情况,可否在脚本运行的时候先筛选到相应的月份数据,然后再在这些数据里面匹配查找,会不会更快些?这样可以实现吗?
TA的精华主题TA的得分主题
7
发表于 2017-10-10 19:33 | 只看该作者
本帖最后由 Nhand 于 2017-10-10 19:36 编辑

是的,你之前帖子 我给你写的是最简单的循环方式,连数组都没有用到,但是当数据量变大之后,用数组进行循环,略微可以比普通方式快一点点。你的数据还是太少,如果你有几万的数据,那么for循环,你可能几个小时都得不到结果。。。这个时候需要采用字典,并且判断方式要采用d.exists方式进行判断,这样你3000多数据,我预计大概也就几秒可以做完运算(经验之谈,我经常处理10多万的数据,对速度要求颇高)限看看别人给你写没有吧。没有的话,既然你专门喊我帮你,明天空了给你写下我修改了下时间的判断。之前做个3万对8万的处理,用了10多秒,所以我预计你3000多应该几秒完成
TA的精华主题TA的得分主题
8
发表于 2017-10-10 19:37 来自手机 | 只看该作者
yc20188 发表于 2017-10-10 18:53
这个可以理解,在vba方面我是小白,就想问问像我附件里的这种情况,可否在脚本运行的时候先筛选到相应的月份 ...

我目前的水平是 怎么样保证程序是正确的,至于优化程序以提高效率,我这VBA小白还不敢奢望!
TA的精华主题TA的得分主题
9
发表于 2017-10-10 19:45 来自手机 | 只看该作者
数据量大的时候是该考虑一下数据库了,电子表格有点困难。
TA的精华主题TA的得分主题
10
发表于 2017-10-10 19:49 | 只看该作者
试试,供参考
  • Sub 更新考勤查阅表()
  •     Dim d As Object, sDate As String, arA, arB, i&, x%
  •     Set d = CreateObject("Scripting.Dictionary")
  •     Range("a1").CurrentRegion.Offset(3).ClearContents
  •     arA = Sheets("花名册").UsedRange
  •     ReDim arB(1 To UBound(arA) - 1, 1 To 32)
  •     sDate = Format([a2].Value & "-" & [q2].Value, "yyyymm")
  •     For i = 2 To UBound(arA)
  •         d(arA(i, 1)) = i - 1
  •         arB(d(arA(i, 1)), 1) = arA(i, 1)
  •     Next
  •     arA = Sheets("考勤记录数据").Range("a1").CurrentRegion
  •     For i = 3 To UBound(arA)
  •         If d.Exists(arA(i, 3)) And Format(arA(i, 2), "yyyymm") = sDate Then
  •             x = Day(arA(i, 2)) + 1
  •             arB(d(arA(i, 3)), x) = arA(i, 4)
  •         End If
  •     Next
  •     Range("a4").Resize(d.Count, 32) = arB
  •     Set d = Nothing
  • End Sub
  • 复制代码
    您需要登录后才可以回帖 登录 | 免费注册
    本版积分规则
    关闭

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

    关注官方微信,每天坐享新鲜教程
    手机版|关于我们|联系我们|ExcelHome    GMT+8, 2017-12-11 10:07 , Processed in 1.170650 second(s), 24 queries , Gzip On.
    Powered by Discuz! X3.3 © 2001-2017 Wooffice Inc.
        沪公网安备 31011702000001号 沪ICP备11019229号 本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师
    快速回复 返回顶部 返回列表
    99uu优优