Страницы: 1
RSS
[ Закрыто ] Макросом собрать в умную таблицу определенные строки из других идентичных таблиц разных файлов
 
Друзья, помогите :) имеются несколько файлов с таблицами...в моем случае 4, но может быть и больше...как из 4-х (желательно не ограничивать макрос количеством) собрать таблицу как в 5-ом файле. Знаю, что тем, кто соображает это не составит особого труда...жаль я не соображаю.  
 
Доброе время суток.
А почему не хотите воспользоваться Сборка таблиц из разных файлов Excel
 
на работе установлен Office 2007, не получится воспользоваться Power Query.
 
Похожая тема
 
vaspup88, нажмите на кнопку в приложенном файле, выделите мышкой нужные файлы (предварительно поместите их в одну папку)
Если что не так, то допилите напильником (доработайте код сами)
Изменено: Михаил О. - 19.08.2020 16:05:17
Я не Михаил...
 
великолепно! вы просто очень выручили меня! а как в макросе сделать эту таблицу сразу динамической?
 
Добавить вот эту строку в конце кода

Код
.ListObjects.Add(xlSrcRange, Range("A1").CurrentRegion, , xlYes).Name = "Таблица1"

чтобы было вот так

Код
Sub CombineWorkbooks()
    Dim FilesToOpen, wbReport As Workbook, wbImportFrom As Workbook, Sht As Worksheet, LastRow As Long, rngData As Range, iFile As Long
    Dim iRow As Long, blCopyHeader As Boolean, counter As Long
    
    'вызываем диалог выбора файлов откуда будем брать данные
    FilesToOpen = Application.GetOpenFilename(FileFilter:="All files (*.*), *.*", MultiSelect:=True, Title:="Укажите файлы")
 
    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "Не выбрано ни одного файла!", vbExclamation, "Внимание"
        Exit Sub
    End If
     
    Set wbReport = Workbooks.Add(template:=xlWorksheet)
    counter = 1
     
    Application.ScreenUpdating = False
    'проходим по всем выбранным файлам
    For iFile = 1 To UBound(FilesToOpen)
        Set wbImportFrom = Workbooks.Open(Filename:=FilesToOpen(iFile), ReadOnly:=True)
        With wbImportFrom.Worksheets("Sheet1")
            If .FilterMode = True Then .ShowAllData
            .Range("A1").ClearOutline
            'копируем шапку таблицы
            If blCopyHeader = False Then
                blCopyHeader = True
                .Range("A1:L1").Copy wbReport.Worksheets(1).Range("A1")
            End If
            LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
            If LastRow > 1 Then
                For iRow = 2 To LastRow
                    If Not IsEmpty(.Cells(iRow, "B")) Then
                        Set rngData = .Range(.Cells(iRow, "A"), .Cells(iRow, "L"))
                        counter = counter + 1
                        rngData.Copy Destination:=wbReport.Worksheets(1).Cells(counter, 1)
                    End If
                Next iRow
            End If
        End With
        wbImportFrom.Close savechanges:=False
    Next iFile
    
    With wbReport.Worksheets(1)
        .Range("A1").CurrentRegion.Borders.LineStyle = xlContinuous
        .Columns("A:L").AutoFit
        .Rows(1).AutoFit
        .ListObjects.Add(xlSrcRange, Range("A1").CurrentRegion, , xlYes).Name = "Таблица1"
    End With
    Application.ScreenUpdating = True
    MsgBox "Сборка данных завершена!", vbInformation, "Конец"
End Sub
Изменено: Михаил О. - 19.08.2020 16:17:45
Я не Михаил...
 
Я так понимаю, Павел :) Вы просто мега!vbaшник! Огромнейшее спасибо! Есть еще одно пожелание, но это уже будет нескромно, мне так кажется :) ну а вдруг :) строку итогов с суммой по полю "Стоимость/ВалКонтрЕд" и сортировка по возрастанию по полю "Обознач. корреспондирующего счета". Если не сделаете, не обижусь.
Изменено: vaspup88 - 19.08.2020 18:28:33
 
вот

