VBA EXCEL: Собрать кучу файлов в один
Формулировка задачи:
В папке находится куча xls файлов. У всех у них одинаковая структура. Но она может меняться периодически. Необходимо все файлы собрать в один.
Первый файл из которого будут браться данные копируется полностью, включая заголовки. А у последующих файлов данные беруться без заголовков
Решение задачи: «VBA EXCEL: Собрать кучу файлов в один»
textual
Листинг программы
- Sub Собрать_данные_из_xls_файлов()
- ' Макрос создает книгу и последовательно вставляет на одноименные листы
- ' данные из всех xls файлов заданной директории начиная со строки FRow.
- Const FRow& = 2 ' Номер строки начала сбора данных (ниже шапки)
- Const Sborka$ = "Сборка.xls" ' Имя сборочного файла
- Dim FCol&, LCol& ' Переменные номеров первого и последнего столбца для сбора данных
- Dim LRow&, LRow_Cel&
- Dim wb_Cel As Workbook, wb_Tek As Workbook
- Dim Sh_Cel As Worksheet, Sh_Tek As Worksheet
- Dim MyPath$, MyFileName$, MyFulName$
- Dim Uslovie1 As Boolean
- ' Выбор папки
- With Application.FileDialog(msoFileDialogFolderPicker)
- .Title = "Укажите рабочую папку": .Show
- If .SelectedItems.Count = 0 Then Exit Sub
- MyPath = .SelectedItems(1) & "\"
- End With
- 'MyPath = "C:\inbox\Тест Макроса\Тест\"
- ' MyPath = CurDir & "\"
- MyFileName = Dir(MyPath & "*.xls*")
- Uslovie1 = False
- Do Until MyFileName = ""
- If MyFileName <> Sborka Then
- MyFulName = MyPath & MyFileName
- Workbooks.Open Filename:=MyFulName, UpdateLinks:=0
- If Not Uslovie1 Then
- Set wb_Cel = ActiveWorkbook
- ActiveWorkbook.SaveAs Filename:=MyPath & Sborka, FileFormat:=xlExcel8, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False
- Uslovie1 = True
- Else
- Set wb_Tek = ActiveWorkbook
- For Each Sh_Cel In wb_Cel.Sheets
- With Sh_Cel
- FCol = .UsedRange.Cells(1, 1).Column
- LCol = .UsedRange.Columns.Count + FCol - 1
- LRow_Cel = .Cells(.Rows.Count, FCol).End(xlUp).Row + 1
- End With
- For Each Sh_Tek In wb_Tek.Sheets
- If Sh_Tek.Name = Sh_Cel.Name Then
- With Sh_Tek
- LRow = .Cells(.Rows.Count, FCol).End(xlUp).Row
- If LRow >= FRow Then
- .Range(.Cells(FRow, FCol), .Cells(LRow, LCol)).Copy Sh_Cel.Cells(LRow_Cel, 1)
- End If
- End With
- With Sh_Cel
- Range(.Cells(LRow_Cel , 2+LCol-FCol), .Cells(LRow_Cel+LRow-FRow, 2+LCol-FCol))= MyFulName
- End With
- End If
- Next Sh_Tek
- Next Sh_Cel
- Workbooks(MyFileName).Close SaveChanges:=False
- End If
- End If
- MyFileName = Dir
- Loop
- End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д