Страницы: 1
RSS
Разбивка таблицы по листам на основании столбца, Необходимо разбить таблицу по листам на основании столбца
 
Доброго дня, уважаемые форумчане!

Помогите, пожалуйста, с задачкой: есть таблица, в которой около 2000 строк и примерно 70 столбцов.
Эту таблицу необходимо разделить на листы по Плантациям.

Сейчас руками я это делаю следующим образом:
1. Фильтрую таблицу по Плантации.
2. Использую макрос "Hide", который скрывает столбцы, в которых нет данных для отфильтрованной плантации
3. Создаю новый лист с названием плантации
4. Копипастом вношу только видимые значения из основной таблицы в созданный лист.

Количество плантаций в среднем 80 штук и сейчас в преддверии 8 марта количество таких файлов для обработки увеличилось в разы и руками просто не успеваю это делать, буду очень признателен за помощь!
 
ТС, вот код.
P.S. Кто подскажет, почему метод .ShowAllData выдаёт ошибку - Метод ShowAllData из класса Worksheet завершен неверно, ошибка 1004, если применяется не к активному листу? Для воспроизведения ошибки надо закомментировать строку .Activate внутри цикла For

Код
Sub Разбить_по_плантациям()
    Dim LastRow As Long, Rng As Range, Coll As New Collection, arrData, iCell As Range, Counter As Long
    
    If MsgBox("Разбить таблицу на плантациям?", vbQuestion + vbYesNo, "Вопрос") = vbNo Then Exit Sub
    Application.ScreenUpdating = False
    With Worksheets("Лист1")
        If .FilterMode = True Then .ShowAllData
        .Cells.EntireColumn.Hidden = False
        LastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
        arrData = .Range("B3:B" & LastRow).Value
        
        On Error Resume Next
        For i = 1 To UBound(arrData)
            Coll.Add arrData(i, 1), arrData(i, 1)
        Next i
        On Error GoTo 0
        .Range("B2").Select
        For i = 1 To Coll.Count
            .Activate
            If .FilterMode = True Then .ShowAllData
            .Cells.EntireColumn.Hidden = False
            .ListObjects("Таблица1").Range.AutoFilter Field:=1, Criteria1:=Coll.Item(i)
            For Each iCell In .UsedRange.Rows(1).Cells
                If iCell.Value = "x" Then iCell.EntireColumn.Hidden = True
            Next
            Counter = Counter + 1
            Worksheets.Add after:=Worksheets(Sheets.Count)
            ActiveSheet.Name = Coll.Item(i)
            .Range("B2").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy Range("A1")
            Rows(1).Delete
            Rows(1).Font.Bold = True
            Range("B2").CurrentRegion.Borders.LineStyle = 1
            Columns("A:Z").AutoFit
        Next i
        .Activate
        If .FilterMode = True Then .ShowAllData
        .Cells.EntireColumn.Hidden = False
    End With
    Application.ScreenUpdating = True
    MsgBox "Разбивка на плантациям завершена! Создано " & Counter & " листов!", vbInformation, "Конец"
End Sub
Изменено: New - 28.02.2021 13:43:04
 
New, в некоторых названиях плантаций оказались слэши, я их убрал и макрос сработал отлично!

Спасибо огромное! :)
 
Данила П,  ну или можете в моём коде вот эту строку

Код
ActiveSheet.Name = Coll.Item(i)

заменить на вот эту

Код
ActiveSheet.Name = Replace(Coll.Item(i), "/", "_")
Изменено: New - 28.02.2021 13:40:39
 
New,

Спасибо :)
 
посмотрите еще и такой вариант (PQ + VBA)
лично я терпеть не могу множество листов, поэтому сохраняю данные в виде отдельных книг

нажимаете кнопку и каждая плантация выгружается в виде отдельных книг эксель в ту же папку, где лежит исходный файл.
но при желании путь возможно указать любой
Изменено: ArgentumTiger_7 - 28.02.2021 16:58:56 (опечатка)
Страницы: 1
Наверх