Страницы: 1
RSS
Разбить большую таблицу на несколько маленьких по столбцу
 
Условие: есть большая массивная таблица. Она постоянно растет: увеличивается количество строк. Количество столбцов постоянное. Раз в квартал из этой таблицы нужно делать небольшие таблицы: собрать строки имеющие одинаковое значение в заданном столбце. Желательно, чтобы маленькие таблицы собирались в этой же книге (пользователь предварительно будет удалять старые листы), при этом листы будут иметь то же название, что и данные в столбце. Шапка во всех таблицах должна присутствовать. пример выкладываю.
Помогите решить задачу с помощью макроса. Делать вручную очень сложно так как в таблице более 18000 строк. Заранее спасибо
 
Зачем вообще нужно делать эти таблицы? Освойте фильтр, затем покажите его тому, кому нужны эти таблицы.
С другой стороны - так могут и уволить...  :)
 
Из исходной таблицы строки копировать или перемещать (с удалением из исходной)?
Согласие есть продукт при полном непротивлении сторон
 
Sanja
исходная таблица остается так как есть
просто нужно чтобы создавались новые таблицы

Hugo
отчетов тьма. одному начальнику падавай все данные, другому только определенные
а вы пробывали работать с фильтрами если строк в таблице больше 30000 и надо сделать таких таблиц по 100 городам россии (или в другом варианте по более 200 предприятиям????  - во вкладках запутаетесь)
Изменено: avzan79 - 31.07.2014 16:15:36
 
Городов в России много - хватит ли столбцов? ))
 
Сводная. Параметры/Отобразить страницы фильтра.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan
главное условие, что таблица не меняет своего вида!!!
и это сейчас тут 6 городов  - нажал и ничего не пропустил, а когда, как я писал их 100
не поможет фильтр сводной таблицы


p.s. если бы было так всё просто я бы тут не писал
Изменено: avzan79 - 31.07.2014 16:19:26
 
Не понимаю чем не подходит автофильтр? Переключаться между листами бывает сложнее, чем выбрать нужный город в фильтре - на 18000 строк вероятно и городов будет пара сотен, а то и больше...
 
Hugo
на каждый город (предприятие) надо чтобы была свой лист. такой бзик вот у начальства
ладно, буду сам мучать дальше, кое что нарыл по этому вопросу:
Код
Sub Razbit()
Set ws = ActiveSheet

 iColNo = 4
 iSheetNo = 0

For iST = 2 To ws.Cells(1).CurrentRegion.Rows.Count
If ws.Cells(iST, iColNo) <> ws.Cells(iST - 1, iColNo) Then
     Set wt = Worksheets.Add
     iSheetNo = iSheetNo + 1
     
     wt.Name = IIf(Len(ws.Cells(iST, iColNo)) < 27, ws.Cells(iST, iColNo), Left(ws.Cells(iST, iColNo), 26) + Str(iSheetNo))
     
     ws.Cells(1).EntireRow.Copy Destination:=wt.Cells(1)
     ws.Cells(iST, iColNo).EntireRow.Copy Destination:=wt.Cells(2, 1)
     iTT = 3
Else
     ws.Cells(iST, iColNo).EntireRow.Copy Destination:=wt.Cells(iTT, 1)
     iTT = iTT + 1
End If
Next
End Sub
Изменено: avzan79 - 22.08.2015 06:29:08
 
avzan79, Вы даже не попробовали сводную разнести по фильтру на листы, как я Вам написал, а форматирование - это плёвое дело. Выделили листы с городами, на листе выделить всё, скопировать, вставить значения, скопировать форматирование с листа-шаблона (приготовленного заранее) и вставить на выделенные листы городов. Всё. Это быстрее, чем вручную, и, возможно, понятнее будет Вам, чем макрос. Но если не нравится, то, пожалуйста, осваивайте макросы. Ничего сложно в требуемом макросе нет. Дерзайте. :)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Красоту сами наведете?
Изменено: Sanja - 31.07.2014 17:14:17 (доработал ширину столбцов)
Согласие есть продукт при полном непротивлении сторон
 
Когда писал ответ про количество городов (и когда уже написал) - не видел предыдущих ответов что там их пара сотен бывает.
Так вот как раз - попробуйте найти нужный лист в паре сотен! Ну разве что в выпадающем списке (можно макросом его сформировать поудобнее), т.е. аналогично как в фильтре. А когда выбрали в фильтре - зачем копировать отобранное на другой лист, почему так и не использовать?
И файл будет легче раз так в 100...
А макрос я думаю может быть таким - сперва цикл по столбцу городов, собираем города в словарь, каждому городу коллекцию номеров его строк.
Затем цикл по словарю - каждому городу создаём лист, копируем на него шапку с общего листа и затем строки согласно его коллекции. Можно через массив для скорости, если не нужны форматы/заливки с общего листа.
А заодно можно создать индексный лист с ссылками на эти листы городов для облечения использования. Можно туда сразу писать и какие-то сводные данные по каждому городу - да хоть количество отобранных строк. Или средний год рождения  :)
 
Sanja, супер!!!! спасибо!!!!
 
А я как всегда хочу сделать решение более универсальным)))). Как сделать так, чтобы макрос от Sanja (пост #11) не нуждался в редактировании при изменении начальных условий (количество и название столбцов, столбец-критерий и наименование листа). Додумался только сделать запрос на имя столбца-критерия и запрос на имя листа, с которого запускается макрос...
Код
Sub SplitTable()

'Разностит DB по листам с условием в столбце "ГОРОД РОЖДЕНИЯ" (частный случай)
'http://planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=59002

col_name=InputBox ("Введите название столбца-критерия на данном листе")
If col_name = "" Then End
On Error Exit Sub

StartChName=ActiveSheet.Name


With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
End With
On Error Resume Next
    spCol = StartChName.UsedRange.Find("col_name").Column
    lRow = Cells(Rows.Count, spCol).End(xlUp).Row
    For Each cl In Range(Cells(2, spCol), Cells(lRow, spCol)).Cells
        flag = 0
        For Each Sh In Worksheets
            If Sh.Name = cl.Value Then
                Set DesSh = Sh
                flag = 1
                Exit For
            End If
        Next
        If flag = 0 Then
            Sheets.Add After:=Sheets(Sheets.Count)
            With ActiveSheet
                .Name = cl.Value
                Sheets("StartChName").Rows("1:3").Copy Destination:=.Range("A1")
            End With
            Set DesSh = ActiveSheet
        End If
        With DesSh
            Sheets("StartChName").Rows(cl.Row).Copy Destination:=.Rows(.Cells(Rows.Count, 1).End(xlUp).Row + 1)
            .Columns("A:D").EntireColumn.AutoFit
        End With
        Sheets("StartChName").Activate
    Next
With Application
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
End With
End Sub
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Читают тему
Наверх