2011-01-05 3 views
2

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

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

Большое спасибо заранее,

Millie

ответ

1

Это займет всего две вещи: массив с именами файлов книги в нем, например

dim books 
books = array("book1.xls","book2.xls",....) 

Тогда ваш код цикла выглядит что-то вроде

dim myBk as Workbook 
dim bkFile as string 
For Each bkFile in books 
    myBk = Workbooks.Open(bkFile, ReadOnly) 
    myBk.Activate 
    'Transfer cells from myBk to target workbook 
    target.cells(--).Value = myBk.Sheets("myStuff").Cells(--) 
    ... 
Next 

Я не могу помочь вам с деталями. Вам нужно будет изменить аргумент target.cells для каждого прохода через цикл для перемещения адресата данных.

3

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

Sub ImportWorkbooks(destination as workbook, importFolderPath As String) 

    Dim objFSO As Object 
    Dim objFolder As Object 
    Dim objFile As Object 

    Set objFSO = CreateObject("Scripting.FileSystemObject") 

    'Get the folder object associated with the directory 
    Set objFolder = objFSO.GetFolder(importFolderPath) 

    'Loop through the Files collection and import each workbook 
    For Each objFile In objFolder.Files 
     Dim source As Workbook 
     Set source = Application.Workbooks.Open(objFile.Path, ReadOnly:=True) 
     ImportWorkbook source, destination 
     wb.Close 
     Set wb = Nothing 
    Next 

    Set objFolder = Nothing 
    Set objFile = Nothing 
    Set objFSO = Nothing 

End Sub 

Sub ImportWorkbook(source As Workbook, destination as Workbook) 
    Dim sheet As Worksheet 

    'Import each worksheet 
    For Each sheet In source.Sheets 
     ImportWorksheet sheet, destination 
    Next sheet 
End Sub 

Sub ImportWorksheet(sheet As Worksheet, destination as Workbook) 

    'Perform your import logic for each sheet here (i.e. Copy from sheet and paste into a 
    'sheet into the provided workbook) 

End Sub 

Базовое использование было бы что-то вроде следующего для импорта в текущей книге:

ImportWorkbooks ThisWorkbook, "c:\path\to\folder\containing\workbooks\to\import" 
+0

Я, кажется, получаю «ByRef несоответствие типа аргумента» на «листе» аргумента в «ImportWorksheet» при компиляции. Любая идея о том, почему? Тем не менее, код выглядит очень чистым. Благодаря! – MattV

+2

Да, переменная листа, в частности, должна быть инициализирована как рабочий лист. Один из фантастических загадочных сообщений об ошибках, которые VBA вам даст :). Будет обновлен код, чтобы отразить это. – Shaun

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