импортировать несколько CSV в Excel VBA - PullRequest
0 голосов
/ 04 марта 2019

Я хочу импортировать несколько CSV-файлов в таблицу Excel, но при открытии второго CSV-файла данные первого CSV-файла теряются.

Вот мой код:

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

1 Ответ

0 голосов
/ 04 марта 2019

Когда вы подсчитываете количество строк, вы ссылаетесь на активный лист, и, возможно, это не тот лист, на который вы хотите записать данные.

Попробуйте что-то вроде

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))

Обновление : добавьте единицу к row_number, иначе диапазоны будут перекрываться, и, поскольку QueryTable может не перекрываться, Excel перемещает их.

И да, вы можете использовать число для переменной rowcount, вам просто нужно изменить конкатенацию строк с + на &.Оператор + работает для объединения только в том случае, если обе стороны являются строками, а & выполняет неявное преобразование в строку для всех типов данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...