ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-2-12 17:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub test3()
  2.     Dim n As Byte
  3.     Dim vResult$(), strFileName$, str$, st$, br$()
  4.     Dim nums&, y&, x&, r&, k&
  5.    
  6.    
  7.     nums = 242 * 80

  8.     ReDim vResult(1 To 200, 1 To 4)
  9.    
  10.     strFileName = Dir(ThisWorkbook.Path & "" & "*.txt")
  11.     r = 1
  12.     Do Until strFileName = ""
  13.         n = FreeFile
  14.         Open ThisWorkbook.Path & "" & strFileName For Input As #n
  15.         ' Debug.Print strFileName; LOF(n) vbCrLf
  16.          
  17.         If LOF(n) > nums Then
  18.            Seek #n, LOF(n) - nums + 1
  19.            str = StrConv(InputB(nums, #n), vbUnicode)
  20.         Else
  21.             str = StrConv(InputB(LOF(n), #n), vbUnicode)
  22.         End If
  23.                  
  24.         Close #n
  25.                
  26.         vResult(r, UBound(vResult, 2)) = Mid(strFileName, 4, 6)
  27.         k = InStrRev(str, vbCrLf, Len(str) - 100)
  28.         st = Mid(str, k + 2, 10)
  29.         x = InStr(str, st)
  30.         y = InStr(x + 20, str, vbCrLf)
  31.                              
  32.         br = Split(Mid(str, x, y - x), vbTab)
  33.         vResult(r, 1) = br(LBound(br))
  34.         vResult(r, 2) = br(LBound(br) + 6)
  35.         vResult(r, 3) = br(LBound(br) + 7)
  36.         
  37.         r = r + 1
  38.         strFileName = Dir
  39.         
  40.       Loop
  41.       
  42.         Sheets("Sheet1").[a2].Resize(r, UBound(vResult, 2)) = vResult
  43.    
  44. End Sub
复制代码


文件打开文件的优化不太容易,根据数据特点,把读取整个文件改为读取最后一块数据,由于要处理的数据量变小,所以速度还是有所提升

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-13 07:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lxdexcel 发表于 2024-2-12 17:18
文件打开文件的优化不太容易,根据数据特点,把读取整个文件改为读取最后一块数据,由于要处理的数据量 ...

老师:

谢谢回复!
61楼的源码,运行后,没有生成任何数据。

TA的精华主题

TA的得分主题

发表于 2024-2-13 08:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 wanghan519 于 2024-2-13 08:19 编辑

打包了一下,可以把这两个文件放到txt所在文件夹里试试,txt路径里最好不要有空格


速度.7z

1.53 MB, 下载次数: 8

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-13 09:53 | 显示全部楼层
prome3 发表于 2024-2-12 14:41
这个没提示拒绝权限吗?你是怎么解决拒绝权限的问题的。

还有就是为什么上面说 6.13 秒,这里又是 18. ...

老师:

请问下图的【单元格左上角】的绿三角,是什么原因造成的?
快照8.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-13 09:58 | 显示全部楼层
wanghan519 发表于 2024-2-13 08:11
打包了一下,可以把这两个文件放到txt所在文件夹里试试,txt路径里最好不要有空格

谢谢老师回复!

请看下图
快照9.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-13 10:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 lhj323323 于 2024-2-13 10:07 编辑
wanghan519 发表于 2024-2-13 08:11
打包了一下,可以把这两个文件放到txt所在文件夹里试试,txt路径里最好不要有空格

是不是output里没有文件名,就无法提取它吗?
刚才看了下,好像通篇看不到一个文件名。

快照8.png

TA的精华主题

TA的得分主题

发表于 2024-2-13 10:12 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lhj323323 发表于 2024-2-13 10:04
是不是output里没有文件名,就无法提取它吗?
刚才看了下,好像通篇看不到一个文件名。

其实command里去掉那个--no-filename参数就行,只是如果目录里有中文需要转一下编码

TA的精华主题

TA的得分主题

发表于 2024-2-13 10:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lhj323323 发表于 2024-2-13 07:13
老师:

谢谢回复!

txt文件与工作表应该在同一路径

TA的精华主题

TA的得分主题

发表于 2024-2-13 11:06 | 显示全部楼层
本帖最后由 lxdexcel 于 2024-2-13 11:07 编辑
lhj323323 发表于 2024-2-13 07:13
老师:

谢谢回复!



txt文件与工作表应在同一路径


002.rar

1.88 MB, 下载次数: 15

TA的精华主题

TA的得分主题

发表于 2024-2-13 11:07 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lhj323323 发表于 2024-2-13 09:53
老师:

请问下图的【单元格左上角】的绿三角,是什么原因造成的?

当把字符串数组赋值给工作表区域时,单元格的值的数据类型是文本,而非数字。这种做法通常用来强制保留文本的原有格式。

如果是变体 (Variant) 类型的数组赋值给单元格,Excel 会做自动转换,比如把文本文件中的“0931”转换成数字 931 存到单元格里面,就像上面 65 楼那样;还有会把诸如“2023/12/29”这样的日期字符串转换成数字 45289 再存到单元格里面,然后自动把单元格的数字格式设置为“日期”。这种情况下,单元格的值的数据类型都是数字,而非文本。

至于是保留文本类型还是数字类型,需要根据具体情况而定。比如序号 01,02,03…99 这种,就该保留为文本类型;销售额这些,该保留为数字格类型。

在 VBA 中,可以使用具体类型的数组(而非变体数组)来强制保留数据类型,防止Excel 做(某些情况下不恰当的)隐式转换。比如我的这段代码中,只用了一个字符串数组 result 来保留最终结果,可以改为两个数组,比如 result_datetime 和 result_numbers,前者存储前两列日期时间字符串(数组元素数据类型是 String ),后者存储后面那六列的数字(数组元素数据类型是 Double )。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 21:43 , Processed in 0.045132 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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