ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 提速,提取4000多个txt,耗时56.39秒,谢谢prome3、wanghan519、lxdexcel等诸位老师!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-2-11 15:43 | 显示全部楼层
好生奇怪,为什么第一次运行的时间那么长,后续的重复运行都快很多。

速度V2.zip

1.99 KB, 下载次数: 13

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-11 19:12 | 显示全部楼层
prome3 发表于 2024-2-11 15:43
好生奇怪,为什么第一次运行的时间那么长,后续的重复运行都快很多。

谢谢老师回复

运行后,提示出错,如下图

快照8.png

TA的精华主题

TA的得分主题

发表于 2024-2-11 20:00 | 显示全部楼层
lhj323323 发表于 2024-2-11 19:12
谢谢老师回复

运行后,提示出错,如下图

把 On Error GoTo EH 语句注释掉,看是哪一行报的错。调试看看是什么原因。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-12 07:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
prome3 发表于 2024-2-11 20:00
把 On Error GoTo EH 语句注释掉,看是哪一行报的错。调试看看是什么原因。

让老师费心了

请看下图
提示下标越界
快照9.png

TA的精华主题

TA的得分主题

发表于 2024-2-12 10:48 | 显示全部楼层
lhj323323 发表于 2024-2-12 07:41
让老师费心了

请看下图


出现这个的原因是,Open 语句中的文件名在当前工作路径下不存在,所以该语句会新建一个同名的文件,然后打开文件执行下面的操作。而这个新建的文件的大小是 0 ,所以 file_size 也就是 0 ,导致 file_bytes 数组的定义范围变成 0 到 -1 ,这显然是不对的。

再往上的进一步原因是,ChDir 函数不会更改活动驱动器(C盘、D盘、E盘……),具体内容可以查看官方文档,我在这里就不赘述了。解决方法是在 ChDir 语句前面再加一个 ChDrive 函数以更改活动驱动器。

然后还有一点需要注意的是,如果代码是复制粘贴进一个未保存的 Excel 文档中运行,ThisWorkbook.Path 会返回一个空字符串,这显然会造成问题,所以在附件 V3 的代码中我改为手动选择文件夹。当然这是发给别人用的情况下需要这么做,自己能控制的环境下,必然是先保存 Excel 文档再运行代码的,这样也就不用手动选择文件夹了。

再一点是,ChDir、Dir 这些函数都太古老了,处理包含 Unicode 字符的文件名和路径名可能会有问题。推荐使用 FileSystemObject 对象来处理。现在是为了方便,暂用这些函数(实际工作中最好别用)。因为这帖子的重点不在这里,而在提速。

我很想知道我这代码在你的机器上运行速度咋样。我的方法和别人不同的地方主要在于,我是通过制表符 ( vbTab ) 来计算偏移量的,而别人都是通过换行 ( vbCrLf ) 来计算偏移量的。据我观察,只有数据行包含制表符,标题行和文件末尾的空行都没有,所以用制表符更可靠一点。然后是,别人都是对整个文件进行 StrConv ,而我只对要的那一行数据进行 StrConv ,这样会稍快一点(但不多,因为单个文本文件只有 1 MB 左右,并不大)。

最后,楼上很多人的代码中,包括你的,都是 Split( ... , vbLf) ,即只通过换行符这单个字符进行文本分割,这样导入 Excel 的数据会包含剩下的 vbCr 字符,也就是得到的数据是“脏的”,还需要用 Excel 的 CLEAN 函数进行清洗。正确的做法应该是 Split( ... , vbCrLf) 。

我的配置:
i7-1185G7,Windows 10 64位,MS Office 2019 64位

速度V3.zip

2.16 KB, 下载次数: 17

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-12 13:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
prome3 发表于 2024-2-12 10:48
出现这个的原因是,Open 语句中的文件名在当前工作路径下不存在,所以该语句会新建一个同名的文件,然 ...

老师:

太惊艳了,只用了6.13秒!!!

但有两个小问题,看看能否修改
一是打开的对话框,能否改为【模板同路径】
或者【不打开】=对话框,直接就是默认同路径
二是如下图
快照8.png


TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-12 13:10 | 显示全部楼层
prome3 发表于 2024-2-12 10:48
出现这个的原因是,Open 语句中的文件名在当前工作路径下不存在,所以该语句会新建一个同名的文件,然 ...

老师请看图

快照9.png

快照8.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-12 13:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
prome3 发表于 2024-2-12 10:48
出现这个的原因是,Open 语句中的文件名在当前工作路径下不存在,所以该语句会新建一个同名的文件,然 ...

我把保存excel,也写入到语句里,
运行时,仍提示【拒绝的权限】

  1. ActiveWorkbook.Save
  2. file_path = Dir(ThisWorkbook.Path & "" & "*.txt")
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-12 13:31 | 显示全部楼层
prome3 发表于 2024-2-12 10:48
出现这个的原因是,Open 语句中的文件名在当前工作路径下不存在,所以该语句会新建一个同名的文件,然 ...

提取全部4415支,耗时18秒!!

快照8.png

TA的精华主题

TA的得分主题

发表于 2024-2-12 14:13 来自手机 | 显示全部楼层
本帖最后由 perfect131 于 2024-2-12 15:02 编辑

open读取大文件 几十M的文件(几十万、几百万行的txt)时比较慢

还是用 fso的OpenTextFile才是最快的方案
我处理过 6.5G 4000多个txt也就1分半 客户那儿30多秒
所以电脑配置也很重要 读取代码也重要
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-1 17:38 , Processed in 0.049080 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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