简体   繁体   中英

import multiple csv to excel vba

I want to Import multiples csv file to excel sheet but when the second csv file open the data of the first csv lost .

Here is my code:

Sub Test_ImportAllFiles()

    Dim vaArray     As Variant
    Dim i           As Integer
    Dim oFile       As Object
    Dim oFSO        As Object
    Dim oFolder     As Object
    Dim oFiles      As Object

    sPath = Application.ThisWorkbook.Path & "\cdr"
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oFolder = oFSO.GetFolder(sPath)
    Set oFiles = oFolder.Files

    If oFiles.Count = 0 Then Exit Sub

    ReDim vaArray(1 To oFiles.Count)
    i = 1
    For Each oFile In oFiles

        vaArray(i) = Application.ThisWorkbook.Path & "\cdr\" & oFile.Name
        row_number = CStr(Cells(Rows.Count, 1).End(xlUp).Row)

        With Sheets("Sheet2").QueryTables.Add("TEXT;" + vaArray(i), Destination:=Sheets("Sheet2").Range("$A$" + row_number))
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = False
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 437
            .TextFileStartRow = 3
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = False
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = True
            .TextFileSpaceDelimiter = False
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With

        Dim wb_connection As WorkbookConnection

        For Each wb_connection In ActiveWorkbook.Connections
            If InStr(vaArray(i), wb_connection.Name) > 0 Then
                wb_connection.Delete
                MsgBox "Antonis" & i
            End If
        Next wb_connection
        i = i + 1
    Next
End Sub

When you count the number of rows, you are referring to the active sheet, and that's possibly not the sheet where you want to write the data to.

Try something like

Dim x as long
With Sheets("Sheet2")
    row_number = .Cells(.Rows.Count, 1).End(xlUp).Row)
    if row_number > 1 then row_number = row_number + 1
end With
With Sheets("Sheet2").QueryTables.Add("TEXT;" + vaArray(i), _
                                 Destination:=Sheets("Sheet2").Range("$A$" & row_number))

Update : Add one to row_number, else the ranges will overlap, and as a QueryTable may not overlap, Excel moves them.

And yes, you can use a number for the rowcount variable, you just have to change the string concatenation from + to & . The operator + works for concatenation only if both sides are strings, while & does an implicit conversion to string for all data types.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM