Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Расстановка разрывов на листе во всей книге по условию - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Расстановка разрывов на листе во всей книге по условию (Макросы/Sub)
Расстановка разрывов на листе во всей книге по условию
minister Дата: Пятница, 07.02.2020, 08:03 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Здравствуйте.
Есть excel книга. В ней много листов , порядка 350.
Каждый лист содержит 3 формы, которые нужно распечатать на отдельном листе.
Автоматом расстановка разрывов криво встает.
Макросом Нужно разбить на 3 страницы каждый лист, ставя разрыв в определенном месте. Допустим где стоит условный знак.

И макрос должен отработать всю книгу, порядка 350 листов.

Помогите пожалуйста.

Пример во вложении
К сообщению приложен файл: 3346378.xlsx (208.1 Kb)
 
Ответить
СообщениеЗдравствуйте.
Есть excel книга. В ней много листов , порядка 350.
Каждый лист содержит 3 формы, которые нужно распечатать на отдельном листе.
Автоматом расстановка разрывов криво встает.
Макросом Нужно разбить на 3 страницы каждый лист, ставя разрыв в определенном месте. Допустим где стоит условный знак.

И макрос должен отработать всю книгу, порядка 350 листов.

Помогите пожалуйста.

Пример во вложении

Автор - minister
Дата добавления - 07.02.2020 в 08:03
Kuzmich Дата: Пятница, 07.02.2020, 11:22 | Сообщение № 2
Группа: Проверенные
Ранг: Ветеран
Сообщений: 711
Репутация: 156 ±
Замечаний: 0% ±

Excel 2003
Макросом.
Нашли все ячейки с условными знаками в цикле Find.....FindNext
Пусть это будет ячейка(Объект) FoundSymbol
Добавляете горизонтальный разрыв над этой ячейкой (sh-активный лист)
[vba]
Код
sh.HPageBreaks.Add Before:=sh.Rows(FoundNomer.Row)
[/vba]
 
Ответить
СообщениеМакросом.
Нашли все ячейки с условными знаками в цикле Find.....FindNext
Пусть это будет ячейка(Объект) FoundSymbol
Добавляете горизонтальный разрыв над этой ячейкой (sh-активный лист)
[vba]
Код
sh.HPageBreaks.Add Before:=sh.Rows(FoundNomer.Row)
[/vba]

Автор - Kuzmich
Дата добавления - 07.02.2020 в 11:22
minister Дата: Пятница, 07.02.2020, 11:32 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Kuzmich, а можно полностью макрос, просто я начинающий в этом деле)
 
Ответить
СообщениеKuzmich, а можно полностью макрос, просто я начинающий в этом деле)

Автор - minister
Дата добавления - 07.02.2020 в 11:32
Kuzmich Дата: Пятница, 07.02.2020, 11:34 | Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 711
Репутация: 156 ±
Замечаний: 0% ±

Excel 2003
Посмотрите на соседнем форуме
https://www.planetaexcel.ru/forum....=125276
 
Ответить
СообщениеПосмотрите на соседнем форуме
https://www.planetaexcel.ru/forum....=125276

Автор - Kuzmich
Дата добавления - 07.02.2020 в 11:34
minister Дата: Пятница, 07.02.2020, 11:56 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
[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 - Пятница, 07.02.2020, 11:56
 
Ответить
Сообщение[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
Дата добавления - 07.02.2020 в 11:56
Kuzmich Дата: Пятница, 07.02.2020, 12:02 | Сообщение № 6
Группа: Проверенные
Ранг: Ветеран
Сообщений: 711
Репутация: 156 ±
Замечаний: 0% ±

Excel 2003
minister
Вы можете выложить ваш пример в формате .xls
ваш файл из первого сообщения конвертер не воспринимает.
Цитата
Надо на всей книге ,в которой порядка 350 листов

Надо сделать цикл по всем листам
 
Ответить
Сообщениеminister
Вы можете выложить ваш пример в формате .xls
ваш файл из первого сообщения конвертер не воспринимает.
Цитата
Надо на всей книге ,в которой порядка 350 листов

Надо сделать цикл по всем листам

Автор - Kuzmich
Дата добавления - 07.02.2020 в 12:02
minister Дата: Пятница, 07.02.2020, 12:11 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Прикрепил
К сообщению приложен файл: __.xls (207.0 Kb)
 
Ответить
СообщениеПрикрепил

Автор - minister
Дата добавления - 07.02.2020 в 12:11
Kuzmich Дата: Пятница, 07.02.2020, 12:29 | Сообщение № 8
Группа: Проверенные
Ранг: Ветеран
Сообщений: 711
Репутация: 156 ±
Замечаний: 0% ±

Excel 2003
А где на листах ячейка с "Форма 05*" ?
 
Ответить
СообщениеА где на листах ячейка с "Форма 05*" ?

Автор - Kuzmich
Дата добавления - 07.02.2020 в 12:29
minister Дата: Пятница, 07.02.2020, 12:32 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
В образце это место обозвал "новая страничка"
Над этим поле разрыв. Получается 3 формы, на каждом листе отдельно
 
Ответить
СообщениеВ образце это место обозвал "новая страничка"
Над этим поле разрыв. Получается 3 формы, на каждом листе отдельно

Автор - minister
Дата добавления - 07.02.2020 в 12:32
Kuzmich Дата: Пятница, 07.02.2020, 12:38 | Сообщение № 10
Группа: Проверенные
Ранг: Ветеран
Сообщений: 711
Репутация: 156 ±
Замечаний: 0% ±

Excel 2003
Первая страница FX:GW в пределах страницы
остальные сдвинуты GE:HC и выходят за границы страницы?
 
Ответить
СообщениеПервая страница FX:GW в пределах страницы
остальные сдвинуты GE:HC и выходят за границы страницы?

Автор - Kuzmich
Дата добавления - 07.02.2020 в 12:38
minister Дата: Пятница, 07.02.2020, 12:44 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Да, первая страничка на листе поуже, остальные две одинаковые по ширине,

Но можно и по одной ширине все печатать
 
Ответить
СообщениеДа, первая страничка на листе поуже, остальные две одинаковые по ширине,

Но можно и по одной ширине все печатать

Автор - minister
Дата добавления - 07.02.2020 в 12:44
Kuzmich Дата: Пятница, 07.02.2020, 14:22 | Сообщение № 12
Группа: Проверенные
Ранг: Ветеран
Сообщений: 711
Репутация: 156 ±
Замечаний: 0% ±

Excel 2003
Макрос для одного листа
[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
[/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
[/vba]
Цикл по всем листам сделайте сами.

Автор - Kuzmich
Дата добавления - 07.02.2020 в 14:22
minister Дата: Пятница, 07.02.2020, 15:59 | Сообщение № 13
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
.PageSetup.PrintArea = "$A:$GW"


Спасибо работает.

Только режет по уровню первой странички все остальные листы, поправил .PageSetup.PrintArea = "$A:$GW" на .PageSetup.PrintArea = "$A:$HC"

Попробую цикл сделать, нагуглю поди))


Сообщение отредактировал minister - Пятница, 07.02.2020, 16:03
 
Ответить
Сообщение
.PageSetup.PrintArea = "$A:$GW"


Спасибо работает.

Только режет по уровню первой странички все остальные листы, поправил .PageSetup.PrintArea = "$A:$GW" на .PageSetup.PrintArea = "$A:$HC"

Попробую цикл сделать, нагуглю поди))

