ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] vba如何批量读取TXT中指定的字符到excel指定的单元格

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-3-12 09:38 | 显示全部楼层 |阅读模式

表格实例

表格实例
求助.jpg

如上面所示,我文件夹内有N多个文本,需要循坏读取所有文本文档内相应的信息到相应的表格中,求助各位大神给写个代码,谢谢!

date.zip

9.81 KB, 下载次数: 30

实例文档

TA的精华主题

TA的得分主题

发表于 2018-3-12 11:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub Clltxt()
    Dim p$, f$, fso As Object, Txt As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    r = Array("sysname", "Comware Software,", "uptime is", "CPU usage:", "Used Rate:")
    p = ThisWorkbook.Path & "\"
    f = Dir(p & "*.txt")
    ReDim arr(1 To 5000, 1 To 5)
    Do While f <> ""
        k = k + 1
        Set Txt = fso.OpenTextFile(p & f, 1)
        s = Txt.readall
        For i = 0 To UBound(r)
            ar = Split(s, r(i))
            If UBound(ar) Then
                sr = Split(ar(1), vbCrLf)
                If i <> 3 Then
                    arr(k, i + 1) = sr(0)
                Else
                    arr(k, i + 1) = sr(1) & vbCrLf & sr(2) & vbCrLf & sr(3)
                End If
            End If
        Next
        Txt.Close
        f = Dir
    Loop
    ActiveSheet.UsedRange.Offset(1).ClearContents
    [a2].Resize(k, UBound(arr, 2)) = arr
    Set Txt = Nothing
    Set fso = Nothing
    MsgBox "ok"
End Sub

TA的精华主题

TA的得分主题

发表于 2018-3-12 11:59 | 显示全部楼层
date.rar (20.43 KB, 下载次数: 49)

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-13 10:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

非常感谢大神的帮助!万分感谢!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-13 11:13 | 显示全部楼层
看见星光 发表于 2018-3-12 11:58
Sub Clltxt()
    Dim p$, f$, fso As Object, Txt As Object
    Set fso = CreateObject("Scripting.Fi ...

大神,我还有一点疑问,我看了一下你写的循环语句。
                If i <> 3 Then
                    arr(k, i + 1) = sr(0)
                Else
                    arr(k, i + 1) = sr(1) & vbCrLf & sr(2) & vbCrLf & sr(3)

这个的意思应该是CPU利用率输出关键字下面的三行,如果我有一个需要输入的信息行数不确定,但是这段信息结束有一个特殊的字符串“end”,(可能表述的不清楚,以CPU利用率为例,目前是三行,但是有的设备不止三行,我想让他在读取到“end”这个结束字符后{这时候1设备可能是三行、2设备可能是5行}再写入指定的单元格)这个代码应该如何写?请大神指教,谢谢。

TA的精华主题

TA的得分主题

发表于 2018-3-13 11:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
leha001 发表于 2018-3-13 11:13
大神,我还有一点疑问,我看了一下你写的循环语句。
                If i  3 Then
                   ...

else 后面那句改成:
arr(k, i + 1) = split(ar(1),"end")(0)
end是结束的关键词。

TA的精华主题

TA的得分主题

发表于 2018-3-13 13:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Public Sub tt()
  2.     Dim fso As Object, fp$, ts As Object, fl As Object, str$, arr(1 To 1, 1 To 5)
  3.     Dim reg As Object, i&, brr(1 To 5), n&
  4.     With Application.FileDialog(msoFileDialogFolderPicker)
  5.         If .Show Then
  6.             fp = .SelectedItems(1)
  7.         Else
  8.             Exit Sub
  9.         End If
  10.     End With
  11.     If Right(fp, 1) <> "" Then fp = fp & ""
  12.     Set fso = CreateObject("scripting.filesystemobject")
  13.     Set reg = CreateObject("vbscript.regexp")
  14.     ActiveSheet.UsedRange.Offset(1, 0).Clear
  15.     brr(1) = "sysname .+"
  16.     brr(2) = "Comware Software, .+"
  17.     brr(3) = "uptime is .+"
  18.     brr(4) = "CPU usage:\r\n.+\r\n.+\r\n.+"
  19.     brr(5) = "Used Rate: .+"
  20.     For Each fl In fso.getfolder(fp).Files
  21.         If fso.getextensionname(fl) = "txt" Then
  22.             Set ts = fl.openastextstream(1)
  23.             str = ts.readall
  24.             ts.Close
  25.             For i = 1 To 5
  26.                 reg.Pattern = brr(i)
  27.                 If reg.test(str) Then
  28.                     arr(1, i) = reg.Execute(str)(0)
  29.                 Else
  30.                     arr(1, i) = ""
  31.                 End If
  32.             Next
  33.             n = ActiveSheet.UsedRange.Rows.Count + 1
  34.             ActiveSheet.Range("A" & n).Resize(1, 5).Value = arr
  35.         End If
  36.     Next
  37.     brr(1) = "sysname "
  38.     brr(2) = "Comware Software, "
  39.     brr(3) = "uptime is "
  40.     brr(4) = "CPU usage:" & Chr(13) & Chr(10)
  41.     brr(5) = "Used Rate: "
  42.     For i = 1 To 5
  43.         ActiveSheet.UsedRange.Replace brr(i), ""
  44.     Next
  45.     ActiveSheet.UsedRange.EntireRow.AutoFit
  46. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-3-13 16:33 | 显示全部楼层
开始没上传附件

自动报表.rar

18.86 KB, 下载次数: 29

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-13 21:21 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-13 21:53 | 显示全部楼层
看见星光 发表于 2018-3-13 11:19
else 后面那句改成:
arr(k, i + 1) = split(ar(1),"end")(0)
end是结束的关键词。

首先,非常感谢大神的帮助,还得再麻烦一下大神,按照您告诉的方法我测试了一下,但是个别的还是有点问题,我在想,我每个信息收集到后都会有一个<设备名称>的标识,这个设备名称就是之前命令里面r = Array("sysname", "Comware Software,", "uptime is", "CPU usage:", "dis memory", "dis fan", "dis power", "  dis clock", "Clock status:")
这里面定义的"sysname",然后我仿照您给的语句,else后面的写成了arr(k, i + 1) = Split(ar(1), vbCrLf & "<" & r(0) & ">")(0)

但是实际情况是读到了这一行之后未终止,表格里面多了很多行,所以不明白那里错了,请大神指点,谢谢。

下面图片是两种不同厂商型号的设备,每条搜集信息的命令执行后,会显示设备名称+某个字符,我怎么样以这个“设备名称+特殊字符”为终止(这个“设备名称+特殊字符”就类似于我之前提到的那个“end”字符)。

思科

思科

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

本版积分规则

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

GMT+8, 2024-11-20 13:37 , Processed in 0.039654 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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