文本文件里数据是六列(空格隔开),行数不确定,VB怎样读入此文本文件并赋值给数组赋值,得到数组赋值的第2、6列

查看: 24073|回复: 34
VBA中TXT文件和EXCEL进行数据交互的几种方法简析
积分学习力
魅力值 影响力
消费券 Ti币好友
在线时间 小时
最后登录月度优秀 次管理次数 次
网站名称: Excel技巧网 | Excel专家栖息谷 | 微软中文技术社区合作伙伴
署名作者: xyf2210
版权声明: 版权归本站与作者共有 除本站官方外非作者本人转载须经许可并注明出处
适用版本: &
语言环境: 简体中文
学习方法: 掌握Excel技巧的关键是动手操作
下载 ≠ 知识
免费注册成为本站会员,享用更多功能,结识更多Office办公高手!
才可以下载或查看,没有帐号?
由于工作需求,需要频繁的将业务系统导出的TXT文件数据,导入到EXCEL中,经过数据整理后,再导出到txt文本中。经过查找学习,总结了一下,EXCEL和TXT文本文件的数据交互,在VBA中,主要有以下几种方式:
按导入和导出分开来进行解析,如有一些不恰当的解释,请大家指正:
(一)导入文本文件数据到EXCEL中:
以如图所示文本文件为例:
文本文件.jpg (12.29 KB, 下载次数: 2)
23:33 上传
然后,我们要处理成这个的格式:
需求.jpg (12.93 KB, 下载次数: 1)
23:34 上传
(172.99 KB, 下载次数: 452)
00:02 上传
点击文件名下载附件
魅力值 +32
技法娴熟:)
二师兄,好V5
魔王v5******!
技法娴熟:)
学office,哪能不关注全网最大的Office类微博(新浪)
积分学习力
魅力值 影响力
消费券 Ti币好友
在线时间 小时
最后登录月度优秀 次管理次数 次
(1)首先,我们可以一个,当年在VB里面,用来处理文本文件的利器,open语句
Open语句打开文件的语法为:
Open 路径+文件名 For Input As #数字& & '数字就是打开的这个文件的别名
之后,我们可以用Line Input语句,一行行的把数据导入,并进行处理,直至文本文件的尾端(EOF(1)),详见代码。这个方法是最常用的,大家尽量学透就是了。Sub Open方法()
& & Dim d, i, sr$, temp
& & Set d = CreateObject(&scripting.dictionary&)& && &'引用字典
& & With Sheet1
& && &&&.UsedRange.ClearContents& && && && &'清除原有的数据
& && &&&i = 1
& && &&&Open ThisWorkbook.Path & &\工资表.txt& For Input As #1& & '使用open语句输入
& && &&&Do While Not EOF(1)& &'运行到文件的结尾结束
& && && && &Line Input #1, sr& && && && &'按行读取数据
& && && && &d(i) = Split(sr, &,&)& && &&&'以逗号分割字符串
& && && && &i = i + 1
& && &&&Loop
& && &&&Close #1& && && && &&&'关闭文本文件
& && &&&temp = Application.Transpose(d.Items)& &&&'转置字典的项
& && &&&.Range(&a1&).Resize(d.Count, UBound(temp)) = Application.Transpose(temp)& &&&'将数组写入单元格
& & End With
& & Set d = Nothing
End Sub复制代码
学office,哪能不关注全网最大的Office类微博(新浪)
积分学习力
魅力值 影响力
消费券 Ti币好友
在线时间 小时
最后登录月度优秀 次管理次数 次
(2)相信,很多人学习VBA,都是从录制宏学起吧,呵呵,我们可以运用,excel的获取外部数据,导入文本数据的功能(如图)
1.gif (204.34 KB, 下载次数: 5)
23:38 上传
录制宏,进行修改,来导入文本数据,我们可以发现,EXCEL其实是运用QueryTables这个对象来导入数据(QueryTables对象成员解析,详见F1帮助说明,里面很详细,本文就不再复述)。首先运用add的方法,添加连接,然后运用QUERYTABLE对象的关于分隔符设置的属性(详细见F1里面,QueryTable 对象成员中,TEXT打头的几个属性),处理文本,导入数据。详细代码如下:Sub 查询表方法()
& & With Sheet1
& && &&&.UsedRange.ClearContents& && &&&'清除原有的数据
& && &&&With .QueryTables.Add(Connection:=&TEXT;& & ThisWorkbook.Path & &\工资表.txt&, Destination:=Range(&A1&))& & '新建查询表
& && && && &.TextFileCommaDelimiter = True& && && &'以逗号作为分隔符
& && && && &.Refresh& && &'更新外部数据区域
& && &&&End With
& & End With
End Sub复制代码
学office,哪能不关注全网最大的Office类微博(新浪)
积分学习力
魅力值 影响力
消费券 Ti币好友
在线时间 小时
最后登录月度优秀 次管理次数 次
本帖最后由 xyf2210 于
23:41 编辑
(3)其实,大家不知道有没有试过,我们其实可以用文件-打开-选择文本文件-打开,的方法,也可以导入文本文件(如图)
2.gif (279.89 KB, 下载次数: 3)
23:40 上传
一样,我们可以用录制宏的方式进行学习。我们观察代码,EXCEL其实是调用了Workbooks.OpenText方法,来导入文件(F1里面,对这个方面的解释,相当的详细,大家可以去看看,主要也是一些属性的设置)。详细见如下代码解释:Sub opentext方法()
& & Dim arr
& & With Sheet1
& && &&&.UsedRange.ClearContents& && && &&&'清除原有的数据
& && &&&Workbooks.OpenText FileName:=ThisWorkbook.Path & &\工资表.txt&, DataType:=xlDelimited, Startrow:=1, comma:=True
& && &&&'startrow:=1是文本分列处理的起始行号
& && &&&'DataType:=xlDelimited是指示文件由分隔符分隔
& && &&&'comma:=true是指以逗号作为分隔符
& && &&&arr = ActiveWorkbook.Sheets(&工资表&).UsedRange
& && &&&ActiveWorkbook.Close False
& && &&&.Range(&a1&).Resize(UBound(arr), UBound(arr, 2)) = arr
& & End With
End Sub复制代码
学office,哪能不关注全网最大的Office类微博(新浪)
积分学习力
魅力值 影响力
消费券 Ti币好友
在线时间 小时
最后登录月度优秀 次管理次数 次
本帖最后由 xyf2210 于
00:06 编辑
(4)我们还可以调用FSO(FileSystemObject)方法来导入文本文件。FSO对象,大家一般都是用于文件和文件夹的处理。其实它也支持对文本流对象的处理的。FSO对象博大精深,详细的解释请参考MSDN,由于这个对象较难,初学者,可以把以下代码,作为模板,进行修改使用。Sub fso方法()
& & Dim d, i, sr$, temp, myfile As Object
& & With Sheet1
& && &&&.UsedRange.ClearContents
& && &&&Set d = CreateObject(&scripting.dictionary&)& && && &&&'引用字典
& && &&&Set myfile = CreateObject(&scripting.filesystemobject&).OpenTextFile(ThisWorkbook.Path & &\工资表.txt&)
& && &&&'引用FSO需要单击工具-引用-选中Microsoft Scripting Runtime
& && &&&'fso的opentextfile方法文件并返回一个TextStream对象
& && &&&i = 1
& && &&&Do While Not myfile.AtEndOfStream& && && &&&'运行到myfile的结尾
& && && && &sr = myfile.ReadLine& && && && && && && &'读取整行
& && && && &d(i) = Split(sr, &,&)
& && && && &i = i + 1
& && &&&Loop
& && &&&myfile.Close
& && &&&temp = Application.Transpose(d.Items)
& && &&&.Range(&a1&).Resize(d.Count, UBound(temp)) = Application.Transpose(temp)
& & End With
& & Set d = Nothing: Set myfile = Nothing
End Sub复制代码
学office,哪能不关注全网最大的Office类微博(新浪)
积分学习力
魅力值 影响力
消费券 Ti币好友
在线时间 小时
最后登录月度优秀 次管理次数 次
本帖最后由 xyf2210 于
23:03 编辑
(5)接下来是,ADO+SQL法,很多数据库的高手,喜欢用SQL来处理文本数据,这个方法比较灵活,可以先读入再分列,但是比较复杂,而且ADO对象解析起来也可以写一本书了。大家也是,把以下代码,当做模板,进行修改使用。Sub ado方法()
& & Dim adoconn As Object, strSQL As String, strConn As String, AdoRst As Object
& & Dim i, txt
& & Set adoconn = CreateObject(&adodb.connection&)
& & txt = ThisWorkbook.Path & &\工资表.txt&
& & With Sheet1
& && &&&.UsedRange.ClearContents& && && &&&'清除原有的数据
& && &&&'设置连接字符串
& && &&&strConn = &Provider=Microsoft.ACE.OLEDB.12.0;& & _
& && && && && && &&Data Source=& & ThisWorkbook.Path & &;Extended Properties=&&THDR=YES&&&
& && &&&strSQL = &select * from 工资表.txt&& && &&&'设置SQL查询语句
& && &&&adoconn.Open strConn& && && && && && && && && & '打开数据库连接
& && &&&Set AdoRst = adoconn.Execute(strSQL)& &'执行查询,并将结果输出到记录集对象
& && &&&For i = 0 To AdoRst.Fields.Count - 1
& && && && &.Cells(1, i + 1) = AdoRst.Fields(i).Name& && && && &&&'填写标题
& && &&&Next
& && &&&.Range(&A2&).CopyFromRecordset AdoRst& && && && &&&'导入记录集
& & End With
& & AdoRst.Close: adoconn.Close& && && && && &'关闭数据库连接
End Sub复制代码
学office,哪能不关注全网最大的Office类微博(新浪)
积分学习力
魅力值 影响力
消费券 Ti币好友
在线时间 小时
最后登录月度优秀 次管理次数 次
本帖最后由 xyf2210 于
23:46 编辑
(6)最后一种,来个偏门,仅作为补充学习,较难。当没有WINDOW的时候,大家又是怎么读取文本文件的呢。呵呵,在DOS环境里面,可以用type语句来显示文本文件的数据。在VBA里面,我们可以借用WSH,来执行DOS语句,并将文本内容读入。先行声明,Windows95/98 中已经都可以使用长文件名/目录 (最长可以到255个字节),但是目前版本不支持复杂的长文件名,可以利用API函数取得短文件名,再利用短文件名读入文本文件。
Sub dos用法()
& & Dim StrCmd As String, StrPath As String * 256, LngRes As Integer
& & Dim i As Integer, str As String, arr1, arr2
& & LngRes = GetShortPathName(ThisWorkbook.Path & &\工资表.txt&, StrPath, 256)
& & Sheet1.UsedRange.ClearContents
& & str = CreateObject(&wscript.shell&).exec(Environ(&comspec&) & & /c&&type & & StrPath).StdOut.ReadAll
& & arr1 = Split(str, vbCrLf)
& & ReDim arr2(1 To UBound(arr1), 1 To 3)
& & For i = 1 To UBound(arr1)
& && &&&arr2(i, 1) = Split(arr1(i - 1), &,&)(0)
& && &&&arr2(i, 2) = Split(arr1(i - 1), &,&)(1)
& && &&&arr2(i, 3) = Split(arr1(i - 1), &,&)(2)
& & Next i
& & [a1].Resize(i - 1, 3) = arr2
End Sub复制代码
学office,哪能不关注全网最大的Office类微博(新浪)
积分学习力
魅力值 影响力
消费券 Ti币好友
在线时间 小时
最后登录月度优秀 次管理次数 次
讲完了导入,那导出呢,我们怎么把数据从EXCEL导出到TXT文件呢。呵呵,其实很多都是上面几种方法的反方向而已。
(1)第一种,还是,OPEN语句
Open 路径+文件名 For Output As #数字 ‘数字为文件的别名
用OPEN语句创建文本文件,就可以使用PRINT语句,一行行的输出文本内容了。Sub test()
& & Dim file As String, arr, i
& & '定义文本文件的名称
& & file = ThisWorkbook.Path & &\工资表.txt&
& & '判断是否存在同名文本文件,存在先行删除
& & If Dir(file) && && Then Kill file
& & '将当前的数据读入数组
& & arr = Sheet2.Range(&a1&).CurrentRegion
& & '使用print语句将数组中所有数据写入文本文件
& & Open file For Output As #1
& & For i = 1 To UBound(arr)
& && &&&Print #1, Join(Application.Index(arr, i), &,&)
& & Next
& & '关闭文本文件
& & Close #1
End Sub复制代码
学office,哪能不关注全网最大的Office类微博(新浪)
积分学习力
魅力值 影响力
消费券 Ti币好友
在线时间 小时
最后登录月度优秀 次管理次数 次
本帖最后由 xyf2210 于
23:55 编辑
(2)还是录制宏,录制,文件-另存为-文本文件的宏(如图)
3.gif (274.23 KB, 下载次数: 3)
23:54 上传
这个方法的好处就是,处理速度很快,但是就是,格式比较单一,较难个性化的保存其中的文本数据。Sub 另存为文本文件()
& & Dim file As String
& & '定义文本文件的名称
& & file = ThisWorkbook.Path & &\工资表.txt&
& & '判断是否存在同名文本文件,存在先行删除
& & If Dir(file) && && Then Kill file
& & '复制工作表另存为文本文件,xlCSV即保存为文本文件
& & Sheet2.Copy
& & ActiveWorkbook.SaveAs FileName:=file, FileFormat:=xlCSV
& & ActiveWorkbook.Close False
End Sub复制代码
学office,哪能不关注全网最大的Office类微博(新浪)
积分学习力
魅力值 影响力
消费券 Ti币好友
在线时间 小时
最后登录月度优秀 次管理次数 次
本帖最后由 xyf2210 于
23:57 编辑
(3)第三种,调用FSO对象,去创建和保存文本数据。这个方法一样,比较难,作为拓展了解吧。可以使用createtextfile和OpenTextFile进行操作。Sub createtextfile()
& & Dim arr, i, myfile As Object
& & '创建FSO对象利用Createtextfile方法创建文本文件
& & 'object.CreateTextFile(filename[, overwrite[, unicode]])
& & '参数overwrite是可选的,表示是否覆盖已存在文件,如果省略,则已存在文件不能覆盖,这里面这只True,表示覆盖
& & Set myfile = CreateObject(&scripting.filesystemobject&).createtextfile(ThisWorkbook.Path & &\工资表.txt&, True)
& & '将当前的数据读入数组
& & arr = Sheet2.Range(&a1&).CurrentRegion
& & '使用WriteLine方法写入一个指定的字符串和换行符到文本文件中
& & For i = 1 To UBound(arr)
& && &&&myfile.WriteLine Join(Application.Index(arr, i), &,&)
& & Next
& & '关闭对象
& & myfile.Close
& & Set myfile = Nothing
End Sub
Sub OpenTextFile()
& & Dim arr, i, myfile As Object
& & '创建FSO对象利用OpenTextFile方法创建文本文件
& & 'object.OpenTextFile(filename[, iomode[, create[, format]]])
& & '参数iomode是可选的,1 forreading,打开只读,不能操作;8 forappending,打开并写入尾部
& & '参数create是可选的,没有即创建
& & '此例即追加
& & Set myfile = CreateObject(&scripting.filesystemobject&).OpenTextFile(ThisWorkbook.Path & &\工资表.txt&, 8, True)
& & '将当前的数据读入数组
& & arr = Sheet2.Range(&a1&).CurrentRegion
& & '使用WriteLine方法写入一个指定的字符串和换行符到文本文件中
& & For i = 1 To UBound(arr)
& && &&&myfile.WriteLine Join(Application.Index(arr, i), &,&)
& & Next
& & '关闭对象
& & myfile.Close
& & Set myfile = Nothing: Erase arr
End Sub复制代码
学office,哪能不关注全网最大的Office类微博(新浪)
Excel技巧网的会员探讨问题仅代表其个人意见,与网站的立场无关。任何违反国家和地方相关法律法规的言论,本站有义务协助政府相关部门追究发言者的责任!
本站中非注明转载文章与案例的版权为作者与Excel技巧网共有。若非原文作者,本站之外任何单位或个人未经允许,不得将其用于商业用途。
若非原文作者,任何形式的非商业性转载必须获得Excel技巧网或作者允许,并注明作者和出处。
会员发表的帖子如涉及版权纠纷,须自行负责。详情请参考注册时的网站服务条款。
本站特聘法律顾问:沈学律师
Powered by用VB如何把文本文件中的数字存入数值数组,请高手指点下。
[问题点数:40分]
用VB如何把文本文件中的数字存入数值数组,请高手指点下。
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。VB中如何提取一TXT文档中的数据,并将数据放在数组中。_百度知道
VB中如何提取一TXT文档中的数据,并将数据放在数组中。
并且保存为数组.com/zhidao/pic/item/b0ba61e281fd31de590a://a.com/zhidao/wh%3D450%2C600/sign=2ba82d4d7bf0f736d8abf/b0ba61e281fd31de590a.hiphotos.hiphotos.baidu.baidu.jpg" esrc="http.hiphotos://a。如何用VB提取数据,很多行./zhidao/wh%3D600%2C800/sign=02ce74ada70f4bfb8cc8/b0ba61e281fd31de590a://a,数据如下.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http:有劳各位给指点指点<a href="http,最后的数组还是11列,行数很多,数与数之间用tab键隔开 ,几万几十万具体的说是txt文件里有11列数
提问者采纳
Cnn,其中where not F2 is null and not F3 is null 为剔除你前两行;可以在提取时, Rtext.8 Library&#39。).ConnectionSet Rst = New ADODB,文件名为, adOpenStatic.MoveNext
NextEnd IfRst:&#92;查询SQL语句.Fields(&quot:&#92,可以在这里设置其他限定条件(无字段名时;&本例中d.ini.JCnn.Recordset‘ado的文本文件连接字符串;FMT=TabDelimited&quot.txt where not F2 is null and not F3 is null&),返回符合条件的数据&#39.txt]----数据文件名ColNameHeader=False----无字段名Format=TabDelimited-----使用tab为分隔符&#39;):Dim Cnn As ADODB;以下为vb代码。;Extended Properties=&&)
RHDR=No:C 0 Then
For i = 0 To Rst,内容为.ConnectionDim Rst As ADODB、F2.txt为数据文件&#39, adCmdTextIf Rst,ddd:SqlStr = &&quot, Rst.RecordCount &在文本文件同路径下新建文本文件:Schema, adLockOptimistic。.OLEDB;程序中引用Microsoft ActiveX Data Objects 2.Print R;f3&quot.Fields(&quot、F3.0:&#39;Data Source=d:[ddd.RecordCount - 1
’这里给你的数组赋值
DProvider=Microsoft.Open&#39.Open SqlStr,系统默认为F1;f2&为存放数据文本文件路径,在sql语句中 设置条件.4.Fields(“f1&quot.ConnectionString = &Rst.RecordsetDim SqlStr As StringDim i As IntegerSet Cnn = New ADODB;select *用ADO提取文本 数据的方法&#39.CloseCnn
提问者评价
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁文本文件里数据是六列(空格隔开),行数不确定,VB怎样读入此文本文件并赋值给数组,得到数组的第2、6列_百度知道
文本文件里数据是六列(空格隔开),行数不确定,VB怎样读入此文本文件并赋值给数组,得到数组的第2、6列
数据格式如下:X 11 Y 22 Z 33X 59 Y 70 Z 87……X 41 Y 35 Z 51
我有更好的答案
一个2维数组,根据空格拆分字符串,然后分别赋值。利用嵌套循环输出你要的
能帮忙写个代码吗?自己写的代码总是出错
我没有VB参照这个些拆分字符串数组的操作很基础,建议还是自己努力一下。
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁共有 5189 人关注过本帖
标题:VB如何读取TXT文件内两列数据到数组
等 级:新手上路
&&问题点数:0&&回复次数:3&&&
VB如何读取TXT文件内两列数据到数组
我在E:\test.txt文件内存放着两列数据,例如:
321&&&&&是你
265&&&&&得力喔喔
还行&&& 594好ihi
461&&&&&木木米
……&&& ……
【补充说明下,数据每行都是成双的,以空格做为一个数据的分界,空格数量不固定,每个数据的长度也不固定。这文件内容大于5000行,不过每行都是两个数据】
现在我想把第一列数据{321,265,还行,461,……}放到数组a(i),第二列数据放到数组b(i)。
请有心人帮忙,最好详细点,能加注说明,非常感谢。
[[it] 本帖最后由 h 于
22:22 编辑 [/it]]
搜索更多相关主题的帖子:
等 级:贵宾
威 望:42
帖 子:4881
专家分:671
你先弄清楚怎么读一行数据。
Dim s,Arr ' s是字符串,arr是字符串数组
While 文件未读完
&&&s=读入一行
&&&While Instr(s,&&&&)&0 ' 使s中只有一个空格
&&&&&s=Replace(s,&&&&,& &)
&&&Arr=Split(s,& &) ' Arr是一个2个元素的数组
&&&a(i)=Arr(0)
&&&b(i)=Arr(1)
等 级:贵宾
威 望:25
帖 子:478
专家分:52
Private Sub Command12_Click()
&&& Dim a() As String
&&& Dim b() As String
&&& Dim i As Integer
&&& txtTest.Text = &&
&&& Open &c:/TEST.TXT& For Input As #1
&&& On Error GoTo h
&&& Do While Not EOF(1)
&&&&&&&&ReDim Preserve a(i)
&&&&&&&&ReDim Preserve b(i)
&&&&&&&&Input #1, a(i), b(i)
&&&&&&&&i = i + 1
&&& Close #1
&&& For i = 1 To UBound(a)
&&&&&&&&txtTest.Text = txtTest.Text & a(i) & &,& & b(i) & vbCrLf
'文本内容格式:
IT618资讯网 提供服务端开发,前端开发,网页特效,热门开源系统研究,软件下载,站长建站,淘宝开店等学习资料.
等 级:新手上路
帖 子:22
强人。我收藏了。。。。。。。。。。。。。。
版权所有,并保留所有权利。
Powered by , Processed in 0.034814 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved}

我要回帖

更多关于 数组赋值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信