ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] vba处理数据太耗时:求助大神优化一下代码

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-6 17:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zpy2 发表于 2024-6-6 17:04
循环耗时:15.58203

有点没看明白,不知道是不是可以用sql查询

处理逻辑大概就是循环读取sheet的每行数据,然后根据考勤号、考勤日期、考勤机器号作为一个Key,然后取最晚日期和最早日期两条数据。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-6 17:16 | 显示全部楼层
zpy2 发表于 2024-6-6 17:10
勤号
                atdNum = sheet.Cells(currentRow, 3).Text
前面单元格赋值给数组

嗯,这个是优化的一个方向,现在主要耗时的地方是下标数据得到之后,循环删除行速度太慢了。找了一圈没看到可以批量删除excel行的代码,只能循环一行一行的删除。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-6 17:24 | 显示全部楼层
zpy2 发表于 2024-6-6 17:04
循环耗时:15.58203

有点没看明白,不知道是不是可以用sql查询

请问用Sql查询怎么做呢?我现在是循环取的值,操作excel比较频繁。

TA的精华主题

TA的得分主题

发表于 2024-6-6 21:02 来自手机 | 显示全部楼层
fenc 发表于 2024-6-6 17:11
这个数据整理之后是要导入一个考勤系统里面,所以还是只能输出成excel文件。

都整成这样子了 还需要考勤系统。。。。
你主要耗时就是输出到Excel的 Io读写,循环就算减少一点,也不明显

TA的精华主题

TA的得分主题

发表于 2024-6-6 21:13 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
fenc 发表于 2024-6-6 17:24
请问用Sql查询怎么做呢?我现在是循环取的值,操作excel比较频繁。

   
        '根据下标循环删除指定行
        For Each deleteIndex In deleteArr
            'Debug.Print deleteIndex ' 输出当前元素到立即窗口
            newWb.Worksheets(1).rows(deleteIndex).Delete
        Next deleteIndex

这段用sql应该是会快一点 ,但是,输出到Excel麻烦。

你前面 deleteArr 啥意思,还是没看明白,每天最早打卡时间和最晚打卡时间之间的记录?

TA的精华主题

TA的得分主题

发表于 2024-6-6 21:22 来自手机 | 显示全部楼层
fenc 发表于 2024-6-6 17:13
处理逻辑大概就是循环读取sheet的每行数据,然后根据考勤号、考勤日期、考勤机器号作为一个Key,然后取最 ...

https://club.excelhome.net/forum.php?mod=viewthread&tid=1642435&fromguid=hot&extra=&mobile&_dsign=61ed34c5

感觉和这个有点像,是不是可以数据量少点,再模拟一下结果。

TA的精华主题

TA的得分主题

发表于 2024-6-7 00:00 | 显示全部楼层
这么简单的要求不用搞那么复杂吧?1秒
4月汇总附件.zip (1.91 MB, 下载次数: 32)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-7 09:44 | 显示全部楼层
zpy2 发表于 2024-6-6 21:13
'根据下标循环删除指定行
        For Each deleteIndex In deleteArr
            'Debu ...

最后想得到的结果是:只保留每个人每天不同考勤机器号的最早、最晚时间记录
我的整体思路是这样的:
1、先整体循环一次数据,然后根据考勤号、考勤日期(不加时间)、机器号为Key存一个自定义类。这个类里面包含了最早打卡时间和最晚打卡时间以及对应的下标值。然后每次有更早或更晚的时间后就将记录的下标值增加到一个待删除下标集合里面去。
2、找到所有的待删除下标后,将集合转成数组并倒序排序。(转数组是因为开始我对集合进行排序很耗时,但数组就非常快)
3、最后根据这个数组循环删除对应的行。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-7 09:47 | 显示全部楼层
yynrzwh 发表于 2024-6-7 00:00
这么简单的要求不用搞那么复杂吧?1秒

十分感谢,我下载下来看看。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-7 09:50 | 显示全部楼层
zpy2 发表于 2024-6-6 21:13
'根据下标循环删除指定行
        For Each deleteIndex In deleteArr
            'Debu ...

最早打卡时间和最晚打卡时间之间的记录的行下标,这些数据是没用的。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 17:54 , Processed in 0.035265 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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