一次将100个文本文件导入Excel

时间:2013-10-16 18:00:45

标签: excel excel-vba vba

我有这个宏来批量导入同一文件夹中包含的excel电子表格100+ .txt文件:

Sub QueryImportText()
    Dim sPath As String, sName As String
    Dim i As Long, qt As QueryTable
    With ThisWorkbook
        .Worksheets.Add After:= _
            .Worksheets(.Worksheets.Count)
    End With
    ActiveSheet.Name = Format(Now, "yyyymmdd_hhmmss")
    sPath = "C:\Users\TxtFiles\"
    sName = Dir(sPath & "*.txt")
    i = 0
    Do While sName <> ""
        i = i + 1
        Cells(1, i).Value = sName
        With ActiveSheet.QueryTables.Add(Connection:= _
            "TEXT;" & sPath & sName, Destination:=Cells(2, i))
            .Name = Left(sName, Len(sName) - 4)
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 437
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
        sName = Dir()
        For Each qt In ActiveSheet.QueryTables
            qt.Delete
        Next
    Loop
End Sub

每个.txt文件都具有相同的结构: 标题,ID,日期,createdBy,text。

宏正在运行,但是:

  • 我希望每个文件都在一行(这个宏在列中显示)

这个excel将导出为.csv导入我的joomla网站与MySql

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:9)

我建议使用Arrays来执行整个操作,而不是使用Excel来完成脏工作。以下代码使用1 sec来处理300个文件

<强> LOGIC:

  1. 遍历包含文本文件的目录
  2. 打开文件并将其一次性读入数组,然后关闭文件。
  3. 将结果存储在临时数组中
  4. 读取所有数据后,只需将数组输出到Excel Sheet
  5. 即可

    代码:(经过测试和测试)

    '~~> Change path here
    Const sPath As String = "C:\Users\Siddharth Rout\Desktop\DeleteMelater\"
    
    Sub Sample()
        Dim wb As Workbook
        Dim ws As Worksheet
    
        Dim MyData As String, tmpData() As String, strData() As String
        Dim strFileName As String
    
        '~~> Your requirement is of 267 files of 1 line each but I created 
        '~~> an array big enough to to handle 1000 files
        Dim ResultArray(1000, 3) As String
    
        Dim i As Long, n As Long
    
        Debug.Print "Process Started At : " & Now
    
        n = 1
    
        Set wb = ThisWorkbook
    
        '~~> Change this to the relevant sheet
        Set ws = wb.Sheets("Sheet1")
    
        strFileName = Dir(sPath & "\*.txt")
    
        '~~> Loop through folder to get the text files
        Do While Len(strFileName) > 0
    
            '~~> open the file in one go and read it into an array
            Open sPath & "\" & strFileName For Binary As #1
            MyData = Space$(LOF(1))
            Get #1, , MyData
            Close #1
            strData() = Split(MyData, vbCrLf)
    
            '~~> Collect the info in result array
            For i = LBound(strData) To UBound(strData)
                If Len(Trim(strData(i))) <> 0 Then
                    tmpData = Split(strData(i), ",")
    
                    ResultArray(n, 0) = Replace(tmpData(0), Chr(34), "")
                    ResultArray(n, 1) = Replace(tmpData(1), Chr(34), "")
                    ResultArray(n, 2) = Replace(tmpData(2), Chr(34), "")
                    ResultArray(n, 3) = Replace(tmpData(3), Chr(34), "")
    
                    n = n + 1
                End If
            Next i
    
            '~~> Get next file
            strFileName = Dir
        Loop
    
        '~~> Write the array to the Excel Sheet
        ws.Range("A1").Resize(UBound(ResultArray), _
        UBound(Application.Transpose(ResultArray))) = ResultArray
    
        Debug.Print "Process ended At : " & Now
    End Sub
    

答案 1 :(得分:0)

非常感谢您提供此信息。我只想导入我的数据文件的第4列,因为我必须按如下方式进行位修改

 Sub QueryImportText()
    Dim sPath As String, sName As String
    Dim i As Long, qt As QueryTable
    With ThisWorkbook
        .Worksheets.Add After:= _
            .Worksheets(.Worksheets.Count)
    End With
    ActiveSheet.Name = Format(Now, "yyyymmdd_hhmmss")
    sPath = "C:\Users\TxtFiles\"
    sName = Dir(sPath & "*.txt")
    i = 0
    Do While sName <> ""
        i = i + 1
        Cells(1, i).Value = sName
        With ActiveSheet.QueryTables.Add(Connection:= _
            "TEXT;" & sPath & sName, Destination:=Cells(2, i))
            .Name = Left(sName, Len(sName) - 4)
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False,
            .TextFilePlatform = 437
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(9,9,9,1) <---------(here)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
        sName = Dir()
        For Each qt In ActiveSheet.QueryTables
            qt.Delete
        Next
    Loop
End Sub