Sla_0412 Пользователь Сообщений: 206 |
В моем примере необходимо вставлять вертикальный разрыв страницы на следующих условиях: Изменено: Sla_0412 — 19.03.2020 19:01:14 |
Kuzmich Пользователь Сообщений: 7998 |
#2 29.04.2015 20:06:04
А я, так понимаю, что нужен горизонтальный разрыв |
||
Sla_0412 Пользователь Сообщений: 206 |
да, мне нужно только по горизонтали |
Kuzmich Пользователь Сообщений: 7998 |
#4 29.04.2015 20:08:54 И еще, сколько строк умещается на странице?
разрыв над ячейкой Изменено: Kuzmich — 05.05.2015 14:55:22 |
||
Sla_0412 Пользователь Сообщений: 206 |
Проблема состоит в том что при использовании ActiveSheet.HPageBreaks.Add ячейка, я смог только сдвинуть первый разрыв, который влияет на последующие разрывы ниже по строкам. те никак не соображу как зациклить обработку если информация всегда размещается вразнобой.(листов множество и комбинации текста и графики разные) |
Kuzmich Пользователь Сообщений: 7998 |
#6 29.04.2015 21:30:53 Попробуйте так
|
||
Sla_0412 Пользователь Сообщений: 206 |
Я может как то неправильно описал задачу, но во первых, файл выложен как пример и привязываться к его размерам высоты строк а так же к ориентации листа никак нельзя. Предполагается использовать метод для разных целей (отчеты разных документов) , на разных компьютерах, с разными принтерами. Во-вторых , он даже в том виде в котором есть, не отрабатывает свою задачу.(Это легко проверить скопировав текст примера вниз и продолжив ряд строк. |
RAN Пользователь Сообщений: 7091 |
#8 29.04.2015 23:01:43
И? |
||
Kuzmich Пользователь Сообщений: 7998 |
#9 29.04.2015 23:09:21 Попробуйте так
|
||
Sla_0412 Пользователь Сообщений: 206 |
Все работает, но нужно вставить между строкой 6 и 7 On Error Resume Next. |
temash Пользователь Сообщений: 13 |
Здравствуйте! У меня вопрос по этой теме. мне надо поставить разрыв перед словом «карточка» (т.е. каждая карточка должна начинаться с новой страницы при печати). |
Kuzmich Пользователь Сообщений: 7998 |
#12 02.06.2015 12:49:00 Попробуйте так Параметры страницы — Поля верхнее 1, нижнее — 1,5 колонтитулы — 0
|
||
temash Пользователь Сообщений: 13 |
Kuzmich, спасибо, работает!!! |
temash Пользователь Сообщений: 13 |
#14 02.06.2015 18:23:24 захотела сама подогнать макрос под другой файл… видно не дано….. посмотрите, что не так?
Прикрепленные файлы
|
||
RAN Пользователь Сообщений: 7091 |
#15 02.06.2015 19:44:22 Макрос попроще
|
||
Kuzmich Пользователь Сообщений: 7998 |
#16 02.06.2015 20:26:06
В 130 столбце нет данных, ищите последнюю строку по первому столбцу
|
||||
temash Пользователь Сообщений: 13 |
RAN, спасибо большое, работает ВЫ ГЕНИИ!!!!! |
eka0043 Пользователь Сообщений: 1 |
Ребята, помогите, плиз прописать макрос. У самой ничего не получается. В табличке, которая прикреплена, нужен разрыв страницы по первой колонке «ветка». И чтобы на одной страничке было только 23 строки. |
adventy Пользователь Сообщений: 24 |
#19 19.03.2020 17:48:19
Добрый день. |
||
Kuzmich Пользователь Сообщений: 7998 |
#20 20.03.2020 13:35:29
Изменено: Kuzmich — 20.03.2020 14:58:53 |
||||
adventy Пользователь Сообщений: 24 |
Спасибо Kuzmich , я это тоже искал! |
Vitalio Пользователь Сообщений: 8 |
#22 21.10.2020 13:34:43 Здравствуйте, уважаемые! Если можете, помогите, пожалуйста, с похожей задачей. Есть стандартная накладная в которой есть шапка накладной, тело (таблица с товарами), а так же подписи. Можно ли проверить находятся начало подписи и конец на одном листе и, если да, то проверить не оторвана ли подпись от основной таблицы? И в зависимости от сложности реализации или уменьшить на 1 выводимые на печать количество страниц или добавить разрыв перед последней строкой табличной части? Визуально можно посмотреть в прилагаемом файле. Прикрепленные файлы
Изменено: Vitalio — 21.10.2020 13:35:13 |
Запись от Alex_Gur размещена 24.09.2015 в 15:15
Обновил(-а) Alex_Gur 28.01.2016 в 11:56
Если в Word страницы входят в коллекцию
Visual Basic | ||
|
и обращение к ним производится по типу:
Visual Basic | ||
|
то в Excel работа со страницами производится с помощью коллекций разрывов страниц соответственно по вертикали и по горизонтали
Visual Basic | ||
|
и
Visual Basic | ||
|
.
Приведенные далее макросы для работы со страницами в Excel нужно помещать в модули группы Modules.
Количество страниц по вертикали
Visual Basic | ||
|
Количество страниц по горизонтали
Visual Basic | ||
|
Проверка количества страниц по горизонтали (если оно не должно превышать 1)
Visual Basic | ||
|
Общее количество страниц на активном листе
Visual Basic | ||
|
или
Visual Basic | ||
|
Количество страниц на всех листах книги
Visual Basic | ||
|
Вставка пользователем разрыва страницы
Пользовательский разрыв страницы устанавливается над ячейкой, указанной в качестве параметра Before.
Visual Basic | ||
|
Вместо ячейки ActiveCell в данном коде можно указать ячейку с определенным произвольным адресом.
Внимание! После установки пользовательского разрыва страницы автоматические разрывы, устанавливаемые программой перед печатью, могут быть автоматически изменены.
Удаление пользовательского разрыва страницы с определенным номером
Все символы Разрыв страницы (как пользовательские, так и установленные программой автоматически для деления на страницы для печати) входят в коллекцию HPageBreaks и имеют в этой коллекции свой уникальный номер. Зная этот номер, можно легко удалить пользовательский разрыв страницы.
Visual Basic | ||
|
Удаление пользовательского разрыва страницы над указанной ячейкой
Удаление производится, если над указанной ячейкой действительно был установлен пользовательский разрыва страницы.
Visual Basic | ||
|
Вместо ячейки ActiveCell в данном коде можно указать ячейку с определенным произвольным адресом.
Печать только первой страницы
Visual Basic | ||
|
Всего комментариев
As part of an overhaul of a report generator I saw what I believed to be inefficient code. This part of the code runs after the main report is generated to set the page breaks in logical positions. The criteria is this:
- Each Site starts on a new page.
- Group’s aren’t allowed to broken across pages.
The code follows the above format: 2 loops doing those jobs.
This is the original code (sorry for the length):
Public Sub PageBreak(ByRef wstWorksheet As Excel.Worksheet, ByVal pctProgress As ProgressCtl.ProgressControl)
Dim breaksMoved As Integer
Dim p As HPageBreak
Dim i As Integer
'Used as a control value
breaksMoved = 1
' Marks that no rows/columns are to be repeated on each page
wstWorksheet.Activate
wstWorksheet.PageSetup.PrintTitleRows = ""
wstWorksheet.PageSetup.PrintTitleColumns = ""
'If this isn't performed beforehand, then the HPageBreaks object isn't available
Range("A3").Select
ActiveWindow.View = xlPageBreakPreview
'Defaults the print area to be the entire sheet
wstWorksheet.DisplayPageBreaks = False
wstWorksheet.PageSetup.PrintArea = ""
Range("$B$4").Select
' add breaks after each site
Do While ActiveCell.Row <= wstWorksheet.UsedRange.Rows.Count
If ActiveCell.FormulaR1C1 = "Site ID" Then
ActiveCell.PageBreak = xlPageBreakManual
End If
ActiveCell.Offset(1, 0).Activate
pctProgress.ProgressText = "Row " & CStr(ActiveCell.Row) & " of " & CStr(wstWorksheet.UsedRange.Rows.Count)
Loop
Dim passes As Long
Do While breaksMoved = 1
passes = passes + 1
breaksMoved = 0
For i = 1 To wstWorksheet.HPageBreaks.Count - 1
Set p = wstWorksheet.HPageBreaks.Item(i)
'Selects the first page break
Range(p.Location.Address).Select
'Sets the ActiveCell to 1 row above the page break
ActiveCell.Offset(-1, 0).Activate
'Move the intended break point up to the first blank section
Do While Not ActiveCell.FormulaR1C1 = ""
ActiveCell.Offset(-1, 0).Activate
breaksMoved = 1
Loop
'Add the page break
If ActiveCell.FormulaR1C1 <> "Site ID" Then
ActiveCell.Offset(1, 0).Activate
wstWorksheet.HPageBreaks.Add ActiveCell
End If
pctProgress.ProgressText = "Set break point " & CStr(passes) & "." & CStr(i)
Next
Loop
'Reset the view to normal
wstWorksheet.DisplayPageBreaks = True
ActiveWindow.View = xlNormalView
Range("A3").Select
End Sub
Seeing room for improvement I set about modifying this. As one of the new requirements the people wanting the report were manually removing pages prior to printing. So I added checkboxes on another page and copied the checked items across. To ease that I used named ranges. I used these named ranges to meet the first requirement:
' add breaks after each site
For Each RangeName In ActiveWorkbook.Names
If Mid(RangeName.Name, 1, 1) = "P" Then
Range(RangeName).Activate
ActiveCell.Offset(Range(RangeName).Rows.Count - 1, 0).Select
ActiveCell.PageBreak = xlPageBreakManual
End If
Next RangeName
All Ranges are prefixed with P_ (for parent). Using the lame Now() style of rough timing this is 1 second slower on my short 4 site report and the more challenging 15 site report. These have 606 and 1600 rows respectively.
1 second isn’t so bad. Lets look at the next criteria.
Each logical group is split by a blank row, so the easiest way is to find the next page break, step back until you find the next blank line and insert the new break. Rinse and repeat.
So why does the original run through multiple times? We can improve that too (the boiler plate outside the loops is the same).
Dim i As Long
Dim oPageBreak As HPageBreak
Do While i < shtDeliveryVariance.HPageBreaks.Count - 1
i = i + 1
pctProgress.ProgressText = "Setting Page Break " & CStr(i) & " of " & CStr(shtDeliveryVariance.HPageBreaks.Count)
Set oPageBreak = shtDeliveryVariance.HPageBreaks.Item(i)
' select the page break
Range(oPageBreak.Location.Address).Select
ActiveCell.Offset(-1, 0).Activate
' move up to a free row
Do While Not ActiveCell.FormulaR1C1 = ""
ActiveCell.Offset(-1, 0).Activate
Loop
'Add the page break
If ActiveCell.FormulaR1C1 <> "Site ID" Then
ActiveCell.Offset(1, 0).Activate
shtDeliveryVariance.HPageBreaks.Add ActiveCell
End If
Loop
One pass and more elegant too. But how much quicker is it? On the small test is takes 54 seconds compared to the original 45 seconds, and on the larger test my code is slower again at 153 to 130 seconds. And this is averaged over 3 runs too.
So my questions are: Why is my newer code so much slower than the original despite mine looking faster and what can I do to speed up the slowness of the code?
Note: Screen.Updating, etc. is already off as is Calculation etc.
Polundra_Pi
Гость |
Доброго воремени суток! |
||
|
HandKot
Молодой специалист
|
может создать процедуру, которая и будет писать эти строки public sub CreateHeader(i as integer) public sub Main() |
||
I Have Nine Lives You Have One Only |
Polundra_Pi
Гость |
может создать процедуру, которая и будет писать эти строки public sub CreateHeader(i as integer) public sub Main() Спасибо, что откликнулись! |
||
|
Sla
Команда клуба
|
HPageBreaks — это коллекция |
||
Мы все учились понемногу… Чему-нибудь и как-нибудь. |
Polundra_Pi
Гость |
HPageBreaks — это коллекция Если я Вас правильно понял, то в цикле по организациям после того как заполнена отчетная таблица для i-ой организации на i-ом Листе нужно вставить цикл типа |
||
|
Sla
Команда клуба
|
Polundra_Pi, ты предложил, ты и пробуй |
||
Мы все учились понемногу… Чему-нибудь и как-нибудь. |
Polundra_Pi
Гость |
Polundra_Pi, ты предложил, ты и пробуй Я-то пробую, только затрудняюсь получить конкретный результат ведь возле &P и &N мешает символ |
||
|
HandKot
Молодой специалист
|
может тогда использовать св-во xlSheet.HPageBreaks.Count тогда получим Public Sub Report() iPage = 1 ‘добавляем новый лист для отчета ‘ Фомируем отчет ‘ выбираем номер страницы для следующего отчета |
||
I Have Nine Lives You Have One Only |
HandKot
Молодой специалист
|
И по проще,сорри, как програмно послать на печать содержимое всех Листов сразу без цикла для печати по листам, одной коммандой. вероятно Workbook.PrintOut |
||
I Have Nine Lives You Have One Only |
Polundra_Pi
Гость |
Я счас протестирую, возможно что-то выйдет, если возникнут какие-то трудности и у Вас, уважаемые учасники Форума будет желание и свободная минутка, чтобы их разрешить, то я сообщу о |
||
|
Polundra_Pi
Гость |
Не хочу огорчать помагающих, но идея с iPage не работает, особо привело в удивление другое |
||
|
Sla
Команда клуба
|
код в студию |
||
Мы все учились понемногу… Чему-нибудь и как-нибудь. |
Polundra_Pi
Гость |
код в студию Нима проблем, там ничего особенного нету и код не составляет гостайну, так что я могу Sub Click(Source As Button) Dim wos As New NotesUIWorkspace Dim column As NotesViewColumn Torg=uidoc.document.orgs(0) If Torg=»» Then Exit Sub Set view = db.GetView( «Osobisti» ) ‘Название вида в котором хранится доки, с которых циклом Вайл … Енд Вайл выбираются отчётные данные If EWindow Is Nothing Then EWindow.Caption=»ПЕРЕЧЕНЬ ПО ОРГАНИЗАЦИЯМ» ‘Заголовок Эксель-окна If ( sh>3 ) Then ‘Добавляем новый Лист новый, когда sh>3, ведь три Листа уже есть Если будут какие-то предложения, замечания, то, по возможномти, сообщите |
||
|
HandKot
Молодой специалист
|
page0=ws.HPageBreaks.Count+1 ‘Вот собственно то, что было предложено Помагающим а если хорошенько подумать и заменить на page0=ws.HPageBreaks.Count+page0 вот мой тестовый макрос Public Sub Report() iPage = 1 ‘добавляем новый лист для отчета ‘ Фомируем отчет ‘ выбираем номер страницы для следующего отчета только надо колонтилул поменять, а то пишет 8 страница из 2 |
||
I Have Nine Lives You Have One Only |
HandKot
Молодой специалист
|
дополнения If ( sh>3 ) Then ‘Добавляем новый Лист новый, когда sh>3, ведь три Листа уже есть не факт, у меня, к примеру, только 1 лист. set ws=EWindow.Sheets.Add With EWindow.Workbooks(1).Worksheets(sh).PageSetup заменить на With ws.PageSetup вообще не использовать конструкцию EWindow.Workbooks(1).Worksheets(sh) раз получили объект листа set ws=EWindow.Sheets.Add то и работать с ним Set WrkBk=EWindow.Workbooks.Add то и работать с ним А также почему-то у меня с Листа4 перескакиевает на Лист3 и начинает там выводить отчёт для организации №4. ЗЫЖ ИМХО |
||
I Have Nine Lives You Have One Only |
Polundra_Pi
Гость |
Спасибо!, за то, что как говорится на связи |
||
|
HandKot
Молодой специалист
|
iPage = iPage + xlSheet.HPageBreaks.Count насколько я понял считает кол-во всех разрывов page0 = page0 + ws.HPageBreaks.Count на этой строке поставьте бреакпоинт и проверяйте изменяется ли page0 |
||
I Have Nine Lives You Have One Only |
Polundra_Pi
Гость |
С листами сделал как Вы рекомендовали, определик ексель-книгу перед цикло Фоал |
||
|
Polundra_Pi
Гость |
Счас буду испробовать |
||
|
HandKot
Молодой специалист
|
тута проверил .FirstPageNumber = page0 |
||
I Have Nine Lives You Have One Only |
Polundra_Pi
Гость |
тута проверил .FirstPageNumber = page0 Тоесть надо будет только указать FirstPageNumber только для самого первого Листа, |
||
|
HandKot
Молодой специалист
|
Тоесть надо будет только указать FirstPageNumber только для самого первого Листа, да перед печатью задайте такие команды Set ws = ThisWorkbook.Worksheets(1) и остальные будут по порядку Еще интересно такое можно как-то специфицески настроить Эксель может быть через конфигурационные файлы, чтобы выводилось не три и не четыре, а напр, с 25 Листов. а это не понял |
||
I Have Nine Lives You Have One Only |
Polundra_Pi
Гость |
Я имел ввиду, чтобы есле создать пустой эксель-файл, то чтобы в нем присутствовали по умолчанию Литст1, Лист2, …., и тд до Лист25, ведь нареное как-то можно так сделать, просто поинтересовался. |
||
|
HandKot
Молодой специалист
|
Я имел ввиду, чтобы есле создать пустой эксель-файл, то чтобы в нем присутствовали по умолчанию Литст1, Лист2, …., и тд до Лист25, ведь нареное как-то можно так сделать, просто поинтересовался. Сервис-Параметры вкладка Общие-Листов в новой книге О, и еще Эксель добавляет Листы как-то вроде неправильно. Ну напр., Если Стать на Лист3 и Добавить Лист4, то он будет стоять не после Листа3, а перед ним. А также неясно почему, когда удалить все Листы (было их скажем 6 штук), за исключением одного какого-то, напр., Лита1, а потом добавить, то появится не Лист2, а Лист7. Эксель получается где-то хранит имена даже удалённых Листов? скорее хранит не имена листов а некий счетчик, который добавляется к имени листа ЗЫЖ я всегда листы переименовываю |
||
I Have Nine Lives You Have One Only |
Polundra_Pi
Гость |
Нашол вкладку есть такая, у меня тоже Excel XP, если это Excel 2002 имеется ввиду. |
||
|
Sla
Команда клуба
|
у sheets есть свойство name |
||
Мы все учились понемногу… Чему-нибудь и как-нибудь. |
Polundra_Pi
Гость |
Доброго времени суток, уважаемые учасники Форума! If (ws.Cells(10, 1).Value=»») Then Но перед удалением Эксель выдает сообщение о том, что Лист может содержать данные, если хотите его удалить, то нажлите Удалить. Можно ли делать как-то сделать, чтобы подобное сообщение не выскакивало, а то юзеря не любят когда много раз надо кнопки нажимать |
||
|
Sla
Команда клуба
|
This example deletes Sheet3 in the active workbook without displaying the confirmation dialog box. Application.DisplayAlerts = False |
||
Мы все учились понемногу… Чему-нибудь и как-нибудь. |
Polundra_Pi
Гость |
Спасибо! |
||
|
In this Article
- Page Break View Mode
- Insert Page Breaks
- Delete Page Break
- Move Page Breaks
- Reset Page Breaks
- Hide Page Breaks in Normal View
- Page Breaks – VBA
If you don’t manually set Page Breaks, Excel will do it’s best to set appropriate Page Breaks. However, if you’ve ever tried to print an Excel spreadsheet, you know it generally does not do a good job.
Any time you print a spreadsheet you should review and edit the Page Breaks before printing.
Page Break View Mode
Because page breaks are not shown by default in Excel, you will want to switch to Page Break Preview view mode in order to work effectively with them.
To switch from Normal View to Page Break Preview, activate the View Ribbon Menu. Then select Page Break Preview (ALT > W > I).
Below is an example of what the view looks like. A dashed line represents an automatic page break whereas solid lines stand for manual page breaks.
Tip: To go back to Normal View, go to View Ribbon > Normal (directly next to Page Break Preview) (ALT > W > L).
<!–Ads3–>
Insert Page Breaks
To insert a row (horizontal) page break, highlight the row directly below where you want to place the break. Then navigate to the Layout Ribbon Menu and select Breaks > Insert Page Break (ALT > P > B > I).
Result:
Tip: The SHIFT + SPACE shortcut allows you to conveniently select an entire row.
Follow the same steps to insert a column (vertical) Page Break. Select the column directly to the right of where you want to place your break. Then go to Page Layout > Breaks > Insert Page Break (ALT > P > B > I).
Tip: The CTRL + SPACE shortcut allows you to conveniently select an entire column.
Delete Page Break
To delete page breaks you can use almost exact same steps as if you were to insert one. Select the row below or column to the right of the page break and perform these steps:
Under the Page Layout Ribbon Menu, select Breaks then Remove Page Break (ALT > P > B > R)
Note: Automatic page breaks cannot be deleted
Move Page Breaks
If you happen to mess up where you placed your breaks, don’t fret. You can simply move them to the desired location.
Activate Page Break Preview (ALT > W > I), and simply hover over any page break lines until the <-> shows up then drag it to the desired location.
Warning: If you happen to move an automatic page break, it will turn into its manual counterpart.
<!–Ads1–>
Reset Page Breaks
Sometimes, you want to reset all of the Page Breaks in a worksheet..
On the ribbon, head back to where you would insert a page break and select the reset option (ALT > P > B > A)
Hide Page Breaks in Normal View
Page breaks may appear in Normal View Mode; they can be useful or an eye sore. To hide them, follow these steps:
Click the File tab on the ribbon then select Options on the left menu:
Then navigate to the Advanced subtab in the left menu. Scroll down to Display options for this worksheet and unselect Show Page Breaks.
<!–Ads2–>
Page Breaks – VBA
Everything mentioned above can also be accomplished using VBA using these code examples:
‘Add Row Page Break
Worksheets("Sheet1").Rows(40).PageBreak = xlPageBreakManual
‘Add Column Page Break
Worksheets("Sheet1").Columns("Z").PageBreak = xlPageBreakManual
‘Clear Row Page Break
Worksheets("Sheet1").Rows(40).PageBreak = xlPageBreakNone
‘Clear Column Page Break’
Worksheets("Sheet1").Columns("Z").PageBreak = xlPageBreakNone
‘Set Activesheet to Page Break Preview Mode
ActiveWindow.View = xlPageBreakPreview
‘Restore Activesheet to Normal View Mode
ActiveWindow.View = xlNormalView