Я работаю над простым макросом, чтобы взять все файлы 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
0
Chris H. 29 Апр 2020 в 10:46

2 ответа

Лучший ответ

Ваша ошибка приходит сюда:

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

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

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

Что: ws.Range("A225")

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

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

0
Damian 29 Апр 2020 в 08:12

Я думаю, что ваша проблема в строке 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)
1
FunThomas 29 Апр 2020 в 08:11