ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请教老师,如何批量提取多个txt文件固定位置的内容到excel中

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-2-28 21:26 | 显示全部楼层 |阅读模式
本帖最后由 ljfwp 于 2018-3-1 13:21 编辑

求助各位老师,一个文件夹下有N个txt文件,想提取固定位置的几个数据并罗列到excel里,请问如何用VBA代码实现,谢谢!
注:我搜索了论坛里的类似问题,但是内容一变化我就不知道怎么改了(VBA小白一个,基本不会编写程序)

如何批量提取多个txt文件固定位置的内容到excel中.rar

19.92 KB, 下载次数: 162

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-1 12:56 | 显示全部楼层
论坛里有很多类似的帖子,比如http://club.excelhome.net/forum. ... ead&tid=1333817http://club.excelhome.net/thread-1158304-2-1.html?jdfwkey=ls2o02但是我不会VBA,还请高手帮忙修改下代码,谢谢!
Sub 按钮1_Click()
    Application.ScreenUpdating = False
    a = 2
    For Each f In CreateObject("scripting.filesystemobject").getfolder(ThisWorkbook.Path & "\RawData").Files
        Open f For Input As #1
        While Not EOF(1)
            Line Input #1, str1
            If InStr(str1, ";Logged:") > 0 Then
                Cells(a, 1).Resize(1, 2) = Split(Split(str1, "Logged:")(1), " at ")
            Else
                If Left(str1, 5) = ";Min:" Then
                    Cells(a, 3) = Split(Split(str1, ";Min:")(1), "mJ")(0)
                Else
                    If Left(str1, 5) = ";Max:" Then
                        Cells(a, 4) = Split(Split(str1, ";Max:")(1), "mJ")(0)
                    Else
                        If InStr(str1, ";Average:") > 0 Then
                            Cells(a, 5) = Split(Split(str1, ";Average:")(1), "mJ")(0)
                        Else
                            If InStr(str1, ";Std.Dev.:") > 0 Then
                                Cells(a, 6) = Split(Split(str1, ";Std.Dev.:")(1), "mJ")(0)
                            Else
                                If InStr(str1, ";Overrange:") > 0 Then
                                    Cells(a, 7) = Split(str1, ";Overrange:")(1)
                                Else
                                    If InStr(str1, ";Total Pulses:") > 0 Then
                                        Cells(a, 8) = Split(str1, ";Total Pulses:")(1)
                                        a = a + 1
                                        GoTo l1
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            End If
        Wend
l1:
        Close #1
        Next f
    Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

