仅遍历目录中存在的文本文件,以使用vba导入数据

仅遍历目录中存在的文本文件,以使用vba导入数据,vba,excel,Vba,Excel,我有一个下面的代码,它从dir中存在的所有文件中导入数据。我只想将数据输入限制为.txt文件。i、 e.仅从文本文件导入。任何帮助 Sub ReadFilesIntoActiveSheet() Dim fso As FileSystemObject Dim folder As folder Dim file As file Dim FileText As TextStream Dim TextLine As String Dim Item

我有一个下面的代码,它从dir中存在的所有文件中导入数据。我只想将数据输入限制为.txt文件。i、 e.仅从文本文件导入。任何帮助

    Sub ReadFilesIntoActiveSheet() 
    Dim fso As FileSystemObject
    Dim folder As folder
    Dim file As file
    Dim FileText As TextStream
    Dim TextLine As String
    Dim Items() As String
    Dim i As Long
    Dim cl As Range
    ' Get a FileSystem object
    Set fso = New FileSystemObject
    ' get the directory you want
    Set folder = fso.GetFolder("D:\workdir\NX12IP25_RenewDaimler\textfiles\t")
    Set cl = ActiveSheet.Cells(1, 1)
    For Each file In folder.Files
        Set FileText = file.OpenAsTextStream(ForReading)
        Do While Not FileText.AtEndOfStream
            TextLine = FileText.ReadLine
            Items = Split(TextLine, "|")
    cl.Value = folder & "\" & file.Name 
    For i = 0 To UBound(Items)
        cl.Offset(0, i + 1).Value = Items(i)
    Next
            Set cl = cl.Offset(1, 0)
        Loop
        FileText.Close
    Next file
    Set FileText = Nothing
    Set file = Nothing
    Set folder = Nothing
    Set fso = Nothing
End Sub

您应该使用
If
语句检查最后4个字符是否为
.txt
。您可以通过两种方式完成:

1)
如果正确(file.Name,4)=“.txt”,则…

2) 使用正则表达式:
如果file.Name像“*.txt”,那么…

我更喜欢第一种解决方案,它更有效


检查此条件应该是您在循环中执行的第一个操作,因此您将忽略与我们的模式不匹配的文件(在本例中,这些文件不是文本文件)。

您应该使用
If
语句检查最后4个字符是否为
.txt
。您可以通过两种方式完成:

1)
如果正确(file.Name,4)=“.txt”,则…

2) 使用正则表达式:
如果file.Name像“*.txt”,那么…

我更喜欢第一种解决方案,它更有效


检查此条件应该是您在循环中执行的第一个操作,因此您将忽略与我们的模式不匹配的文件(在本例中,这些文件不是文本文件)。

您的主循环应该如下所示:

For Each file In folder.Files
    If Right(LCase(file.Name), 4) = ".txt" Then
        Set FileText = file.OpenAsTextStream(ForReading)
        Do While Not FileText.AtEndOfStream
            TextLine = FileText.ReadLine
            Items = Split(TextLine, "|")
            cl.Value = folder & "\" & file.Name
            For i = 0 To UBound(Items)
                cl.Offset(0, i + 1).Value = Items(i)
            Next
            Set cl = cl.Offset(1, 0)
        Loop
        FileText.Close
    End If
Next file

这将拾取以
.txt、.txt、txt等结尾的文件。

您的主循环应如下所示:

For Each file In folder.Files
    If Right(LCase(file.Name), 4) = ".txt" Then
        Set FileText = file.OpenAsTextStream(ForReading)
        Do While Not FileText.AtEndOfStream
            TextLine = FileText.ReadLine
            Items = Split(TextLine, "|")
            cl.Value = folder & "\" & file.Name
            For i = 0 To UBound(Items)
                cl.Offset(0, i + 1).Value = Items(i)
            Next
            Set cl = cl.Offset(1, 0)
        Loop
        FileText.Close
    End If
Next file

这将拾取以
.txt、.txt、txt等结尾的文件。

您可以通过直接检查文件名来执行此操作:

if LCase(Right(file.Name, 4) = ".txt") then
...
或者让fileSystemObject为您创建作业

if LCase(fso.getextensionname(File.Path)) = "txt" then
...

您可以通过直接检查文件名来执行此操作:

if LCase(Right(file.Name, 4) = ".txt") then
...
或者让fileSystemObject为您创建作业

if LCase(fso.getextensionname(File.Path)) = "txt" then
...

如果仅限于文本文件,可以使用DIR函数指定文件过滤器。第一次调用Dir将查找与搜索模式匹配的第一个文件。一次又一次地调用它将返回具有相同模式的下一个文件,因此可以循环,直到它返回空字符串为止

Dim file As String
file = Dir("D:\workdir\NX12IP25_RenewDaimler\textfiles\*.txt")
Do Until file = ""   ' Start the loop.
    Set FileText = file.OpenAsTextStream(ForReading)
    Do While Not FileText.AtEndOfStream
        TextLine = FileText.ReadLine
        Items = Split(TextLine, "|")
        cl.Value = folder & "\" & file.Name 
        For i = 0 To UBound(Items)
            cl.Offset(0, i + 1).Value = Items(i)
        Next
        Set cl = cl.Offset(1, 0)
    Loop
    FileText.Close
    file = Dir()   ' Getting next entry.
Loop

如果仅限于文本文件,可以使用DIR函数指定文件过滤器。第一次调用Dir将查找与搜索模式匹配的第一个文件。一次又一次地调用它将返回具有相同模式的下一个文件,因此可以循环,直到它返回空字符串为止

Dim file As String
file = Dir("D:\workdir\NX12IP25_RenewDaimler\textfiles\*.txt")
Do Until file = ""   ' Start the loop.
    Set FileText = file.OpenAsTextStream(ForReading)
    Do While Not FileText.AtEndOfStream
        TextLine = FileText.ReadLine
        Items = Split(TextLine, "|")
        cl.Value = folder & "\" & file.Name 
        For i = 0 To UBound(Items)
            cl.Offset(0, i + 1).Value = Items(i)
        Next
        Set cl = cl.Offset(1, 0)
    Loop
    FileText.Close
    file = Dir()   ' Getting next entry.
Loop

如果不想排除.TXT文件,请使用
如果正确(LCase(file.Name),4)=“.TXT”,然后…
确定。我想从不同的文件夹导入,但导入时会覆盖上一个数据,如何开始从下一个空行导入数据?您必须确定最后使用的行,这可以使用以下代码完成:
单元格(Rows.Count,column)。End(xlUp)。row
,其中,
column
是要确定最后使用行的列的编号。请告诉我应该将其放在哪里,我尝试了,但出现了错误。我将列替换为1。我猜这里:
cl.Offset(0,I+1)。Value=Items(I)
,因此它变成:
cl.Offset(0,lastRow+I+1)。Value=Items(I)
,其中
lastRow=Cells(Rows.Count,1)。End(xlUp)。Row
。但这只是猜测。您应该最清楚。如果不想排除.TXT文件,请使用
如果正确(LCase(file.Name),4)=“.TXT”,然后…
确定。我想从不同的文件夹导入,但导入时会覆盖上一个数据,如何开始从下一个空行导入数据?您必须确定最后使用的行,这可以使用以下代码完成:
单元格(Rows.Count,column)。End(xlUp)。row
,其中,
column
是要确定最后使用行的列的编号。请告诉我应该将其放在哪里,我尝试了,但出现了错误。我将列替换为1。我猜这里:
cl.Offset(0,I+1)。Value=Items(I)
,因此它变成:
cl.Offset(0,lastRow+I+1)。Value=Items(I)
,其中
lastRow=Cells(Rows.Count,1)。End(xlUp)。Row
。但这只是猜测。你应该知道得最清楚,那不行。如果
文件
是字符串,则不能使用
文件.OpenAsTextStream
。这将不起作用。如果
文件
是字符串,则不能使用
文件.OpenAsTextStream