Импортировать несколько файлов .csv в одну электронную таблицу - PullRequest
0 голосов
/ 29 апреля 2020

Я работаю над простым макросом, чтобы взять все файлы csv из папки и скопировать данные в один лист. Все файлы csv отформатированы одинаково с заголовками и используемыми данными в столбцах a: f. Макрос будет открывать каждый файл по очереди, но ничего не копируется. Я также попытался обойти копирование / вставку и до сих пор ничего не получаю. Есть идеи ??

Option Explicit

Sub ImportData()

Dim lastrow As Long
Dim clastrow As Long
Dim filePath As String
Dim fileName As String
Dim count As Long
Dim importRange As Range
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Dim cws As Excel.Worksheet

count = 0

Set cws = ThisWorkbook.Sheets("Raw_Data")

filePath = "C:\Users\christopher.huiett\Desktop\csv_folder\"
fileName = Dir(filePath & "*.csv")

Do While fileName <> ""
    count = count + 1

    Set wb = Excel.Workbooks.Open(filePath & fileName)
    Set ws = wb.Worksheets(1)

    lastrow = ws.Cells(Rows.count, "a").End(xlUp).Row
    clastrow = cws.Cells(Rows.count, "a").End(xlUp).Row + 1

    Set importRange = ws.Range("a2" & lastrow)           'skips header row

'    cws.Cells(clastrow, 1).End(xlUp).Offset(1, 0).Resize(importRange.Rows.count, importRange.Columns.count) = importRange.Value

    importRange.Copy

    cws.Cells(clastrow, "a").PasteSpecial xlPasteValues

    wb.Application.CutCopyMode = False
    wb.Close

    fileName = Dir

Loop
End Sub

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Я думаю, что ваша проблема - линия Set importRange = ws.Range("a2" & lastrow). Учтите, что lastrow = 1000: вы должны установить importRange на A21000 - отдельную ячейку, которая наверняка будет пустой.

Хотя использование UsedRange часто не является предпочтительным методом, когда вы хотите чтобы выяснить, сколько строк / столбцов используется: при открытии книги она надежна. Вы хотите пропустить первый ряд, поэтому вы можете просто использовать UsedRange.Offset(1, 0). Это скопирует пустую строку в конце, но это не повредит.

clastrow = cws.Cells(ws.Rows.count, "a").End(xlUp).Row + 1
Set importRange = ws.UsedRange.Offset(1, 0)
0 голосов
/ 29 апреля 2020

Ваша ошибка появляется здесь:

Set importRange = ws.Range("a2" & lastrow)

Если lastrow = 25, то это означает:

Set importRange = ws.Range("a2" & 25)

, что: ws.Range("A225")

Таким образом, вам нужно изменить это для этого:

Set imporRange = ws.Range("A2:F" & lastrow)

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