发表于 2018-3-1 14:45 | 显示全部楼层
  1. Sub aa()
  2. Dim d As Object
  3. Dim d1 As Object, d2 As Object
  4. Dim ph As String
  5. Dim sh As Object
  6. Dim arr(), brr(), crr
  7. Dim k&, i&, j&, aa, bb, cc
  8. crr = Array("日期", "当日结存", "风险度")
  9. Set d = CreateObject("scripting.filesystemobject")
  10. Set d2 = CreateObject("VBscript.regexp")
  11. With Application.FileDialog(msoFileDialogFolderPicker)
  12.     If .Show = True Then
  13.         ph = .SelectedItems(1)
  14.         ph = ph & IIf(Right(ph, 1) <> "", "", "")
  15.     End If
  16. End With
  17. With d2
  18.     .Global = True
  19.     .Pattern = "\W+\:\d+\.\d+|\W+\:\d+"
  20. End With
  21. With d
  22.     For Each sh In .getfolder(ph).Files
  23.         If .getextensionname(sh) = "txt" Then
  24.             i = i + 1
  25.             Set d1 = .opentextfile(sh)
  26.             Do While Not d1.atendofstream
  27.                 k = k + 1
  28.                 ReDim Preserve arr(1 To k)
  29.                 arr(k) = d1.readline
  30.                 aa = Replace(arr(k), " ", "")
  31.                 Set cc = d2.Execute(aa)
  32.                 For Each bb In cc
  33.                     For j = LBound(crr) To UBound(crr)
  34.                         If Split(bb, ":")(0) = crr(j) Then
  35.                             ReDim Preserve brr(1 To 3, 1 To i)
  36.                             If crr(j) = "日期" Then
  37.                                 brr(1, i) = Format(Split(bb, ":")(1), "0000-00-00")
  38.                                 
  39.                             ElseIf crr(j) = "当日结存" Then
  40.                                 brr(2, i) = Split(bb, ":")(1)
  41.                             Else
  42.                                 brr(3, i) = Split(bb, ":")(1) & "%"
  43.                             End If
  44.                         End If
  45.                     Next
  46.                 Next
  47.             Loop
  48.         End If
  49.     Next
  50. End With
  51. Sheet1.Range("a1:c1") = crr
  52. Sheet1.Range("a2").Resize(UBound(brr, 2), UBound(brr)) = Application.Transpose(brr)
  53. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-3-1 15:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ph = ph & IIf(Right(ph, 1) <> "", "", "")改成:ph = ph & IIf(Right(ph, 1) <> "\", "\", "")
代码上传时自动消失了,奇怪

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-1 15:12 | 显示全部楼层

谢谢您的回复!但是我贴到excel里时选择还有txt的文件夹出现错误“运行时错误'424':要求对象”,请再帮忙调试一下,万分感谢!

如何批量提取多个txt文件固定位置的内容到excel中.rar

44.59 KB, 下载次数: 26

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-1 15:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ww87725244 发表于 2018-3-1 15:11
ph = ph & IIf(Right(ph, 1)  "", "", "")改成:ph = ph & IIf(Right(ph, 1)  "\", "\", "")
代码上传时自 ...

修改后保存,显示“请注意!您的文档的部分内容可能包含文档检查器无法删除的个人信息。”

TA的精华主题

TA的得分主题

发表于 2018-3-1 15:30 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-1 16:29 | 显示全部楼层

谢谢,太感谢你了!已解决问题!

TA的精华主题

TA的得分主题

发表于 2018-9-27 12:09 | 显示全部楼层
新手,自己发帖不太会,可能人太多,没看见我的,请教下个各位大神,这个txt批量导入,想提取固定位置的几个数据并罗列到excel里,请问如何用VBA代码实现,谢谢!

txt文件导入.rar

40.03 KB, 下载次数: 78

TA的精华主题

TA的得分主题

发表于 2018-9-27 15:09 | 显示全部楼层
Option Explicit

Sub test()
  Dim arr, pos, filename(), i, j, m
  If Not getfilename(filename, ThisWorkbook.Path, ".txt") Then MsgBox "!": Exit Sub
  pos = Array(0, 12, 8, 10, 15, 17, 19, 25)
  ReDim brr(1 To UBound(filename), 1 To UBound(pos))
  For i = 1 To UBound(filename)
    With CreateObject("ADODB.Stream")
      .Type = 2
      .Mode = 3
      .Open
      .LoadFromFile filename(i)
      .Charset = "UTF-8"
      .Position = 2
      arr = Split(.ReadText, vbNewLine)
      .Close
    End With
    If UBound(arr) >= pos(UBound(pos)) Then
      m = m + 1
      For j = 1 To UBound(pos): brr(m, j) = arr(pos(j)): Next
    End If
  Next
  With [a2]
    .Resize(Rows.Count - 1, UBound(brr, 2)).ClearContents
    If m > 0 Then .Resize(m, UBound(brr, 2)) = brr
  End With
End Sub

Function getfilename(filename, pth, mark) As Boolean
  Dim f, n
  If Right(pth, 1) <> "\" Then pth = pth & "\"
  f = Dir(pth & "*.*")
  Do While Len(f) > 0
    If LCase(Right(f, Len(mark))) = LCase(mark) Then
      n = n + 1: ReDim Preserve filename(1 To n)
      filename(n) = pth & f
    End If
    f = Dir
  Loop
  If n > 0 Then getfilename = True
End Function

评分

3

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-16 21:24 , Processed in 0.045091 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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