Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3591|回复: 5

[已解决]请老师帮助:从多个文本文件中取值,生成需要样式的工作表。谢谢!!

[复制链接]
发表于 2014-11-10 00:57 | 显示全部楼层 |阅读模式
从多个文本文件中取值,生成需要样式的工作表,请老师帮助提供VBA解决思路,谢谢!
附件已上传,简单说明如下:
1、文本文件有多个,名称不固定,均为txt格式,放在同一目录下。
2、工作表样式已经设定好,取值来自文本文件的表头信息和有账号行的信息。其中客户号、科目号、货币号对“账号”信息的二次拆分(以"."分割)。
3、生成工作表时,希望有种方式,1是可以按照原文本文件名称产生独自的工作表,2是产生一张汇总的工作表。


最佳答案
2014-11-10 15:12
本帖最后由 suye1010 于 2014-11-10 15:27 编辑
  1. Const WINDOW_HANDLE = 0
  2. Const OPTIONS = 0
  3. Sub Consolidation()
  4. Application.ScreenUpdating = False
  5. Dim objShell, objFolder, FolderPath, FSO, FSOFolder, FSOFile, TxtFile
  6. Dim RegExp As Object, NSH As Worksheet, SRNo As Long, TRNo As Long
  7. Dim BH, BBMC, JGMC, BBYS, BMMC, BMH, BBRQ, HB
  8. Dim TempStr, TempArr, ArrS(0 To 10000, 1 To 17), ArrT(0 To 50000, 1 To 17)
  9. ArrT(0, 1) = "编号"
  10. ArrT(0, 2) = "报表名称"
  11. ArrT(0, 3) = "机构名称"
  12. ArrT(0, 4) = "报表页数"
  13. ArrT(0, 5) = "部门名称"
  14. ArrT(0, 6) = "部门号"
  15. ArrT(0, 7) = "报表日期"
  16. ArrT(0, 8) = "货币"
  17. ArrT(0, 9) = "账号"
  18. ArrT(0, 10) = "客户号"
  19. ArrT(0, 11) = "科目号"
  20. ArrT(0, 12) = "货币号"
  21. ArrT(0, 13) = "账号名称"
  22. ArrT(0, 14) = "最后交易日"
  23. ArrT(0, 15) = "余额"
  24. ArrT(0, 16) = "月日均余额"
  25. ArrT(0, 17) = "年日均余额"
  26. Set objShell = CreateObject("Shell.Application")
  27. Set objFolder = objShell.BrowseForFolder(WINDOW_HANDLE, "选择文本文件所在的文件夹", OPTIONS, "")
  28. If objFolder Is Nothing Then Exit Sub
  29. FolderPath = objFolder.Self.Path
  30. Set FSO = CreateObject("Scripting.FileSystemObject")
  31. Set FSOFolder = FSO.GetFolder(FolderPath)
  32. Set RegExp = CreateObject("VBSCRIPT.REGEXP")
  33. With RegExp
  34.     .Global = False
  35.     .Pattern = "\d{1,10}.\d{4}.\d{3}"
  36. End With
  37. For Each FSOFile In FSOFolder.Files
  38. If FSOFile.Type = "Text Document" Then
  39.     SRNo = 0
  40.     ArrS(0, 1) = "编号"
  41.     ArrS(0, 2) = "报表名称"
  42.     ArrS(0, 3) = "机构名称"
  43.     ArrS(0, 4) = "报表页数"
  44.     ArrS(0, 5) = "部门名称"
  45.     ArrS(0, 6) = "部门号"
  46.     ArrS(0, 7) = "报表日期"
  47.     ArrS(0, 8) = "货币"
  48.     ArrS(0, 9) = "账号"
  49.     ArrS(0, 10) = "客户号"
  50.     ArrS(0, 11) = "科目号"
  51.     ArrS(0, 12) = "货币号"
  52.     ArrS(0, 13) = "账号名称"
  53.     ArrS(0, 14) = "最后交易日"
  54.     ArrS(0, 15) = "余额"
  55.     ArrS(0, 16) = "月日均余额"
  56.     ArrS(0, 17) = "年日均余额"

  57.     Set TxtFile = FSOFile.OpenAsTextStream(1)
  58.         Do While Not TxtFile.AtEndOfStream
  59.             TempStr = TxtFile.readline
  60.             If InStr(TempStr, "编号") Then
  61.                 BH = Replace(Split(TempStr)(2), "编号:", "")
  62.                 BBMC = Application.WorksheetFunction.Trim(TxtFile.readline)
  63.             End If
  64.             If InStr(TempStr, "机构名称") Then
  65.                 JGMC = Replace(Split(TempStr)(2), "机构名称:", "")
  66.                 BBYS = Mid(Split(TempStr, "第")(1), 1, 4)
  67.             End If
  68.             If InStr(TempStr, "部门名称") Then BMMC = Application.WorksheetFunction.Trim(Split(TempStr, "部门名称:")(1))
  69.             If InStr(TempStr, "部门号") Then
  70.                 BMH = Replace(Split(TempStr)(2), "部门号:", "")
  71.                 BBRQ = Split(TempStr)(16)
  72.                 HB = Split(TempStr, "货币:")(1)
  73.             End If
  74.             If RegExp.Test(TempStr) Then
  75.                 SRNo = SRNo + 1
  76.                 TRNo = TRNo + 1
  77.                 TempArr = Split(Application.WorksheetFunction.Trim(TempStr))
  78.                 ArrS(SRNo, 1) = BH: ArrT(TRNo, 1) = BH
  79.                 ArrS(SRNo, 2) = BBMC: ArrT(TRNo, 2) = BBMC
  80.                 ArrS(SRNo, 3) = JGMC: ArrT(TRNo, 3) = JGMC
  81.                 ArrS(SRNo, 4) = BBYS: ArrT(TRNo, 4) = BBYS
  82.                 ArrS(SRNo, 5) = BMMC: ArrT(TRNo, 5) = BMMC
  83.                 ArrS(SRNo, 6) = BMH: ArrT(TRNo, 6) = BMH
  84.                 ArrS(SRNo, 7) = BBRQ: ArrT(TRNo, 7) = BBRQ
  85.                 ArrS(SRNo, 8) = HB: ArrT(TRNo, 8) = HB
  86.                 ArrS(SRNo, 9) = TempArr(0): ArrT(TRNo, 9) = TempArr(0)
  87.                 ArrS(SRNo, 10) = Split(TempArr(0), ".")(0): ArrT(TRNo, 10) = Split(TempArr(0), ".")(0)
  88.                 ArrS(SRNo, 11) = Split(TempArr(0), ".")(1): ArrT(TRNo, 11) = Split(TempArr(0), ".")(1)
  89.                 ArrS(SRNo, 12) = Split(TempArr(0), ".")(2): ArrT(TRNo, 12) = Split(TempArr(0), ".")(2)
  90.                 ArrS(SRNo, 13) = TempArr(1): ArrT(TRNo, 13) = TempArr(1)
  91.                 ArrS(SRNo, 14) = TempArr(2): ArrT(TRNo, 14) = TempArr(2)
  92.                 ArrS(SRNo, 15) = TempArr(3): ArrT(TRNo, 15) = TempArr(3)
  93.                 ArrS(SRNo, 16) = TempArr(4): ArrT(TRNo, 16) = TempArr(4)
  94.                 ArrS(SRNo, 17) = TempArr(5): ArrT(TRNo, 17) = TempArr(5)
  95.             End If
  96.         Loop
  97.     Set NSH = ThisWorkbook.Worksheets.Add
  98.     NSH.Name = Replace(FSOFile.Name, ".txt", "")
  99.     NSH.Cells.NumberFormat = "@"
  100.     NSH.Range("A1").Resize(UBound(ArrS, 1) + 1, UBound(ArrS, 2)) = ArrS
  101.     Erase ArrS
  102.     TxtFile.Close
  103. End If
  104. Next
  105. Set NSH = ThisWorkbook.Worksheets.Add
  106. NSH.Name = "Total"
  107. NSH.Cells.NumberFormat = "@"
  108. NSH.Range("A1").Resize(UBound(ArrT, 1) + 1, UBound(ArrT, 2)) = ArrT

  109. Set NSH = Nothing
  110. Set RegExp = Nothing
  111. Set FSOFolder = Nothing
  112. Set FSO = Nothing
  113. Set objFolder = Nothing
  114. Set objShell = Nothing
  115. Application.ScreenUpdating = True
  116. End Sub
