Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2010, 15:14   #1
MaxxVer
Форумчанин
 
Регистрация: 17.03.2009
Сообщений: 226
По умолчанию Дробление таблицы на разные листы

Всем здравствуйте!

Прошу помощи, нужен макрос который смог бы сделать следующее:
существует большая таблица (более 20 тыс. строк), состоит она из блоков примерно по 300 строк.
Необходимо, указав количество строк, разбить эту таблицу на n-ое кол-во листов. Т.е берутся первые 300 строк (или другое количество которое я укажу), копируются и вставляются значениями в лист 2, далее берутся следующие 300 строк (по порядку) и копируются в лист 3 и т.д. пока не закончатся данные в первоначальной таблице.
Думаю пример здесь не нужен...
Заранее спасибо!
MaxxVer вне форума Ответить с цитированием
Старый 18.03.2010, 17:18   #2
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

Код:
Sub TableCut()
    Dim numStart As Long: numStart = InputBox("Укажите с какой строки начать", "Выбор стартовой строки")
    Dim numSumm As Long: numSumm = InputBox("Укажите количество строк", "Выбор количества строк")
    Dim iName As String: iName = InputBox("Введите уникальное имя для группы создаваемых листов", "Имя группы листов")
    
    x = Abs(Int(((Cells(Rows.Count, 1).End(xlUp).Row - numStart + 1) / numSumm) * (-1))) - 1
    Application.ScreenUpdating = False
    For i = 0 To x
        Sheets("Лист1").Select
        Range(Rows(numStart + i * numSumm), Rows(numStart + i * numSumm + numSumm - 1)).Copy
        Sheets.Add After:=Sheets(Sheets.Count): ActiveSheet.Name = iName & i + 1
        Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1).Select: Selection.PasteSpecial Paste:=xlPasteValues
    Next
    Application.CutCopyMode = False: Application.ScreenUpdating = True
End Sub
Выберите исходный лист с данными и запустите макрос.

Последний раз редактировалось Maxx; 18.03.2010 в 17:28.
Maxx вне форума Ответить с цитированием
Старый 22.03.2010, 06:10   #3
MaxxVer
Форумчанин
 
Регистрация: 17.03.2009
Сообщений: 226
По умолчанию

Сделал как сказано.
Ругается "run-time error 9 subscript out of range".
MaxxVer вне форума Ответить с цитированием
Старый 22.03.2010, 07:00   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

С позволения Maxx, код можно немного упростить, используя Step:
Код:
Sub TableCut2()
    Dim numStart As Long: numStart = InputBox("Укажите с какой строки начать", "Выбор стартовой строки")
    Dim numSumm As Long: numSumm = InputBox("Укажите количество строк", "Выбор количества строк")
    Dim iName As String: iName = InputBox("Введите уникальное имя для группы создаваемых листов", "Имя группы листов")
    Dim i As Long, j As Long, ws As Worksheet: Application.ScreenUpdating = False: Set ws = ActiveSheet: j = 0
    For i = numStart To ws.UsedRange.Row + ws.UsedRange.Rows.Count - 1 Step numSumm
        Sheets.Add After:=Sheets(Sheets.Count): j = j + 1: ActiveSheet.Name = iName & j
        ws.Range(ws.Cells(i, 1), ws.Cells(i + numSumm - 1, 4)).Copy [A1]
    Next: ws.Activate
End Sub
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 22.03.2010, 07:00   #5
MaxxVer
Форумчанин
 
Регистрация: 17.03.2009
Сообщений: 226
По умолчанию

Понял почему не работало - исходный лист был назван не как "Лист1", поправил теперь все работает.
Спасибо большое!
MaxxVer вне форума Ответить с цитированием
Старый 22.03.2010, 07:03   #6
MaxxVer
Форумчанин
 
Регистрация: 17.03.2009
Сообщений: 226
По умолчанию

To SAS888, ваш макрос работает как раз с любым названием листа.
Спасибо.
MaxxVer вне форума Ответить с цитированием
Старый 22.03.2010, 07:06   #7
MaxxVer
Форумчанин
 
Регистрация: 17.03.2009
Сообщений: 226
По умолчанию

To SAS888, правда копируются почему то не все столбцы.. а только 4.
MaxxVer вне форума Ответить с цитированием
Старый 22.03.2010, 07:28   #8
MaxxVer
Форумчанин
 
Регистрация: 17.03.2009
Сообщений: 226
По умолчанию

Подскажите, пожалуйста, еще: нужно чтобы название листа присваивалось беря значение столбца U. Т.е. копируется блок с 220 по 440 строку, его название содержится в ячейке U220.
MaxxVer вне форума Ответить с цитированием
Старый 22.03.2010, 07:46   #9
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
копируются почему то не все столбцы.. а только 4.
Цитата:
нужно чтобы название листа присваивалось беря значение столбца U
Можно так:
Код:
Sub TableCut2()
    Dim numStart As Long: numStart = InputBox("Укажите с какой строки начать", "Выбор стартовой строки")
    Dim numSumm As Long: numSumm = InputBox("Укажите количество строк", "Выбор количества строк")
    Dim i As Long, j As Long, ws As Worksheet: Application.ScreenUpdating = False: Set ws = ActiveSheet
    For i = numStart To ws.UsedRange.Row + ws.UsedRange.Rows.Count - 1 Step numSumm
        Sheets.Add After:=Sheets(Sheets.Count): ActiveSheet.Name = ws.Cells(i, "U")
        ws.Rows(i & ":" & i + numSumm - 1).Copy [A1]
    Next: ws.Activate
End Sub
Только... макрос не проверяет, существует лист с таким названием, или нет. Чтобы вставить такую проверку, укажите, что нужно делать в этом случае.
Также, не проверяется правильность ввода исходных данных (номер 1-й строки и количество строк в блоке). Если нужно, добавьте такую проверку самостоятельно.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 22.03.2010, 08:05   #10
MaxxVer
Форумчанин
 
Регистрация: 17.03.2009
Сообщений: 226
По умолчанию

Спасибо. Дополнительные условия не требуются, всё работает.
MaxxVer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
добавление данных через DBEdit в разные таблицы Kamelli БД в Delphi 6 31.07.2013 00:58
Сегментация. Слияние-дробление voronchak Win Api 0 26.02.2010 12:11
Листы ROBERT033 Microsoft Office Excel 10 04.02.2010 12:28
OpenGL и листы Пепел Феникса Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 14.11.2009 12:21
Разнести информацию на разные листы asale Microsoft Office Excel 3 13.06.2007 20:16