2017-01-25 3 views
0

Я новичок в VBA и должны написать код, который выполняет следующие действия:VBA: копировать строки из CSV в столбцы в новом листе

1- извлечения всех файлов CSV в папке

2- пут имена файлов в первой строке нового рабочего листа.

3- копировать все заголовки столбцов (первая строка) из CSV файлов

4- вставить их в одном столбце под каждым именем файла в новом рабочем листе.

Я знаю, что мне нужно использовать диапазон, но я смущен, как его использовать.

Это то, что я сделал для получения файлов csv. У меня есть проблемы с копированием строки в столбцы:

Dim CSVPath 
Dim FS 
Dim file 
Dim wkb As Excel.Workbook 
Dim ResultsSheet As Worksheet 
Dim RowPtr As Range 
Dim CSVUsed As Range 

Set ResultsSheet = Sheet1 

'Clear the results sheet 
ResultsSheet.Cells.Delete 

Set FS = CreateObject("Scripting.FileSystemObject") 

'The CSV files are stored in a "CSV" subfolder of the folder where 
'this workbook is stored. 
CSVPath = ThisWorkbook.Path & "\CSV" 

If Not FS.FolderExists(CSVPath) Then 
    MsgBox "CSV folder does not exist." 
    Exit Sub 
End If 

For Each file In FS.GetFolder(CSVPath).Files 
    If Right(file.Name, 3) = "csv" Then 'Only look at files with .csv extension 
     Set wkb = Application.Workbooks.Open(file.Path) 

Next 

, а также я знаю, что цикл должен быть что-то вроде этого:

FinalRow = Cells(Rows.Count, 1).End(xlUp).Row 

    For x = 2 To FinalRow 

любая помощь ценится

ответ

1

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

Dim wb1 As Workbook, wb2 As Workbook 
Dim colnum 
Dim arr1 
Dim range2 As Range 

colnum = 20 
Set wb2 = ThisWorkbook 

Set range2 = wb2.Worksheets("Sheet1").Range("A1") 'wherever I want to paste my data to 
For Each file In fs.getfolder(CSVPath).file 
     If Right(file.Name, 3) = "csv" Then 
      Set wb1 = Application.Workbooks.Open(file.Path) 
      arr1 = wb1.Worksheets("WHATEVER_ITS_NAME_IS").Range("A1").resize(1, colnum).Value 
      rowlen = UBound(arr1, 1) - LBound(arr1, 1) + 1 
      collen = UBound(arr1, 2) - LBound(arr1, 2) + 1 

      range2.Resize(rowlen, collen).Value = arr1 
     End If 
Next 

Существует множество способов кожи этой кошки. Не уверен, работает ли мой код, но, возможно, это поможет. Обычно мне не нравится проходить через каждую ячейку. В VBA эти типы циклов очень медленные. Лучше всего просто скопировать весь массив сразу. Используйте свойство Range.Value, чтобы установить/получить данные массива из объекта Range

+0

Спасибо за ваш ответ. У меня есть вопрос, хотя. около arr1 = wb1.Worksheets («WHATEVER_ITS_NAME_IS»). Диапазон («A1: Z1»). Значение Число моих столбцов больше (A1: Z1), есть ли способ, которым мы можем установить его конец последней ячейки? – Navid

+0

Да, конечно, попробуйте range.resize (rows, cols). MSDN - отличная ссылка для всех функций, объектов и методов Excel VBA. – johnzilla

Смежные вопросы