Страницы: 1
RSS
Разделить содержимое листа на n файлов по переменному признаку
 
Всем привет.
Прошу помочь со следующей задачей.
есть файл с данными, который необходимо разделить на, порядка, 32000 файлов для рассылки сответствующим клиентам.
Файл следует разделить по признаку "Зона доставки" (в примере залит желтым цветом) и этой же зоной доставки назвать разрезанный файл.
Кол-во зон доставок разное, а значит и файл должен делиться на файлы с разным кол-вом строк.
На просторах инета нашел решение похожей задачи, но там начало и конец среза ознаменованы конкретными словами ("всего" и "контрагент" ) .
Вполне возможно его можно адаптировать под мою задачу, но у меня не хватает знаний...
Код
Sub ertert()
Dim fn As String, wsh As Worksheet, wb As Object
Dim r As Range, rr As Range, s As String, ss As String
Application.ScreenUpdating = False
ActiveSheet.Copy Before:=Sheets(1)
Set wsh = ActiveSheet: s = "ВСЕГО": ss = "Контрагент"
With wsh.UsedRange.Columns("B:B")
    Do
     Set r = .Find(s, lookat:=xlWhole)
     If Not r Is Nothing Then
      With .Cells(1, 1).Resize(r.Row)
          Set rr = .Find(ss, lookat:=xlWhole)
          If Not rr Is Nothing Then
           fn = ThisWorkbook.Path & "\" & Replace(rr(1, 2), """", "")& "_" & rr(2, 2) & ".xls"
           Set wb = Workbooks.Add
           .EntireRow.Copy
           wb.Sheets(1).Range("A1").PasteSpecial Paste:=xlPasteAll
           wb.Sheets(1).Range("A1").PasteSpecial Paste:=xlPasteColumnWidths
           wb.SaveAs fn, xlNormal: DoEvents: wb.Close
          End If
          .EntireRow.Delete
      End With
     End If
    Loop Until r Is Nothing
End With
Изменено: adike - 02.03.2015 11:14:18
 
Кнопка 10-я на панели - форматирование кода. Попробуйте.
 
Сохранит файлы в папку с текущим файлом.
 
Работает, огромное спасибо.
 
Выложу для разнообразия)
Работать надо не 12 часов, а головой.
 
Leanna, в рамках конструктивной критики, не обижайтесь, в предложенном варианте будет баг, если одинаковые данные рассположенны не друг за другом.
 
МатросНаЗебре, да, вы правы) спасибо за замечание. Уже не буду переделывать, так как у вас всё верно)
Я тоже в качестве конструктивной критики предлагала бы "Application.StatusBar = False" заканчивать процедуру, а не "Готово". Не знаю чем чревато кроме как убирается кнопка записи макроса. Но мне кажется так правильнее.
Работать надо не 12 часов, а головой.
 
Спасибо, учту.
Вот так и учимся )
 
МатросНаЗебре, и все остальные уважаемые знатоки, помогите пожалуйста.
Первый предложенный код работает безошибочно. Но есть один недостаток.
Мой файл (полный аналог примера) в оригинале содержит порядка 140 000 строк, который примерно должен делится на 30-32 тыс файлов.
Недостаток в том, что все разрезанные файлы код держит открытыми, и только по окончании тотального разрезания закрывает файлы. Видимо из-за большого числа открытых файлов заканчивается память (ИМХО) и случается:
1) на каком-то по счету файле (при тестировании каждый раз разное кол-во) выдает ошибку run time error out of range
2) или же начиная с какого-то по счету файле режет и именует так как надо, но технически просто клонирует оригинальный файл и сохраняет не открывая.

Но если предварительно большой файл разрезать на 6-7 файлов (по 20-23 тыс строк) то с каждым файлом код работает корректно.

Как быть? можно ли изменить код так, чтобы он сперва закрывал созданный файл, и только потом приступал к следующему созданию файла?
Изменено: adike - 02.03.2015 09:25:56
 
adike, если у вас поля по которым идет нарезка идут _по порядку_, то попробуйте код из #5. Там как раз идет нарезка, файл закрывается.
Пс вы бы хоть попробовали все предложенные вам варианты прежде чем писать.
Работать надо не 12 часов, а головой.
 
Большое спасибо за обратную связь.
Принято, сперва буду тестить все варианты, и только потом задавать вопросы ))).
 
 Добрый день всем

У меня задача похожая, немного макросы я под себя адаптировала.
Файл нужно разделить по первой колонке "Класс"
Разница в том, что нужно сохранить в новых файлах исходное форматирование и формулы.
На это у меня совсем не хватает знаний - такое возможно в принципе?
Изменено: whisper79 - 24.07.2016 07:35:03
 
Цитата
whisper79 написал: немного макросы я под себя адаптировала. Разница в том, что ...
не видно в файле макроса, чтобы видеть, что не так
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
Разница в том, что нужно сохранить в новых файлах исходное форматирование и формулы.
Вот и создайте тему с конкретным названием.
Страницы: 1
Наверх