Excel精英培训网

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

[已解决][请dsmch老师看看]选择文件时以文本框显示并读取文件

[复制链接]
发表于 2014-9-29 20:20 | 显示全部楼层 |阅读模式
本帖最后由 oubaiyas122 于 2014-9-30 16:55 编辑

      老师好:
       需求如下,谢谢!
       1、让第4行代码,变成以文件框的方式显示,并选择“附件.txt”,然后接着执行后面的代码读取txt的内容。
       2、当文件框打开时,如要选择多个txt的文件。并在excel的不同sheet显示读取文本文件的内容。
  • Sub Macro1()
  • On Error Resume Next
  • Dim arr(), i&, zf$
  • Open ThisWorkbook.Path & "\附件.txt" For Input As #1
  •     w = Split(StrConv(InputB(LOF(1), #1), vbUnicode), "---    END")
  • Close #1
  • ReDim arr(1 To UBound(w), 1 To 2)
  • For i = 0 To UBound(w) - 1
  •     zf = Split(Split(w(i), "IY=")(1), ",")(0)
  •     arr(i + 1, 1) = Mid(zf, 2, Len(zf) - 2)
  •     arr(i + 1, 2) = Split(Split(w(i), " 产品类型  = ")(1), vbCrLf)(0)
  • Next
  • Range("a2").Resize(UBound(arr), 2) = arr
  • End Sub



最佳答案
2014-9-30 20:35
  1. Sub Macro2() '一次性选取多个文本文件
  2. On Error Resume Next
  3. Dim arr(), i&, zf$
  4. With Application.FileDialog(msoFileDialogOpen)
  5.         .AllowMultiSelect = True
  6.         .Show
  7.         For j = 1 To .SelectedItems.Count
  8.             If Sheets.Count < j Then Sheets.Add after:=Sheets(Sheets.Count)
  9.             Open .SelectedItems(j) For Input As #1
  10.                 w = Split(StrConv(InputB(LOF(1), #1), vbUnicode), "---    END")
  11.             Close #1
  12.             ReDim arr(1 To UBound(w), 1 To 2)
  13.             For i = 0 To UBound(w) - 1
  14.                 zf = Split(Split(w(i), "IY=")(1), ",")(0)
  15.                 arr(i + 1, 1) = Mid(zf, 2, Len(zf) - 2)
  16.                 arr(i + 1, 2) = Split(Split(w(i), " 产品类型  = ")(1), vbCrLf)(0)
  17.             Next
  18.             Sheets(j).[a1:b1] = Array("IY", "产品类型")
  19.             Sheets(j).Range("a2").Resize(UBound(arr), 2) = arr
  20.             Sheets(j).Columns.AutoFit
  21.         Next
  22. End With
  23. End Sub
复制代码

附件.rar

6.92 KB, 下载次数: 7

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-9-29 20:50 | 显示全部楼层
本帖最后由 xdragon 于 2014-9-29 21:03 编辑
  1. Sub test()
  2.     Dim fn, i%
  3.     fn = Application.GetOpenFilename("Text Files (*.txt), *.txt", , , , True)
  4.     If IsArray(fn) Then
  5.        For i = 1 To UBound(fn)
  6.            Call txt_to_excel(fn(i), i)
  7.        Next
  8.     ElseIf fn <> flase Then
  9.        Call txt_to_excel(fn, 1)
  10.     End If
  11. End Sub

  12. Sub txt_to_excel(Filename, num%)
  13.    Dim arr(), i&, zf$
  14.    On Error Resume Next
  15.    Open Filename For Input As #1
  16.        w = Split(StrConv(InputB(LOF(1), #1), vbUnicode), "---    END")
  17.    Close #1
  18.    ReDim arr(UBound(w), 1)
  19.    For i = 0 To UBound(w) - 1
  20.       zf = Split(Split(w(i), "IY=")(1), ",")(0)
  21.       arr(i, 0) = Mid(zf, 2, Len(zf) - 2)
  22.       arr(i, 1) = Split(Split(w(i), " 产品类型  = ")(1), vbCrLf)(0)
  23.    Next
  24.    If Sheets.Count < num Then Sheets.Add , Sheets(Sheets.Count)
  25.    With Sheets(num)
  26.        .Cells.Clear
  27.        .Range("A2").Resize(UBound(arr, 2)) = arr
  28.        .Range("A1:B1") = Array("IY", "产品类型")
  29.     End With
  30. End Sub
复制代码

工作簿1.zip

15.24 KB, 下载次数: 3

评分

参与人数 1 +1 收起 理由
oubaiyas122 + 1 感谢回答

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-9-30 11:12 | 显示全部楼层
可能是我说得不清楚,看的人很多。回复的人很少。
我重新说明下问题的需求:
原始的问题是通过读取txt的内容,自动对应到“效果”表里sheet1的A和B列。这个问题已经解决了。因为之前代码是用这样的格式:Open ThisWorkbook.Path & "\附件.txt" For Input As #1来读取txt。每次需要把txt放到固定的文件夹,且txt过多也不方便读取。由此展开如下两个问题:
1、通过点击sheet1里的按钮,打开文件框,手动选择“附件.txt”文件,并读取文件,生成对应的A,B列内容。
2、通过点击sheet1里的按钮,打开文件框,如有多个类似“附件.txt”文件,比如"附件1.txt","附件2.txt",需要全部选到,并读取内容,只是每一个txt文件内容,生成在不同的sheet表里,格式都一样,A和B列内容。
这两个问题应该不难吧!

表和文本.rar

9.13 KB, 下载次数: 2

回复

使用道具 举报

 楼主| 发表于 2014-9-30 11:14 | 显示全部楼层
xdragon 发表于 2014-9-29 20:50

谢谢你的回答,正在测试中。
回复

使用道具 举报

 楼主| 发表于 2014-9-30 13:50 | 显示全部楼层
没有老师回答了么?
回复

使用道具 举报

发表于 2014-9-30 20:21 | 显示全部楼层
  1. Sub Macro2() '一次性选取多个文本文件
  2. With Application.FileDialog(msoFileDialogOpen)
  3.         .AllowMultiSelect = True
  4.         .Show
  5.         For i = 1 To .SelectedItems.Count
  6.             MsgBox .SelectedItems(i)
  7.         Next
  8. End With
  9. End Sub
复制代码
回复

使用道具 举报

发表于 2014-9-30 20:35 | 显示全部楼层    本楼为最佳答案   
  1. Sub Macro2() '一次性选取多个文本文件
  2. On Error Resume Next
  3. Dim arr(), i&, zf$
  4. With Application.FileDialog(msoFileDialogOpen)
  5.         .AllowMultiSelect = True
  6.         .Show
  7.         For j = 1 To .SelectedItems.Count
  8.             If Sheets.Count < j Then Sheets.Add after:=Sheets(Sheets.Count)
  9.             Open .SelectedItems(j) For Input As #1
  10.                 w = Split(StrConv(InputB(LOF(1), #1), vbUnicode), "---    END")
  11.             Close #1
  12.             ReDim arr(1 To UBound(w), 1 To 2)
  13.             For i = 0 To UBound(w) - 1
  14.                 zf = Split(Split(w(i), "IY=")(1), ",")(0)
  15.                 arr(i + 1, 1) = Mid(zf, 2, Len(zf) - 2)
  16.                 arr(i + 1, 2) = Split(Split(w(i), " 产品类型  = ")(1), vbCrLf)(0)
  17.             Next
  18.             Sheets(j).[a1:b1] = Array("IY", "产品类型")
  19.             Sheets(j).Range("a2").Resize(UBound(arr), 2) = arr
  20.             Sheets(j).Columns.AutoFit
  21.         Next
  22. End With
  23. End Sub
复制代码
回复

使用道具 举报

发表于 2014-9-30 20:38 | 显示全部楼层
按ctrl一次选取多个文本

2.zip

10.43 KB, 下载次数: 7

评分

参与人数 2 +4 收起 理由
oubaiyas122 + 1 感谢详细的解答
新一 + 3 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-10-8 11:10 | 显示全部楼层
dsmch 发表于 2014-9-30 20:35

谢谢dsmch老师的详细讲解。解决了我的疑惑。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 10:19 , Processed in 0.358598 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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