Код
Sub CombineWorkbooks()
    Dim FilesToOpen, wbReport As Workbook, wbImportFrom As Workbook, Sht As Worksheet, LastRow As Long, rngData As Range, iFile As Long
    Dim iRow As Long, blCopyHeader As Boolean, counter As Long
     
    'вызываем диалог выбора файлов откуда будем брать данные
    FilesToOpen = Application.GetOpenFilename(FileFilter:="All files (*.*), *.*", MultiSelect:=True, Title:="Укажите файлы")
  
    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "Не выбрано ни одного файла!", vbExclamation, "Внимание"
        Exit Sub
    End If
      
    Set wbReport = Workbooks.Add(template:=xlWorksheet)
    counter = 1
      
    Application.ScreenUpdating = False
    'проходим по всем выбранным файлам
    For iFile = 1 To UBound(FilesToOpen)
        Set wbImportFrom = Workbooks.Open(Filename:=FilesToOpen(iFile), ReadOnly:=True)
        With wbImportFrom.Worksheets("Sheet1")
            If .FilterMode = True Then .ShowAllData
            .Range("A1").ClearOutline
            'копируем шапку таблицы
            If blCopyHeader = False Then
                blCopyHeader = True
                .Range("A1:L1").Copy wbReport.Worksheets(1).Range("A1")
            End If
            '
            LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
            If LastRow > 1 Then
                For iRow = 2 To LastRow
                    If Not IsEmpty(.Cells(iRow, "B")) Then
                        Set rngData = .Range(.Cells(iRow, "A"), .Cells(iRow, "L"))
                        counter = counter + 1
                        'копируем строку в наш отчёт
                        rngData.Copy Destination:=wbReport.Worksheets(1).Cells(counter, 1)
                    End If
                Next iRow
            End If
        End With
        'закрываем очередной файл и переходим к другому файлу
        wbImportFrom.Close savechanges:=False
    Next iFile
     
    'наведение красоты в полученном отчёте
    With wbReport.Worksheets(1)
        .Range("A1").CurrentRegion.Borders.LineStyle = xlContinuous 'границы
        .Columns("A:L").AutoFit 'автоподбор ширины столбцов
        .Rows(1).AutoFit
        .Columns("J:J").NumberFormat = "#,##0.00" 'формат ячеек к числами
        .Range("A1").CurrentRegion.Sort Cells(1, 12), xlAscending, Header:=xlYes 'сортировка
        .ListObjects.Add(xlSrcRange, Range("A1").CurrentRegion, , xlYes).Name = "Таблица1" 'умная таблица
        .Range("J" & .UsedRange.Rows.Count + 1).FormulaLocal = "=СУММ(J2:J" & .UsedRange.Rows.Count & ")" 'сумма
    End With
    Application.ScreenUpdating = True
    MsgBox "Данные из " & UBound(FilesToOpen) & " файлов собраны!", vbInformation, "Конец"
End Sub
Изменено: Михаил О. - 19.08.2020 21:31:09
Я не Михаил...
 
Огромнейшее спасибо! то, что надо! :)
 
Добрый день.
вот сортировка по столбцу В (дата)
поставьте эту строку перед сортировкой, котора, уже есть в коде (между строками 50 и 51)

Код
.Range("A1").CurrentRegion.Sort Cells(1, 2), xlAscending, Header:=xlYes 'сортировка дат
Изменено: Михаил О. - 20.08.2020 10:35:46
Я не Михаил...
 
какие записи в макрос добавить, чтобы при сохранении, сохранялся в формат excel 2007?
 
vaspup88, Вы все свои вопросы собираетесь в одной теме задавать?
 
vikttur, а это крайний вопрос :) больше не будет по данному коду
 
добавил строку, после MsgBox...
Код
wbReport.SaveAs FileFormat:=51, CreateBackup:=False 

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

 
wbReport.SaveAs "c:\файл.xlsx", fileformat:=51, CreateBackup:=False
wbReport.close(true)
Изменено: New - 26.08.2020 20:37:25
 
New, ошибку выдает в первой из приведенных строк...Filemane может добавить надо было :) ...сейчас попробую...не помогло
Изменено: vaspup88 - 26.08.2020 20:57:55
 
New, опять?!
Страницы: 1
Наверх