Сбор данных из разных файлов в один - VBA

Узнай цену своей работы

Формулировка задачи:

Добрый день. Стоит задача собирать данные из нескольких файлов с одинаковой структурой в один, имеющий аналогичную структуру. Имена файлов имеют одинаковое правило - 2016_07_ОП_*наименование*, то есть год, месяц, ОП-название формы, далее идет наименование отдела. Собирать данные нужно с конкретного листа и вставлять в файл на лист, с таким же наименованием (именовать лист нужно автоматически). Так же в сборочный файл нужно добавить две колонки - Год и Месяц. Брать данные для их заполнения нужно из имен файлов, то есть в данном случае всем скопированным строкам нужно поставить год - 2016 и месяц - 07. Есть вот такой макрос, найденный на этом форуме (Извините за неудобства. Вставляю со всеми отступами, но они почему-то пропадают):
Листинг программы
  1. Sub Собрать_данные_из_xlsx_файлов()
  2. ' Макрос создает книгу и последовательно вставляет на одноименные листы
  3. ' данные из всех xls файлов заданной директории начиная со строки FRow.
  4. Const FRow& = 2 ' Номер строки начала сбора данных (ниже шапки)
  5. Const Sborka$ = "Сборка.xlsx" ' Имя сборочного файла
  6. Dim FCol&, LCol& ' Переменные номеров первого и последнего столбца для сбора данных
  7. Dim LRow&, LRow_Cel&
  8. Dim wb_Cel As Workbook, wb_Tek As Workbook
  9. Dim Sh_Cel As Worksheet, Sh_Tek As Worksheet
  10. Dim MyPath$, MyFileName$, MyFulName$
  11. Dim Uslovie1 As Boolean
  12. ' Выбор папки
  13. With Application.FileDialog(msoFileDialogFolderPicker)
  14. .Title = "Укажите рабочую папку": .Show
  15. If .SelectedItems.Count = 0 Then Exit Sub
  16. MyPath = .SelectedItems(1) & ""
  17. End With
  18. 'MyPath = "C:\inbox\???? ???????\????"
  19. ' MyPath = CurDir & ""
  20. MyFileName = Dir(MyPath & "*.xls*")
  21. Uslovie1 = False
  22. Do Until MyFileName = ""
  23. If MyFileName <> Sborka Then
  24. MyFulName = MyPath & MyFileName
  25. Workbooks.Open Filename:=MyFulName, UpdateLinks:=0
  26. If Not Uslovie1 Then
  27. Set wb_Cel = ActiveWorkbook
  28. ActiveWorkbook.SaveAs Filename:=MyPath & Sborka, FileFormat:=51, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False
  29. Uslovie1 = True
  30. Else
  31. Set wb_Tek = ActiveWorkbook
  32. For Each Sh_Cel In wb_Cel.Sheets
  33. With Sh_Cel
  34. FCol = .UsedRange.Cells(1, 1).Column
  35. LCol = .UsedRange.Columns.Count + FCol - 1
  36. LRow_Cel = .Cells(.Rows.Count, FCol).End(xlUp).Row + 1
  37. End With
  38. For Each Sh_Tek In wb_Tek.Sheets
  39. If Sh_Tek.Name = Sh_Cel.Name Then
  40. With Sh_Tek
  41. LRow = .Cells(.Rows.Count, FCol).End(xlUp).Row
  42. If LRow >= FRow Then
  43. .Range(.Cells(FRow, FCol), .Cells(LRow, LCol)).Copy Sh_Cel.Cells(LRow_Cel, 1)
  44. End If
  45. End With
  46. End If
  47. Next Sh_Tek
  48. Next Sh_Cel
  49. Workbooks(MyFileName).Close SaveChanges:=False
  50. End If
  51. End If
  52. MyFileName = Dir
  53. Loop
  54. End Sub
Но этот макрос копирует все листы. Помогите, пожалуйста, его поправить под необходимый мне функционал. Спасибо.

Решение задачи: «Сбор данных из разных файлов в один»

textual
Листинг программы
  1. Sub Собрать_данные_Бюджетов()
  2.     ' Макрос собирает в новой книге данные из заданного листа  xls файлов с нужным шаблоном имени выбранной папки.
  3.    Const ImyaListaSbora = "Бюджет расходов и платежей"
  4.     Const FirstRow_Cel& = 2          ' Номер строки начала построения
  5.    Const FirstRow& = 2              ' Номер строки начала сбора данных (ниже шапки)
  6.    Dim i&, j&, k&, LastRow&, Gog, Mes, Metka$, A
  7.     Dim ShCel As Worksheet, Sh As Worksheet, wb_Tek As Workbook
  8.     Dim MyPath$, MyFileName$, MyFullName$
  9.     k = FirstRow_Cel - 1
  10.     With Application.FileDialog(msoFileDialogFolderPicker)
  11.         .Title = "Укажите рабочую папку": .Show
  12.         If .SelectedItems.Count = 0 Then Exit Sub
  13.         MyPath = .SelectedItems(1) & ""
  14.     End With
  15.     If Right$(MyPath, 1) <> "" Then MyPath = MyPath & ""
  16.     Set ShCel = ActiveWorkbook.Worksheets(ImyaListaSbora)
  17.     i = InStr(1, ActiveWorkbook.Name, ".xls", vbTextCompare)
  18.     If i > 0 Then Metka = Mid(ActiveWorkbook.Name, 9, i - 9)
  19.     'ShCel.Name = ImyaListaSbora
  20.    ShCel.UsedRange.Offset(FirstRow_Cel - 1, 0).Clear
  21.     MyFileName = Dir(MyPath & "????_??_*_*.xls*")
  22.     Do Until MyFileName = ""
  23.         Gog = Left(MyFileName, 4)
  24.         Mes = Mid(MyFileName, 6, 2)
  25.         MyFullName = MyPath & MyFileName
  26.         Set wb_Tek = Workbooks.Open(FileName:=MyFullName, UpdateLinks:=0, ReadOnly:=True)
  27.         With wb_Tek.Worksheets(ImyaListaSbora)
  28.             .AutoFilterMode = False
  29.             LastRow = .Cells(.Rows.Count, 3).End(xlUp).Row
  30.             A = Range(.Cells(FirstRow, 1), .Cells(LastRow, 11)).FormulaR1C1
  31.             For i = 1 To UBound(A)
  32.                 If A(i, 1) = Metka Then
  33.                     k = k + 1
  34.                     With ShCel
  35.                         For j = 1 To 11
  36.                             .Cells(k, j).FormulaR1C1 = A(i, j)
  37.                         Next
  38.                         .Cells(k, 12) = Gog
  39.                         .Cells(k, 13) = Mes
  40.                     End With
  41.                 End If
  42.             Next i
  43.         End With
  44.         wb_Tek.Close SaveChanges:=False
  45.         MyFileName = Dir
  46.     Loop
  47.     With ShCel
  48.         .[L1] = "Год"
  49.         .[m1] = "Месяц"
  50.         .Range("A1:M" & k).Borders.LineStyle = xlContinuous
  51.         .Cells(k, 1).Select
  52.     End With
  53. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы