2012-07-17 149 views
33

我试图使用VBA解析文本文档并返回文本文件中给出的路径。
例如,文本文件看起来像:在VBA中逐行读取/解析文本文件

*Blah blah instructions 
*Blah blah instructions on line 2 
G:\\Folder\...\data.xls 
D:\\AnotherFolder\...\moredata.xls 

我想VBA以每次加载1行,如果它与一个*开始,然后移动到下一行(类似于线是注释)。对于文件路径的线条,我想写这条道路细胞,说A2第一个路径,B2下一个,等

我希望能回答的主要事情是:
1。使用VBA读取文本文件的最佳/简单方法是什么?
2.我该如何一行一行地做?

回答

51

一个文本文件的最基本的读取,使用open

例如:

Dim FileNum As Integer 
Dim DataLine As String 

FileNum = FreeFile() 
Open "Filename" For Input As #FileNum 

While Not EOF(FileNum) 
    Line Input #FileNum, DataLine ' read in data 1 line at a time 
    ' decide what to do with dataline, 
    ' depending on what processing you need to do for each case 
Wend 
+7

我是对派对来说晚了点,但是线路输入存在问题,除了严格意义上的CR或CRLF组合(即LF本身)之外 - FSO没有这样的问题(但是,可能会慢一点) – 2013-08-20 21:28:09

+10

记住关闭#FileNum最后! – 2014-05-26 11:15:03

+1

对于其他人想知道的:'DataLine'不包括终止'CR'或'CRLF'([source](https://msdn.microsoft.com/en-us/library/aa243392%28v=vs.60%29)。 aspx)) – Felipe 2015-05-11 15:35:58

26

我找到一个TxtStream FileSystemObject对象读取文件

Dim fso As FileSystemObject: Set fso = New FileSystemObject 
Set txtStream = fso.OpenTextFile(filePath, ForReading, False) 

那么最简单的方法与这txtStream对象,你有各种工具intellisense拿起(不像使用FreeFile()方法),所以有更少的gue sswork。另外你不必分配一个FreeFile,并希望它自从你分配它的时候实际上仍然是免费的。

你可以读到这样一个文件:

Do While Not txtStream.AtEndOfStream 
    txtStream.ReadLine 
Loop 
txtStream.Close 

注意:这需要Microsoft脚本运行时的参考。

+0

感谢Brad的回复。我认为这也会完成我想要的东西 – dancran 2012-07-17 21:29:03

+3

实际上,如果没有将'txtStream'标注为'TextStream'对象,就不会有智能感知 – ElRudi 2016-04-22 09:11:44

23

为了完整;处理加载到内存中的数据;

dim hf As integer: hf = freefile 
dim lines() as string, i as long 

open "c:\bla\bla.bla" for input as #hf 
    lines = Split(input$(LOF(hf), #hf), vbnewline) 
close #hf 

for i = 0 to ubound(lines) 
    debug.? "Line"; i; "="; lines(i) 
next 
+1

这是正确的答案。您可以在FileSystemObject中执行相同的操作,但由于安全限制,FSO通常无法运行,并且速度明显较慢。 – 2012-07-18 17:00:36

+2

...但假定文件将适合内存 – 2013-05-31 07:36:09

4

您可以使用此代码来读取文本文件一行行,你也可以检查有关的第一个字符是“*”,那么你可以离开的..

Public Sub Test() 

    Dim ReadData as String 

    Open "C:\satheesh\myfile\file.txt" For Input As #1 

    Do Until EOF(1) 
     Line Input #1, ReadData 'Adding Line to read the whole line, not only first 128 positions 
    If Not Left(ReadData, 1) = "*" then 
     '' you can write the variable ReadData into the database or file 
    End If 

    Loop 

    Close #1 

End Sub