复制代码
生成表样式.zip (17.35 KB, 下载次数: 13)

文本及表样.rar

10.67 KB, 下载次数: 14

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-11-10 15:12 | 显示全部楼层    本楼为最佳答案   

FileSystemObject + Regular Express

本帖最后由 suye1010 于 2014-11-10 15:27 编辑
  1. Const WINDOW_HANDLE = 0
  2. Const OPTIONS = 0
  3. Sub Consolidation()
  4. Application.ScreenUpdating = False
  5. Dim objShell, objFolder, FolderPath, FSO, FSOFolder, FSOFile, TxtFile
  6. Dim RegExp As Object, NSH As Worksheet, SRNo As Long, TRNo As Long
  7. Dim BH, BBMC, JGMC, BBYS, BMMC, BMH, BBRQ, HB
  8. Dim TempStr, TempArr, ArrS(0 To 10000, 1 To 17), ArrT(0 To 50000, 1 To 17)
  9. ArrT(0, 1) = "编号"
  10. ArrT(0, 2) = "报表名称"
  11. ArrT(0, 3) = "机构名称"
  12. ArrT(0, 4) = "报表页数"
  13. ArrT(0, 5) = "部门名称"
  14. ArrT(0, 6) = "部门号"
  15. ArrT(0, 7) = "报表日期"
  16. ArrT(0, 8) = "货币"
  17. ArrT(0, 9) = "账号"
  18. ArrT(0, 10) = "客户号"
  19. ArrT(0, 11) = "科目号"
  20. ArrT(0, 12) = "货币号"
  21. ArrT(0, 13) = "账号名称"
  22. ArrT(0, 14) = "最后交易日"
  23. ArrT(0, 15) = "余额"
  24. ArrT(0, 16) = "月日均余额"
  25. ArrT(0, 17) = "年日均余额"
  26. Set objShell = CreateObject("Shell.Application")
  27. Set objFolder = objShell.BrowseForFolder(WINDOW_HANDLE, "选择文本文件所在的文件夹", OPTIONS, "")
  28. If objFolder Is Nothing Then Exit Sub
  29. FolderPath = objFolder.Self.Path
  30. Set FSO = CreateObject("Scripting.FileSystemObject")
  31. Set FSOFolder = FSO.GetFolder(FolderPath)
  32. Set RegExp = CreateObject("VBSCRIPT.REGEXP")
  33. With RegExp
  34.     .Global = False
  35.     .Pattern = "\d{1,10}.\d{4}.\d{3}"
  36. End With
  37. For Each FSOFile In FSOFolder.Files
  38. If FSOFile.Type = "Text Document" Then
  39.     SRNo = 0
  40.     ArrS(0, 1) = "编号"
  41.     ArrS(0, 2) = "报表名称"
  42.     ArrS(0, 3) = "机构名称"
  43.     ArrS(0, 4) = "报表页数"
  44.     ArrS(0, 5) = "部门名称"
  45.     ArrS(0, 6) = "部门号"
  46.     ArrS(0, 7) = "报表日期"
  47.     ArrS(0, 8) = "货币"
  48.     ArrS(0, 9) = "账号"
  49.     ArrS(0, 10) = "客户号"
  50.     ArrS(0, 11) = "科目号"
  51.     ArrS(0, 12) = "货币号"
  52.     ArrS(0, 13) = "账号名称"
  53.     ArrS(0, 14) = "最后交易日"
  54.     ArrS(0, 15) = "余额"
  55.     ArrS(0, 16) = "月日均余额"
  56.     ArrS(0, 17) = "年日均余额"

  57.     Set TxtFile = FSOFile.OpenAsTextStream(1)
  58.         Do While Not TxtFile.AtEndOfStream
  59.             TempStr = TxtFile.readline
  60.             If InStr(TempStr, "编号") Then
  61.                 BH = Replace(Split(TempStr)(2), "编号:", "")
  62.                 BBMC = Application.WorksheetFunction.Trim(TxtFile.readline)
  63.             End If
  64.             If InStr(TempStr, "机构名称") Then
  65.                 JGMC = Replace(Split(TempStr)(2), "机构名称:", "")
  66.                 BBYS = Mid(Split(TempStr, "第")(1), 1, 4)
  67.             End If
  68.             If InStr(TempStr, "部门名称") Then BMMC = Application.WorksheetFunction.Trim(Split(TempStr, "部门名称:")(1))
  69.             If InStr(TempStr, "部门号") Then
  70.                 BMH = Replace(Split(TempStr)(2), "部门号:", "")
  71.                 BBRQ = Split(TempStr)(16)
  72.                 HB = Split(TempStr, "货币:")(1)
  73.             End If
  74.             If RegExp.Test(TempStr) Then
  75.                 SRNo = SRNo + 1
  76.                 TRNo = TRNo + 1
  77.                 TempArr = Split(Application.WorksheetFunction.Trim(TempStr))
  78.                 ArrS(SRNo, 1) = BH: ArrT(TRNo, 1) = BH
  79.                 ArrS(SRNo, 2) = BBMC: ArrT(TRNo, 2) = BBMC
  80.                 ArrS(SRNo, 3) = JGMC: ArrT(TRNo, 3) = JGMC
  81.                 ArrS(SRNo, 4) = BBYS: ArrT(TRNo, 4) = BBYS
  82.                 ArrS(SRNo, 5) = BMMC: ArrT(TRNo, 5) = BMMC
  83.                 ArrS(SRNo, 6) = BMH: ArrT(TRNo, 6) = BMH
  84.                 ArrS(SRNo, 7) = BBRQ: ArrT(TRNo, 7) = BBRQ
  85.                 ArrS(SRNo, 8) = HB: ArrT(TRNo, 8) = HB
  86.                 ArrS(SRNo, 9) = TempArr(0): ArrT(TRNo, 9) = TempArr(0)
  87.                 ArrS(SRNo, 10) = Split(TempArr(0), ".")(0): ArrT(TRNo, 10) = Split(TempArr(0), ".")(0)
  88.                 ArrS(SRNo, 11) = Split(TempArr(0), ".")(1): ArrT(TRNo, 11) = Split(TempArr(0), ".")(1)
  89.                 ArrS(SRNo, 12) = Split(TempArr(0), ".")(2): ArrT(TRNo, 12) = Split(TempArr(0), ".")(2)
  90.                 ArrS(SRNo, 13) = TempArr(1): ArrT(TRNo, 13) = TempArr(1)
  91.                 ArrS(SRNo, 14) = TempArr(2): ArrT(TRNo, 14) = TempArr(2)
  92.                 ArrS(SRNo, 15) = TempArr(3): ArrT(TRNo, 15) = TempArr(3)
  93.                 ArrS(SRNo, 16) = TempArr(4): ArrT(TRNo, 16) = TempArr(4)
  94.                 ArrS(SRNo, 17) = TempArr(5): ArrT(TRNo, 17) = TempArr(5)
  95.             End If
  96.         Loop
  97.     Set NSH = ThisWorkbook.Worksheets.Add
  98.     NSH.Name = Replace(FSOFile.Name, ".txt", "")
  99.     NSH.Cells.NumberFormat = "@"
  100.     NSH.Range("A1").Resize(UBound(ArrS, 1) + 1, UBound(ArrS, 2)) = ArrS
  101.     Erase ArrS
  102.     TxtFile.Close
  103. End If
  104. Next
  105. Set NSH = ThisWorkbook.Worksheets.Add
  106. NSH.Name = "Total"
  107. NSH.Cells.NumberFormat = "@"
  108. NSH.Range("A1").Resize(UBound(ArrT, 1) + 1, UBound(ArrT, 2)) = ArrT

  109. Set NSH = Nothing
  110. Set RegExp = Nothing
  111. Set FSOFolder = Nothing
  112. Set FSO = Nothing
  113. Set objFolder = Nothing
  114. Set objShell = Nothing
  115. Application.ScreenUpdating = True
  116. End Sub
