ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

多列数据的文本文件中提取数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-10-31 12:03 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

需要从文本文件中,提取第一列的数字, vb如何操作?

在之前的贴子中看到下面的语句,但是无法实现多列文本中提取的功能。

Sub addall()

Application.ScreenUpdating = False

Dim arr() As String, i As Long, n As Long, b() As Byte, temp As String, lines() As String, x As Long


ReDim arr(1 To 5, 1 To 65535) '一个二维数组,4列,excel最大能有65535行,

temp = Dir([a1] & "\*.txt")

While temp > ""

n = n + 1

arr(1, n) = temp '数组(1,n)为文件名

Open [a1] & "\" & temp For Binary As #1 '使用1#通道存储打开的文件

ReDim b(LOF(1)) '取得文件长度,定义为数组的长度

Get #1, , b '读取最后的数字',将打开的文本文件读取到数组b中


Close #1 '关闭1#通道

On Error Resume Next '如果错误则跳出,改变错误陷阱


lines = Split(StrConv(b, vbUnicode), vbCrLf) '建立一个数组,数组内容为文件的内容:把文本内容按结束符加换行符分成数组,
'这样lines数组里的每一个元素就是文本文件里每一行的内容。第一行是lines(0),第二行是lines(1),依此类推。


arr(2, n) = lines([b1]) 'arr是个两维数组,arr(1,1)是表示第一个文件的名字,
'arr(2,1)是表示第一个文件第7行的内容,arr(3,1)是表示第一个文件第9行的内容,arr(1,1)是表示第一个文件第12行的内容,依此类推。

arr(3, n) = lines([c1])

arr(4, n) = lines([d1])

arr(5, n) = lines([e1])

temp = Dir() '令循环结束条件达到

Wend '结束循环

ReDim Preserve arr(1 To 5, 1 To n)

[a2].Resize(n, 5) = WorksheetFunction.Transpose(arr) '数组arr粘贴到表格中

Application.ScreenUpdating = True
End Sub

avVcXIVb.rar (709 Bytes, 下载次数: 713)


已经上传了需要导入的文本文件。我最后需要导入8944125214963660509这个字段。

[此贴子已经被作者于2007-10-31 22:32:08编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-10-31 12:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lines = Split(StrConv(b, vbUnicode), vbCrLf) '建立一个数组,数组内容为文件的内容:把文本内容按结束符加换行符分成数组,
'这样lines数组里的每一个元素就是文本文件里每一行的内容。第一行是lines(0),第二行是lines(1),依此类推。


是不是这句的问题呢?

因为文本文件中一共有三列,用TAb分隔开

TA的精华主题

TA的得分主题

发表于 2007-10-31 13:32 | 显示全部楼层

lines = Split(StrConv(b, vbUnicode), vbCrLf)

数组元素是某行的整个内容

TA的精华主题

TA的得分主题

发表于 2007-10-31 13:39 | 显示全部楼层

try:

Sub addall()
Application.ScreenUpdating = False
Dim arr() As String, i As Long, j As Long, n As Long, temp As String, lines() As String, x As Long
ReDim arr(1 To 5, 1 To 65535)
temp = Dir([a1] & "\*.txt")
While temp > ""
n = n + 1
ReDim Preserve arr(1 To 5, 1 To n)
arr(1, n) = temp '数组(1,n)为文件名
On Error Resume Next
Open [a1] & "\" & temp For Input As #1 '使用1#通道存储打开的文件
lines = Split(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf)
Close #1 '关闭1#通道
For j = 2 To 5
arr(j, n) = Split(lines(Cells(1, j) - 1), vbTab)(0)
Next
temp = Dir()
Wend
[a2].Resize(n, 5) = arr
Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-10-31 16:45 | 显示全部楼层

谢谢狼版。

不过还是不能够导入多行文本的第一列,我现在有些怀疑这个文本文件是否格式不正确?现在无法上传附件,下班后再上传,谢谢阿

TA的精华主题

TA的得分主题

发表于 2007-10-31 22:40 | 显示全部楼层

TRy:

Sub addall()
Application.ScreenUpdating = False
Dim arr() As String, i As Long, j As Long, n As Long, temp As String, lines() As String, x As Long
ReDim arr(1 To 5, 1 To 65535)
temp = Dir([a1] & "\*.txt")
While temp > ""
n = n + 1
ReDim Preserve arr(1 To 5, 1 To n)
arr(1, n) = temp '数组(1,n)为文件名
On Error Resume Next
Open [a1] & "\" & temp For Input As #1 '使用1#通道存储打开的文件
lines = Split(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf)
Close #1 '关闭1#通道
For j = 2 To 5
arr(j, n) = Split(lines(Cells(1, j) - 1))(0)
Next
temp = Dir()
Wend
[a2].Resize(n, 5) = WorksheetFunction.Transpose(arr)
Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-10-31 23:53 | 显示全部楼层

谢谢狼版这么晚还解答,真是无私的教育工作者。

测试通过,正在学习中,遇到问题再向您请教。谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-11-1 00:05 | 显示全部楼层

lines = Split(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf)

arr(j, n) = Split(lines(Cells(1, j) - 1))(0)

请教狼版,上面两个语句的作用是什么呢?还有黄色部分的用法.谢谢您

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-11-1 09:14 | 显示全部楼层

狼版好:我查了很久资料,麻烦您看看下面的解释对不对?

lines = Split(StrConv(InputB(LOF(1), #1), vbUnicode), vbCrLf) '将1号通道打开的文件,写入到lines数组中,
'lines = Split(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf) #1写成1也是可以的
'变量 = Input(串长度,文件号)
'inputb:如果要将整个文件复制到变量,请使用InputB函数将字节从文件复制到变量。
'由于InputB函数返回一个ASCII字符串,因此,必须用StrCopy函数将ASCII字符串转换为Unicode字符串。
'代码如下:file = StrCopy (Input (LOF(filenanum),filenum),vbUnicode)
'vbCrLf ,遇上回车换行符为止

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-11-1 09:17 | 显示全部楼层

对于这句:

arr(j, n) = Split(lines(Cells(1, j) - 1))(0)

(0),可以改变查找的列数,举一反三:测试中发现一个问题,如果我要用第二列,返回的值中却包含了“,”,请问如何取消这个逗号。

另外,这个语句用法麻烦详细解释下,非常感谢。

[此贴子已经被作者于2007-11-1 9:31:06编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-25 12:45 , Processed in 0.039309 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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