2014-09-11 4 views
-1

В надежде, кто-то может мне помочь, я работаю над проектом для работы, и я ударил кирпичную стену. Я новичок в кодировании, и через различные испытания и исследования я составил код, который выполняет только часть того, что мне нужно.Копирование данных из определенных столбцов и нескольких строк из нескольких файлов excel в 1 с помощью vba/macro

Принцип прост: у меня есть несколько сотен листов excel, которые я хочу вытащить данные из определенных столбцов в новый лист с заголовками столбцов. Пока мой код тянет первую строку из каждого файла в каталоге, однако мне нужно это, чтобы прочитать все строки до тех пор, пока он не станет пустым, это может сильно различаться, поэтому я не могу использовать стандартный диапазон.

До сих пор это мой код:

Sub LoopThroughFiles() 
Dim MyFolder As String 
Dim FiletoList As String 
Dim NextRow As Long 

On Error Resume Next 

Application.ScreenUpdating = False 
Application.DisplayAlerts = False 


With Application.FileDialog(msoFileDialogFolderPicker) 
.Title = "Please select a folder" 
.Show 
.AllowMultiSelect = False 

If .SelectedItems.Count = 0 Then 
    MsgBox "You did not select a folder" 
    Exit Sub 
End If 
MyFolder = .SelectedItems(1) & "\" 
End With 


FiletoList = Dir(MyFolder & "Marking Sheet Ref*.xls") 
Range("A1").Value = "Sitting Number" 
Range("B1").Value = "Student Name" 
Range("C1").Value = "Member Number" 
Range("D1").Value = "1" 
Range("E1").Value = "2" 
Range("F1").Value = "3" 
Range("G1").Value = "4" 
Range("H1").Value = "5" 
Range("I1").Value = "6" 
Range("J1").Value = "7" 
Range("K1").Value = "8" 
Range("L1").Value = "9" 
Range("M1").Value = "10" 
Range("N1").Value = "11" 
Range("O1").Value = "12" 
Range("P1").Value = "13" 
Range("Q1").Value = "14" 
Range("R1").Value = "15" 
Range("S1").Value = "16" 
Range("T1").Value = "17" 
Range("U1").Value = "18" 
Range("V1").Value = "Total % Mark" 
Range("W1").Value = "Final Grade" 
Range("X1").Value = "Moderator % Mark" 
Range("Y1").Value = "Moderator Final Grade" 
Range("Z1").Value = "Unit Code" 
Range("AA1").Value = "Program Code" 
Range("AB").Value = "Marker Name" 
Range("AC1").Value = "Country" 

'Find the next empty row in the list 
NextRow = Application.CountA(Range("A:A")) + 1 
NextRow = NextRow + 1 ' skip a line 

'Do whilst the dir function returns an Excel workbook 
Do While FiletoList <> "" 
Cells(NextRow, 1).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C1" 
Cells(NextRow, 2).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C2" 
Cells(NextRow, 3).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C3" 
Cells(NextRow, 4).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C5" 
Cells(NextRow, 5).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C6" 
Cells(NextRow, 6).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C7" 
Cells(NextRow, 7).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C8" 
Cells(NextRow, 8).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C9" 
Cells(NextRow, 9).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C10" 
Cells(NextRow, 10).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C11" 
Cells(NextRow, 11).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C12" 
Cells(NextRow, 12).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C13" 
Cells(NextRow, 13).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C14" 
Cells(NextRow, 14).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C15" 
Cells(NextRow, 15).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C16" 
Cells(NextRow, 16).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C17" 
Cells(NextRow, 17).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C18" 
Cells(NextRow, 18).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C19" 
Cells(NextRow, 19).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C20" 
Cells(NextRow, 20).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C21" 
Cells(NextRow, 21).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C22" 
Cells(NextRow, 22).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C23" 
Cells(NextRow, 23).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C24" 
Cells(NextRow, 24).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C32" 
Cells(NextRow, 25).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C33" 
Cells(NextRow, 26).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C25" 
Cells(NextRow, 27).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C27" 
Cells(NextRow, 28).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C30" 
Cells(NextRow, 29).Formula = "='" & MyFolder & "[" & FiletoList & "]Marking Sheet'! R11C31" 
NextRow = NextRow + 1 'Move to next row 
FiletoList = Dir 'Dir returns the next Excel workbook in the folder 
Loop 

Application.ScreenUpdating = True 

End Sub 

Это возвращает первую строку (строка 11) каждый первенствовать лист, который я желаю, чтобы скопировать данные, однако может быть 1 строка, или 1000 строк. все эти данные должны быть захвачены, и я не могу понять, что я пропустил. Любая помощь будет принята с благодарностью. Он должен быть специфичным для начала из строки 11, а предоставленные столбцы также специфичны для требований.

ответ

0

Похоже, вам понадобится второй цикл INSIDE, который вы уже определили. Ваш код получает одну строку данных, а затем переходит к следующему файлу.

Внутренний цикл должен определять количество строк в диапазоне (как вы уже определили). Этот код является одним из способов сделать это (для диапазона в Листе, называемом «Данные»).

endRowNo = Sheets("Data").Cells(.Rows.Count, ColNo).End(xlUp).Row 

Вместо цикла по строкам вы можете найти ваш код может быть сокращен путем копирования всего спектра данных на одном дыхании, при условии, что он в порядке, вам требуется.

See this link

Вы могли бы также рассмотреть возможность использования цикла для заполнения ваших «числовых» заголовков для того, чтобы сократить свой код. Стоит изучить/использовать нотацию Cells, которая упрощает управление диапазонами внутри цикла.

Check out this link

Наконец, будьте осторожны при использовании ON ERROR RESUME СЛЕДУЮЩЕГО это может скрыть ошибки кодирования и сделать розолвинг более трудным. Возможно, вы узнаете немного больше об основной обработке ошибок.

This link may help

Надеется, что это помогает.