复制代码
生成表样式.zip (17.35 KB, 下载次数: 13)

评分

参与人数 2 +4 收起 理由
tiger2008 + 1 赞一个!
Excel学徒123 + 3 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2014-11-10 17:05 | 显示全部楼层
suye1010 发表于 2014-11-10 15:12

部分地方可以用循环简化{:1012:}
回复

使用道具 举报

 楼主| 发表于 2014-11-10 17:40 | 显示全部楼层
suye1010 发表于 2014-11-10 15:12

非常感谢suye1010老师的帮助,老师费心啦,俺也要认真学习理解,谢谢!
回复

使用道具 举报

 楼主| 发表于 2014-11-10 17:52 | 显示全部楼层
suye1010 发表于 2014-11-10 15:12

报告老师,运行后只生成了表头,没有导入数据,可以看一下吗?另外感觉导入速度很慢,可以优化吗?谢谢!

点评

我这边运行完全正常。倒入2个文本文件瞬时就完成了  发表于 2014-11-10 22:49
回复

使用道具 举报

 楼主| 发表于 2014-11-10 23:52 | 显示全部楼层
tiger2008 发表于 2014-11-10 17:52
报告老师,运行后只生成了表头,没有导入数据,可以看一下吗?另外感觉导入速度很慢,可以优化吗?谢谢! ...

把这句  If FSOFile.Type = "Text Document" Then
改成  If FSOFile.Type = "文本文档" Then  就行了。
谢谢老师!

点评

我忘记我用的是英文版的操作系统,你的是中文版的啦。  发表于 2014-11-11 10:53
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-15 13:21 , Processed in 0.278015 second(s), 18 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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