Добрый день! Уважаемые Гуру, нужна помощь в правке макроса, либо другого решения. Суть: есть таблица (в примере она маленькая, на деле внутри 50 таблиц, лист 1). Внутри нее однотипные таблицы с шапкой. Все они разделены разрывом страниц, чтобы их было удобно печатать. Встала задача, как из этой общей таблицы вытащить все по отдельности с сохранением в отдельные файлы. Желательно с сохранением форматирования. Прогуглил кучу тем, перепробовал разные варианты, в итоге кое-как собрал себе макрос. Проблема в том, что нужную мне функцию он выполняет, то есть вытаскивает таблицы по параметрам (ищет ключевые слова, по ним копирует строки) и сохраняет в отдельные файлы с именами Заказ_1, Заказ_2 и т.д. через blockCounter. При этом теряется оригинальное форматирование (исходный файл при выгрузке то еще чудовище само по себе). Помогите, пожалуйста с решением двух проблем: 1. Как сохранить исходное форматирование 2. Имена файлов сделать по номеру заказа (как в ячейке перед таблицей) - Заказ поставщику № 000000 от ______.
[vba]
Код
Sub SplitTable() Dim ws As Worksheet Dim lastRow As Long Dim startRow As Long Dim endRow As Long Dim blockCounter As Integer Application.ScreenUpdating = False Set ws = ThisWorkbook.Sheets("TDSheet")
For startRow = 1 To lastRow If InStr(1, ws.Cells(startRow, "B").Value, "Заказ поставщику") > 0 Then For endRow = startRow To lastRow If InStr(1, ws.Cells(endRow, "B").Value, "Ответственный") > 0 Then ws.Rows(startRow & ":" & endRow).Copy Dim newWorkbook As Workbook Set newWorkbook = Workbooks.Add newWorkbook.Sheets(1).Paste newWorkbook.SaveAs ThisWorkbook.Path & "/" & "Заказ_" & blockCounter & ".xlsx" newWorkbook.Close SaveChanges:=False blockCounter = blockCounter + 1 Exit For End If Next endRow End If Next startRow Application.ScreenUpdating = True MsgBox "Все заказы обработаны!" End Sub
[/vba]
Пытался сделать решение по вставке в названия файлов текста из ячейки, отдельно работает, но как сюда это прикрутить, не знаю.
[vba]
Код
For Each cell In rng.Rows If cell.Value = "Заказ поставщика" Then ' Создаем новый файл Set newWorkbook = Workbooks.Add ' Копируем данные в новый файл, включая форматирование rng.Copy newWorkbook.ActiveSheet.Range("A1")
' Задаем имя файла на основе заголовка fileName = ws.Range("B" & cell.Row).Value
' Сохраняем файл newWorkbook.SaveAs fileName & ".xlsx" newWorkbook.Close End If Next cell
[/vba]
Добрый день! Уважаемые Гуру, нужна помощь в правке макроса, либо другого решения. Суть: есть таблица (в примере она маленькая, на деле внутри 50 таблиц, лист 1). Внутри нее однотипные таблицы с шапкой. Все они разделены разрывом страниц, чтобы их было удобно печатать. Встала задача, как из этой общей таблицы вытащить все по отдельности с сохранением в отдельные файлы. Желательно с сохранением форматирования. Прогуглил кучу тем, перепробовал разные варианты, в итоге кое-как собрал себе макрос. Проблема в том, что нужную мне функцию он выполняет, то есть вытаскивает таблицы по параметрам (ищет ключевые слова, по ним копирует строки) и сохраняет в отдельные файлы с именами Заказ_1, Заказ_2 и т.д. через blockCounter. При этом теряется оригинальное форматирование (исходный файл при выгрузке то еще чудовище само по себе). Помогите, пожалуйста с решением двух проблем: 1. Как сохранить исходное форматирование 2. Имена файлов сделать по номеру заказа (как в ячейке перед таблицей) - Заказ поставщику № 000000 от ______.
[vba]
Код
Sub SplitTable() Dim ws As Worksheet Dim lastRow As Long Dim startRow As Long Dim endRow As Long Dim blockCounter As Integer Application.ScreenUpdating = False Set ws = ThisWorkbook.Sheets("TDSheet")
For startRow = 1 To lastRow If InStr(1, ws.Cells(startRow, "B").Value, "Заказ поставщику") > 0 Then For endRow = startRow To lastRow If InStr(1, ws.Cells(endRow, "B").Value, "Ответственный") > 0 Then ws.Rows(startRow & ":" & endRow).Copy Dim newWorkbook As Workbook Set newWorkbook = Workbooks.Add newWorkbook.Sheets(1).Paste newWorkbook.SaveAs ThisWorkbook.Path & "/" & "Заказ_" & blockCounter & ".xlsx" newWorkbook.Close SaveChanges:=False blockCounter = blockCounter + 1 Exit For End If Next endRow End If Next startRow Application.ScreenUpdating = True MsgBox "Все заказы обработаны!" End Sub
[/vba]
Пытался сделать решение по вставке в названия файлов текста из ячейки, отдельно работает, но как сюда это прикрутить, не знаю.
[vba]
Код
For Each cell In rng.Rows If cell.Value = "Заказ поставщика" Then ' Создаем новый файл Set newWorkbook = Workbooks.Add ' Копируем данные в новый файл, включая форматирование rng.Copy newWorkbook.ActiveSheet.Range("A1")
' Задаем имя файла на основе заголовка fileName = ws.Range("B" & cell.Row).Value
Допишите рекордером в макрос спецкопипаст ширины столбцов и исходного форматирования. Текст из ячейки нет особых проблем взять, скажите какой именно текст.
[vba]
Код
Sub SplitTable() Dim ws As Worksheet Dim lastRow As Long Dim startRow As Long Dim endRow As Long Dim blockCounter As Integer Dim zak As String
Application.ScreenUpdating = False Set ws = ThisWorkbook.Sheets("TDSheet")
For startRow = 1 To lastRow If InStr(1, ws.Cells(startRow, "B").Value, "Заказ поставщику") > 0 Then For endRow = startRow To lastRow If InStr(1, ws.Cells(endRow, "B").Value, "Ответственный") > 0 Then zak = ws.Cells(startRow, "B").Value ws.Rows(startRow & ":" & endRow).Copy Dim newWorkbook As Workbook Set newWorkbook = Workbooks.Add newWorkbook.Sheets(1).Paste
With newWorkbook.Sheets(1).Cells(1) .PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _ , SkipBlanks:=False, Transpose:=False .PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False .Select End With
newWorkbook.SaveAs ThisWorkbook.Path & "/" & zak & ".xlsx" ' "Заказ_" & blockCounter & ".xlsx" newWorkbook.Close SaveChanges:=False blockCounter = blockCounter + 1 Exit For End If Next endRow End If Next startRow Application.ScreenUpdating = True MsgBox "Все заказы обработаны!" End Sub
[/vba]
Допишите рекордером в макрос спецкопипаст ширины столбцов и исходного форматирования. Текст из ячейки нет особых проблем взять, скажите какой именно текст.
[vba]
Код
Sub SplitTable() Dim ws As Worksheet Dim lastRow As Long Dim startRow As Long Dim endRow As Long Dim blockCounter As Integer Dim zak As String
Application.ScreenUpdating = False Set ws = ThisWorkbook.Sheets("TDSheet")
For startRow = 1 To lastRow If InStr(1, ws.Cells(startRow, "B").Value, "Заказ поставщику") > 0 Then For endRow = startRow To lastRow If InStr(1, ws.Cells(endRow, "B").Value, "Ответственный") > 0 Then zak = ws.Cells(startRow, "B").Value ws.Rows(startRow & ":" & endRow).Copy Dim newWorkbook As Workbook Set newWorkbook = Workbooks.Add newWorkbook.Sheets(1).Paste
With newWorkbook.Sheets(1).Cells(1) .PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _ , SkipBlanks:=False, Transpose:=False .PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False .Select End With
newWorkbook.SaveAs ThisWorkbook.Path & "/" & zak & ".xlsx" ' "Заказ_" & blockCounter & ".xlsx" newWorkbook.Close SaveChanges:=False blockCounter = blockCounter + 1 Exit For End If Next endRow End If Next startRow Application.ScreenUpdating = True MsgBox "Все заказы обработаны!" End Sub