在VBA中逐行读取/解析文本文件

dan*_*ran 52 excel vba excel-vba

我正在尝试使用VBA解析文本文档并返回文本文件中给出的路径.
例如,文本文件看起来像:

*Blah blah instructions
*Blah blah instructions on line 2
G:\\Folder\...\data.xls
D:\\AnotherFolder\...\moredata.xls
Run Code Online (Sandbox Code Playgroud)

我希望VBA一次加载1行,如果它以a开头,*则移动到下一行(类似于被注释的那行).对于带有文件路径的行,我想将该路径写入单元格,例如A2第一条路径,B2下一条路径等.

我希望回答的主要内容是:
1.使用VBA读取文本文件的最佳/简单方法是什么?
2.我该如何逐行完成?

Sea*_*anC 66

对于最基本的文本文件读取,请使用 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
Run Code Online (Sandbox Code Playgroud)

  • 记得最后关闭#FileNum! (19认同)
  • 我参加派对有点晚了,但Line Input除了严格的CR或CRLF组合之外还有任何问题(比如LF本身) - FSO没有这样的问题(但是,可能有点慢) (8认同)
  • 对于其他任何想知道的人:`DataLine`排除终止`CR`或`CRLF`([来源](https://msdn.microsoft.com/en-us/library/aa243392%28v=vs.60%29.aspx )) (2认同)

Bra*_*rad 35

我发现带有TxtStream的FileSystemObject是读取文件的最简单方法

Dim fso As FileSystemObject: Set fso = New FileSystemObject
Set txtStream = fso.OpenTextFile(filePath, ForReading, False)
Run Code Online (Sandbox Code Playgroud)

然后使用此txtStream对象,您可以使用各种智能感知工具(与使用该FreeFile()方法不同),因此可以减少猜测.另外,你不必分配一个FreeFile,并希望它自从你分配它以来它实际上仍然是免费的.

您可以读取如下文件:

Do While Not txtStream.AtEndOfStream
    txtStream.ReadLine
Loop
txtStream.Close
Run Code Online (Sandbox Code Playgroud)

注意:这需要引用Microsoft Scripting Runtime.

  • 实际上,如果没有将`txtStream`标注为`TextStream`对象,就不会有智能感知 (5认同)

Ale*_* K. 31

为了完整; 使用加载到内存中的数据;

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
Run Code Online (Sandbox Code Playgroud)

  • ...但假设文件适合内存 (5认同)
  • 这是正确的答案.您可以在FileSystemObject中执行相同操作,但由于安全限制,FSO通常无法运行,并且速度明显变慢. (3认同)