Автор - minister
Дата добавления - 07.02.2020 в 15:59
Kuzmich Дата: Пятница, 07.02.2020, 16:59 | Сообщение № 14
Группа: Проверенные
Ранг: Ветеран
Сообщений: 711
Репутация: 156 ±
Замечаний: 0% ±

Excel 2003
Используйте цикл по всем листам книги
[vba]
Код
Dim Sht As Worksheet
    For Each Sht In Worksheets
    .............
    Next
[/vba]
 
Ответить
СообщениеИспользуйте цикл по всем листам книги
[vba]
Код
Dim Sht As Worksheet
    For Each Sht In Worksheets
    .............
    Next
[/vba]

Автор - Kuzmich
Дата добавления - 07.02.2020 в 16:59
minister Дата: Суббота, 08.02.2020, 13:17 | Сообщение № 15
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
[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]
Код
Application.ScreenUpdating = True
    MsgBox "Разрывы вставлены!", vbInformation
[/vba]
 
Ответить
Сообщение[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]
Код
Application.ScreenUpdating = True
    MsgBox "Разрывы вставлены!", vbInformation
[/vba]

Автор - minister
Дата добавления - 08.02.2020 в 13:17
Nic70y Дата: Суббота, 08.02.2020, 13:20 | Сообщение № 16
Группа: Друзья
Ранг: Экселист
Сообщений: 8759
Репутация: 2273 ±
Замечаний: 0% ±

Excel 2010
уберите под Next


ЮMoney 41001841029809
 
Ответить
Сообщениеуберите под Next

Автор - Nic70y
Дата добавления - 08.02.2020 в 13:20
minister Дата: Суббота, 08.02.2020, 13:25 | Сообщение № 17
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
уберите под Next

тоесть End Sub ? тогда ошибка.

Надо чтоб макрос по всем 350 листам проходил, с одного нажатия.
 
Ответить
Сообщение
уберите под Next

тоесть End Sub ? тогда ошибка.

Надо чтоб макрос по всем 350 листам проходил, с одного нажатия.

Автор - minister
Дата добавления - 08.02.2020 в 13:25
Pelena Дата: Суббота, 08.02.2020, 13:28 | Сообщение № 18
Группа: Админы
Ранг: Местный житель
Сообщений: 19182
Репутация: 4420 ±
Замечаний: ±

Excel 365 & Mac Excel
на активном листе отрабатывает

строчку [vba]
Код
For Each sh In Worksheets
[/vba] вставьте ВМЕСТО [vba]
Код
Set sh = ActiveSheet
[/vba] обратите внимание на имена переменных


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение
на активном листе отрабатывает

строчку [vba]
Код
For Each sh In Worksheets
[/vba] вставьте ВМЕСТО [vba]
Код
Set sh = ActiveSheet
[/vba] обратите внимание на имена переменных

Автор - Pelena
Дата добавления - 08.02.2020 в 13:28
Nic70y Дата: Суббота, 08.02.2020, 13:31 | Сообщение № 19
Группа: Друзья
Ранг: Экселист
Сообщений: 8759
Репутация: 2273 ±
Замечаний: 0% ±

Excel 2010
[vba]
Код
End With
Next
Application.ScreenUpdating = True
    MsgBox "Разрывы вставлены!", vbInformation
End Sub
[/vba]


ЮMoney 41001841029809
 
Ответить
Сообщение[vba]
Код
End With
Next
Application.ScreenUpdating = True
    MsgBox "Разрывы вставлены!", vbInformation
End Sub
[/vba]

Автор - Nic70y
Дата добавления - 08.02.2020 в 13:31
minister Дата: Суббота, 08.02.2020, 13:35 | Сообщение № 20
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Всем огромное спасибо, кажется заработало. По край не мере на тестовом файле.
В понедельник буду на рабочем тестить.

итоговый код
[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
[/vba]

Автор - minister
Дата добавления - 08.02.2020 в 13:35
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Расстановка разрывов на листе во всей книге по условию (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!