Страницы: 1
RSS
Программно посчитать количество всех страниц (на печать) в книге Excel - VBA
 
Всем привет!
Задача:
Посчитать количество распечатанных листов книги Excel программно.
Элементарный вопрос как оказалось стал не столь тривиален (для меня).
Пришлось да же Загуглить :)
Собственно хочу поделится решением... но предлагаю сначала поделится вашим видинием решения данной задачи.
Файл прилагаю (нужно посчитать сколько листов распечатается).
Скрытый текст
Изменено: bedvit - 21.07.2017 13:50:12
«Бритва Оккама» или «Принцип Калашникова»?
 
Выложил и на КиберФоруме
«Бритва Оккама» или «Принцип Калашникова»?
 
Ну, решение "в лоб" (посчитал 23 страницы):
Скрытый текст
Изменено: Skif-F - 21.07.2017 14:34:19
 
Все верно  - 23 страницы.
В одном направлении мыслим... сначала пошел по совету Уокенбаха, через разделитель страниц
Код
PageCount = PageCount + (sht.HPageBreaks.Count + 1) * (sht.VPageBreaks.Count + 1)
Но этот путь оказался ошибочным.
Вот мое решение:
Скрытый текст

Вообщем-то все просто в итоге.
Изменено: bedvit - 21.07.2017 15:18:47
«Бритва Оккама» или «Принцип Калашникова»?
 
Путь был бы не ошибочным, если б конструкция sht.HPageBreaks.Count внезапно не просила бы костыля...
Код
Set sht = Sheets(1)
'_____________________________Вот костыль
sht.Activate
sht.UsedRange.Cells(sht.UsedRange.Count).Select
________________________________________
ТеперьПравильноеКолРазрывов = sht.HPageBreaks.Count

Если работать с одним листом, то ладно, но несколькими....  :D
 
А так правильно?
Код
Pages_Count = ExecuteExcel4Macro("GET.DOCUMENT(50)")
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Посчитать количество распечатанных листов книги Excel программно
Код
  iCountPages = ExecuteExcel4Macro("GET.DOCUMENT(50)")
 
Цитата
The_Prist написал:
А так правильно?
Kuzmich,
Да, отрабатывает правильно, на активном листе.
как-то так:
Код
Sub Pages_Count()
Dim Pages_Count As Long, sh
For Each sh In ThisWorkbook.Sheets 'ActiveWorkbook.Sheets
'Pages_Count = Pages_Count + sh.PageSetup.Pages.Count
sh.Activate: Pages_Count = Pages_Count + ExecuteExcel4Macro("GET.DOCUMENT(50)")
Next
MsgBox "Будет распечатано страниц: " & Pages_Count
End Sub
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
Вот мое решение:
Доброго дня
Столкнулся с такой же задачей, до печати, программно получить количество страниц, но не во всей книге целиком, а на конкретном листе, коих в книге много. Как бы оптимизировать Ваше решение под конкретный лист в книге?
 
Скажите пожалуйста, а как результат этого макроса вывести не сообщением, а чтобы эта цифра отображалась в определенной ячейке. ну например при нажатии созданной кнопки или автоматически?
 
Количество страниц на печать Excel
Согласие есть продукт при полном непротивлении сторон
 
Нет, вы не поняли, мне нужно чтобы в ячейке этого же файла отображалось количество страниц этого же файла.
Я  не могу понять куда в макросе написать строчку (и как она вообще должна выглядеть) чтобы результат подсчёта выводился в ячейку.

А пример (https://www.planetaexcel.ru/forum/?PAGE_NAME=message&FID=1&TID=169516&TITLE_...) оч нужный, взял в копилку!!
Изменено: Pierre_Killer_666 - 26.02.2025 16:18:53
 
Вот этот макрос

Sub Pages_Count()
Dim Pages_Count As Long, sh
For Each sh In ThisWorkbook.Sheets 'ActiveWorkbook.Sheets
'Pages_Count = Pages_Count + sh.PageSetup.Pages.Count
sh.Activate: Pages_Count = Pages_Count + ExecuteExcel4Macro("GET.DOCUMENT(50)")
Next
MsgBox "Будет распечатано страниц: " & Pages_Count
End Sub

супер! но мне не нужно чтобы сообщение, нужно чтобы прям в ячейке показалось.
 
Цитата
Pierre_Killer_666 написал:
нужно чтобы прям в ячейке показалось
Код
Sub Pages_Count()
Dim ws
For Each ws In ThisWorkbook.Sheets
ws.Activate
ws.Range("A1").Value = ExecuteExcel4Macro("GET.DOCUMENT(50)")
Next
End Sub

адрес "определенной" ячейки сами подставьте - нам Вы адрес не сказали :)
Изменено: Дмитрий(The_Prist) Щербаков - 26.02.2025 16:52:26
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Код
Sub Pages_Count()
Dim iSh As Worksheet
Dim arr()
Dim I&
ReDim arr(1 To ThisWorkbook.Worksheets.Count, 1 To 2)
For Each iSh In ThisWorkbook.Worksheets
  I = I + 1
  arr(I, 1) = iSh.Name
  arr(I, 2) = iSh.PageSetup.Pages.Count
Next
ThisWorkbook.Worksheets(1).Range("A1").Resize(I, 2) = arr
End Sub
Согласие есть продукт при полном непротивлении сторон
Страницы: 1
Читают тему
Наверх