Здравствуйте. Есть excel книга. В ней много листов , порядка 350. Каждый лист содержит 3 формы, которые нужно распечатать на отдельном листе. Автоматом расстановка разрывов криво встает. Макросом Нужно разбить на 3 страницы каждый лист, ставя разрыв в определенном месте. Допустим где стоит условный знак.
И макрос должен отработать всю книгу, порядка 350 листов.
Помогите пожалуйста.
Пример во вложении
Здравствуйте. Есть excel книга. В ней много листов , порядка 350. Каждый лист содержит 3 формы, которые нужно распечатать на отдельном листе. Автоматом расстановка разрывов криво встает. Макросом Нужно разбить на 3 страницы каждый лист, ставя разрыв в определенном месте. Допустим где стоит условный знак.
И макрос должен отработать всю книгу, порядка 350 листов.
Макросом. Нашли все ячейки с условными знаками в цикле Find.....FindNext Пусть это будет ячейка(Объект) FoundSymbol Добавляете горизонтальный разрыв над этой ячейкой (sh-активный лист) [vba]
Макросом. Нашли все ячейки с условными знаками в цикле Find.....FindNext Пусть это будет ячейка(Объект) FoundSymbol Добавляете горизонтальный разрыв над этой ячейкой (sh-активный лист) [vba]
Sub InsPageBreaks() Const Hd$ = "Форма 05*" Dim pb&, r&, br& With ActiveSheet.HPageBreaks Cells(Rows.Count, 1).End(xlUp).Select For pb = .Count To 1 Step -1 If .Item(pb).Type = xlPageBreakManual Then .Item(pb).Delete Next pb = 1 Do While pb < .Count br = .Item(pb).Location.Row If Not Cells(br, 1) Like Hd Then r = Cells.Find(Hd, Cells(br, 1), SearchDirection:=xlNext).Row If r - br > 2 Then .Add before:=Rows(Cells.Find(Hd, _ Cells(br, 1), SearchDirection:=xlPrevious).Row) End If pb = pb + 1 Loop End With End Sub
[/vba]
Попробовал данный макрос, он отрабатывает только на активном листе, и только один разрыв ставит. У меня на листе 2 разрыва будет. В двух местах ключевое слово есть Const Hd$ = "Форма 05*"
Надо на всей книге ,в которой порядка 350 листов.
[vba]
Код
Sub InsPageBreaks() Const Hd$ = "Форма 05*" Dim pb&, r&, br& With ActiveSheet.HPageBreaks Cells(Rows.Count, 1).End(xlUp).Select For pb = .Count To 1 Step -1 If .Item(pb).Type = xlPageBreakManual Then .Item(pb).Delete Next pb = 1 Do While pb < .Count br = .Item(pb).Location.Row If Not Cells(br, 1) Like Hd Then r = Cells.Find(Hd, Cells(br, 1), SearchDirection:=xlNext).Row If r - br > 2 Then .Add before:=Rows(Cells.Find(Hd, _ Cells(br, 1), SearchDirection:=xlPrevious).Row) End If pb = pb + 1 Loop End With End Sub
[/vba]
Попробовал данный макрос, он отрабатывает только на активном листе, и только один разрыв ставит. У меня на листе 2 разрыва будет. В двух местах ключевое слово есть Const Hd$ = "Форма 05*"
Надо на всей книге ,в которой порядка 350 листов.minister
Сообщение отредактировал minister - Пятница, 07.02.2020, 11:56
Sub Вставить_разрывы() Dim sh As Worksheet Dim FoundStr As Range Dim FAdr As String Application.ScreenUpdating = False Set sh = ActiveSheet With sh .PageSetup.PrintArea = "$A:$GW" .ResetAllPageBreaks .PageSetup.Zoom = False .PageSetup.FitToPagesWide = 1 .PageSetup.FitToPagesTall = False Set FoundStr = .Columns("GE:HC").Find("новая страничка", , xlValues, xlWhole) If Not FoundStr Is Nothing Then FAdr = FoundStr.Address Do Set FoundStr = .Columns("GE:HC").FindNext(FoundStr) .HPageBreaks.Add Before:=sh.Rows(FoundStr.Row) Loop While FoundStr.Address <> FAdr End If End With Application.ScreenUpdating = True MsgBox "Разрывы вставлены!", vbInformation End Sub
[/vba] Цикл по всем листам сделайте сами.
Макрос для одного листа [vba]
Код
Sub Вставить_разрывы() Dim sh As Worksheet Dim FoundStr As Range Dim FAdr As String Application.ScreenUpdating = False Set sh = ActiveSheet With sh .PageSetup.PrintArea = "$A:$GW" .ResetAllPageBreaks .PageSetup.Zoom = False .PageSetup.FitToPagesWide = 1 .PageSetup.FitToPagesTall = False Set FoundStr = .Columns("GE:HC").Find("новая страничка", , xlValues, xlWhole) If Not FoundStr Is Nothing Then FAdr = FoundStr.Address Do Set FoundStr = .Columns("GE:HC").FindNext(FoundStr) .HPageBreaks.Add Before:=sh.Rows(FoundStr.Row) Loop While FoundStr.Address <> FAdr End If End With Application.ScreenUpdating = True MsgBox "Разрывы вставлены!", vbInformation End Sub
Sub Вставить_разрывы() Dim Sht As Worksheet For Each Sht In Worksheets
Dim FoundStr As Range Dim FAdr As String Application.ScreenUpdating = False Set sh = ActiveSheet With sh .PageSetup.PrintArea = "$A:$HC" .ResetAllPageBreaks .PageSetup.Zoom = False .PageSetup.FitToPagesWide = 1 .PageSetup.FitToPagesTall = False Set FoundStr = .Columns("GE:HC").Find("новая страничка", , xlValues, xlWhole) If Not FoundStr Is Nothing Then FAdr = FoundStr.Address Do Set FoundStr = .Columns("GE:HC").FindNext(FoundStr) .HPageBreaks.Add Before:=sh.Rows(FoundStr.Row) Loop While FoundStr.Address <> FAdr End If End With Application.ScreenUpdating = True MsgBox "Разрывы вставлены!", vbInformation Next End Sub
[/vba]
Получился такой код, но почему то на активном листе отрабатывает. Но Сообщение что разрыв вставлен выскакивает 3 раза (жму ок)
Кстати, чтоб 350 раз ОК не жать нужно удалить это ? [vba]
Sub Вставить_разрывы() Dim Sht As Worksheet For Each Sht In Worksheets
Dim FoundStr As Range Dim FAdr As String Application.ScreenUpdating = False Set sh = ActiveSheet With sh .PageSetup.PrintArea = "$A:$HC" .ResetAllPageBreaks .PageSetup.Zoom = False .PageSetup.FitToPagesWide = 1 .PageSetup.FitToPagesTall = False Set FoundStr = .Columns("GE:HC").Find("новая страничка", , xlValues, xlWhole) If Not FoundStr Is Nothing Then FAdr = FoundStr.Address Do Set FoundStr = .Columns("GE:HC").FindNext(FoundStr) .HPageBreaks.Add Before:=sh.Rows(FoundStr.Row) Loop While FoundStr.Address <> FAdr End If End With Application.ScreenUpdating = True MsgBox "Разрывы вставлены!", vbInformation Next End Sub
[/vba]
Получился такой код, но почему то на активном листе отрабатывает. Но Сообщение что разрыв вставлен выскакивает 3 раза (жму ок)
Кстати, чтоб 350 раз ОК не жать нужно удалить это ? [vba]
Всем огромное спасибо, кажется заработало. По край не мере на тестовом файле. В понедельник буду на рабочем тестить.
итоговый код [vba]
Код
Sub Вставить_разрывы() Dim sh As Worksheet Dim FoundStr As Range Dim FAdr As String Application.ScreenUpdating = False For Each sh In Worksheets With sh .PageSetup.PrintArea = "$A:$HC" .ResetAllPageBreaks .PageSetup.Zoom = False .PageSetup.FitToPagesWide = 1 .PageSetup.FitToPagesTall = False Set FoundStr = .Columns("GE:HC").Find("новая страничка", , xlValues, xlWhole) If Not FoundStr Is Nothing Then FAdr = FoundStr.Address Do Set FoundStr = .Columns("GE:HC").FindNext(FoundStr) .HPageBreaks.Add Before:=sh.Rows(FoundStr.Row) Loop While FoundStr.Address <> FAdr End If End With Next End Sub
[/vba]
Всем огромное спасибо, кажется заработало. По край не мере на тестовом файле. В понедельник буду на рабочем тестить.
итоговый код [vba]
Код
Sub Вставить_разрывы() Dim sh As Worksheet Dim FoundStr As Range Dim FAdr As String Application.ScreenUpdating = False For Each sh In Worksheets With sh .PageSetup.PrintArea = "$A:$HC" .ResetAllPageBreaks .PageSetup.Zoom = False .PageSetup.FitToPagesWide = 1 .PageSetup.FitToPagesTall = False Set FoundStr = .Columns("GE:HC").Find("новая страничка", , xlValues, xlWhole) If Not FoundStr Is Nothing Then FAdr = FoundStr.Address Do Set FoundStr = .Columns("GE:HC").FindNext(FoundStr) .HPageBreaks.Add Before:=sh.Rows(FoundStr.Row) Loop While FoundStr.Address <> FAdr End If End With Next End Sub