Экономия бумаги при печати. Вопрос специалистам.
Модератор: Naeel Maqsudov
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
Я формирую в Excel на одном листе множество (около 300) документов.
Один документ может занимать от 5 строк до нескольких листов печати.
Если документ занимает более одного листа печати он начинается с нового физического листа.
При этом возможна печать на дуплексном принтере. Разумеется разные документы не могут печататься на обороте листа. На нём можно печатать только продолжение документа.
Цель - экономия бумаги при регулярной печати. Сформированные документы печатаются все сразу.
Прошу срочно откликнуться тех, кто реально решал подобные проблемы.
Один документ может занимать от 5 строк до нескольких листов печати.
Если документ занимает более одного листа печати он начинается с нового физического листа.
При этом возможна печать на дуплексном принтере. Разумеется разные документы не могут печататься на обороте листа. На нём можно печатать только продолжение документа.
Цель - экономия бумаги при регулярной печати. Сформированные документы печатаются все сразу.
Прошу срочно откликнуться тех, кто реально решал подобные проблемы.
-
- Сообщения: 153
- Зарегистрирован: 11 июл 2005, 13:42
- Откуда: Крым, Алушта
- Контактная информация:
Вопросы:
1. Кол-во строк "от 5..." для каждого конкретного документа меняется во времени? т.е. сегодня док1 имел 5 строк, а завтра - 300 строк, послезавтра -15 строк?
2. Имеется ли признак окончания документа?
3. Все ли документы должны печататься вертикально\горизонтально и если нет, то есть ли признак нужного направления печати?
4. если два (и более) последовательных документов имеют суммарное колво строк (с шапкой и подвалом) менее, чем может попасть на один лист, то обязательно ли их печатать на отдельных листах?
1. Кол-во строк "от 5..." для каждого конкретного документа меняется во времени? т.е. сегодня док1 имел 5 строк, а завтра - 300 строк, послезавтра -15 строк?
2. Имеется ли признак окончания документа?
3. Все ли документы должны печататься вертикально\горизонтально и если нет, то есть ли признак нужного направления печати?
4. если два (и более) последовательных документов имеют суммарное колво строк (с шапкой и подвалом) менее, чем может попасть на один лист, то обязательно ли их печатать на отдельных листах?
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
если послать на дуплекс "всю книгу" он будет каждый Лист печатать с новой страницы

- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
Дионис,
1. Речь идёт о ежемесячных отчётах по междугородним телефонным звонкам, раздаваемых разным организациям. Соответственно - количество каждый месяц разное. Кто-то может и вообще не позонить ни разу. Тогда документ не формируем.
2. Строка "Итого по договору"
3. Все документы печатаются вертикально.
4. Однозначно печатаем на одном листе. (Я хочу уйти от ситуации, что бы документ
потенциально умещающийся на одном физ. листе, печатался на двух
Игорь Акопян, как заметил Дионис, все документы действительно на одном листе Excel.
Пока идеи такие:
1. Cначала выбираем и печатаем с двух сторон документы большие физического листа. Каждый, естественно, c новой страницы.
2. Остаток печатаем с одной стороны (все равно резать). Остаётся решить оптимизационную задачу: На лист умещается M строк. Есть K документов с "длинами"
L(1) ... L(K). Нужно сформировать последовательность документов, такую что бы
сумма "длин" документов на одном листе была <= M и количество листов было минимально
Очевидно, что это не оптимальная стратегия
1. Для многостраничных документов из п.1 последнюю страницу можно/нужно
добивать короткими документами.
2. Короткий документ то же можно напечатать с 2-х сторон если количество строк в нём больше некоего числа N (постоянного для задачи). Ну что бы совсем уж узкие
ленточки по 1 строке с каждой стороны не делать ...
1. Речь идёт о ежемесячных отчётах по междугородним телефонным звонкам, раздаваемых разным организациям. Соответственно - количество каждый месяц разное. Кто-то может и вообще не позонить ни разу. Тогда документ не формируем.
2. Строка "Итого по договору"
3. Все документы печатаются вертикально.
4. Однозначно печатаем на одном листе. (Я хочу уйти от ситуации, что бы документ
потенциально умещающийся на одном физ. листе, печатался на двух
Игорь Акопян, как заметил Дионис, все документы действительно на одном листе Excel.
Пока идеи такие:
1. Cначала выбираем и печатаем с двух сторон документы большие физического листа. Каждый, естественно, c новой страницы.
2. Остаток печатаем с одной стороны (все равно резать). Остаётся решить оптимизационную задачу: На лист умещается M строк. Есть K документов с "длинами"
L(1) ... L(K). Нужно сформировать последовательность документов, такую что бы
сумма "длин" документов на одном листе была <= M и количество листов было минимально
Очевидно, что это не оптимальная стратегия

1. Для многостраничных документов из п.1 последнюю страницу можно/нужно
добивать короткими документами.
2. Короткий документ то же можно напечатать с 2-х сторон если количество строк в нём больше некоего числа N (постоянного для задачи). Ну что бы совсем уж узкие
ленточки по 1 строке с каждой стороны не делать ...

- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
пардон, сбила фраза "Если документ занимает более одного листа печати он начинается с нового физического листа"

Если исходить из предположения, что каждый новый документ (кроме самого первого, естественно) обязательно имеет перед своей первой строкой принудительно вставленный разрыв страницы, то можно попробовать следующую идею.
Принтер должен быть сразу установлен в дуплекс.
Далее макросом.
1. Пробежать по всем HpageBreaks и вычленить из них те, что вставлены вручную.
2. Распечатывать каждый документ отдельно, а именно только то, что находится между ручными HpageBreaks. Это можно сделать двумя способами:
А) Скрывать прочие строки, оставляя видимыми только строки очередного нужного документа.
Б) Задавая каждый раз область печати в виде области текущего документа.
Далее представлены оба кода.
Способ А
Способ Б
Замечания по способу А.
Неимоверная глючность HpageBreaks. Часть кода и есть попытка борьбы с непредсказуемостью и непостоянностью работы HpageBreaks. А именно:
и
и даже в этом случае иногда на строке с HpageBreaks(i) выскакивает ошибка выполнения '9', хотя явно индекс не выходит за пределы допустимого диапазона.
Если у кого есть способ решения этой проблемки, то расскажите.
Замечания по способу Б
Для последнего документа не смог точно определить последней страницы печати. Методы
и
не дают однозначно номер последнего столбца, который будет именно распечатываться, т.к. UsedRange даёт значение всей используемой области (напр., если изменён формат ячейки - шрифт, но в ней нет данных, то они не будут выводиться на печать), а SpecialCells(xlLastCell) даёт последнюю ячейку с данными (а если ниже есть, напр., закрашенная ячейка, то она выведется на печать). Т. е. с UsedRange последний документ может распечатываться с лишними пустыми страницами, а с SpecialCells(xlLastCell) может в конце не распечататься какая-нибудь закрашенная или обрамлённая ячейка.
Так что по этой проблемке тоже, может быть, у кого-то есть соображения.
Принтер должен быть сразу установлен в дуплекс.
Далее макросом.
1. Пробежать по всем HpageBreaks и вычленить из них те, что вставлены вручную.
2. Распечатывать каждый документ отдельно, а именно только то, что находится между ручными HpageBreaks. Это можно сделать двумя способами:
А) Скрывать прочие строки, оставляя видимыми только строки очередного нужного документа.
Б) Задавая каждый раз область печати в виде области текущего документа.
Далее представлены оба кода.
Способ А
Код: Выделить всё
Sub DuplPrn_HiddRows()
Dim MHPBR(1 To 65536, 1 To 2) As Variant
Dim CurScrlR, LastRow
Dim N, m, i
Application.ScreenUpdating = True
CurScrlR = ActiveWindow.ScrollRow
LastRow = ActiveSheet.UsedRange.Rows(1).Row + ActiveSheet.UsedRange.Rows.Count - 1
ActiveWindow.ScrollRow = 1
ActiveWindow.ScrollRow = LastRow
ActiveWindow.ScrollRow = CurScrlR
N = ActiveSheet.HPageBreaks.Count
m = 0
For i = 1 To N
If ActiveSheet.HPageBreaks(i).Type = xlPageBreakManual Then
m = m + 1
MHPBR(m, 1) = ActiveSheet.HPageBreaks(i).Location.Row
MHPBR(m, 2) = i
End If
Next
If m > 0 Then
For i = m To 1 Step -1
CurScrlR = ActiveWindow.ScrollRow
LastRow = ActiveSheet.UsedRange.Rows(1).Row + ActiveSheet.UsedRange.Rows.Count - 1
ActiveWindow.ScrollRow = 1
ActiveWindow.ScrollRow = LastRow
ActiveWindow.ScrollRow = CurScrlR
N = ActiveSheet.HPageBreaks.Count
ActiveSheet.HPageBreaks(MHPBR(i, 2)).Delete
Next
For i = 1 To m + 1
If i = 1 Then
Range(MHPBR(i, 1) & ":65536").EntireRow.Hidden = True
ElseIf i = m + 1 Then
Range("1:" & MHPBR(i - 1, 1) - 1).EntireRow.Hidden = True
Else
Range("1:" & MHPBR(i - 1, 1) - 1 & "," & MHPBR(i, 1) & ":65536").EntireRow.Hidden = True
End If
ActiveSheet.PrintOut
Cells.EntireRow.Hidden = False
Next
For i = m To 1 Step -1
ActiveSheet.HPageBreaks.Add Cells(MHPBR(i, 1), 1)
Next
Else
ActiveSheet.PrintOut
End If
End Sub
Код: Выделить всё
Sub DuplPrn_PrnArea()
Dim MHPBR(1 To 65536, 1 To 2) As Variant
Dim CurScrlR, LastRow
Dim N, m, i
CurScrlR = ActiveWindow.ScrollRow
LastRow = ActiveSheet.UsedRange.Rows(1).Row + ActiveSheet.UsedRange.Rows.Count - 1
ActiveWindow.ScrollRow = 1
ActiveWindow.ScrollRow = LastRow
ActiveWindow.ScrollRow = CurScrlR
N = ActiveSheet.HPageBreaks.Count
m = 0
For i = 1 To N
If ActiveSheet.HPageBreaks(i).Type = xlPageBreakManual Then
m = m + 1
MHPBR(m, 1) = ActiveSheet.HPageBreaks(i).Location.Row
MHPBR(m, 2) = i
End If
Next
If m > 0 Then
For i = 1 To m + 1
If i = 1 Then
ActiveSheet.PageSetup.PrintArea = "1:" & MHPBR(i, 1) - 1
ElseIf i = m + 1 Then
' ! ! ! ! Может быть некорретно задана область печати ! ! !
ActiveSheet.PageSetup.PrintArea = MHPBR(m, 1) & ":" & LastRow
Else
ActiveSheet.PageSetup.PrintArea = MHPBR(i - 1, 1) & ":" & MHPBR(i, 1) - 1
End If
ActiveSheet.PrintOut
Next
ActiveSheet.PageSetup.PrintArea = ""
Else
ActiveSheet.PrintOut
End If
End Sub
Замечания по способу А.
Неимоверная глючность HpageBreaks. Часть кода и есть попытка борьбы с непредсказуемостью и непостоянностью работы HpageBreaks. А именно:
Код: Выделить всё
Application.ScreenUpdating = True
Код: Выделить всё
CurScrlR = ActiveWindow.ScrollRow
LastRow = ActiveSheet.UsedRange.Rows(1).Row + ActiveSheet.UsedRange.Rows.Count - 1
ActiveWindow.ScrollRow = 1
ActiveWindow.ScrollRow = LastRow
ActiveWindow.ScrollRow = CurScrlR
Если у кого есть способ решения этой проблемки, то расскажите.
Замечания по способу Б
Для последнего документа не смог точно определить последней страницы печати. Методы
Код: Выделить всё
LastRow=ActiveSheet.UsedRange.Rows(1).Row+ActiveSheet.UsedRange.Rows.Count-1
Код: Выделить всё
lLastRow = ActiveCell.SpecialCells(xlLastCell).Row
Do While Application.CountA(Rows(lLastRow)) = 0 And lLastRow > 0
lLastRow = lLastRow - 1
Loop
Так что по этой проблемке тоже, может быть, у кого-то есть соображения.
Во блин, не уложился в 5000 символов на пост! :-)
Продолжаю тут.
По поводу установки дуплекса не предварительно, а в самом макросе.
Пробовал через SendKeys в различных вариантах. Но после появления окна свойств самого принтера SendKeys ничего не мог сделать. Как будто никакие клавиши не «нажимаются». Проверил на нескольких принтерах – везде одно и то же.
На другом форуме (http://forum.sources.ru/index.php?showtopic=166764) рассказано о установке дуплекса принтера через WinAPI (не знаю, что это такое). Но только для Word. Там (в Word) эта штука работает, но для Excel я её адаптировать не смог, ибо совершенно в этом не разбираюсь. Если у кого получится, выложите код тут.
Продолжаю тут.
По поводу установки дуплекса не предварительно, а в самом макросе.
Пробовал через SendKeys в различных вариантах. Но после появления окна свойств самого принтера SendKeys ничего не мог сделать. Как будто никакие клавиши не «нажимаются». Проверил на нескольких принтерах – везде одно и то же.
На другом форуме (http://forum.sources.ru/index.php?showtopic=166764) рассказано о установке дуплекса принтера через WinAPI (не знаю, что это такое). Но только для Word. Там (в Word) эта штука работает, но для Excel я её адаптировать не смог, ибо совершенно в этом не разбираюсь. Если у кого получится, выложите код тут.
Добрый день, просмотрев сообщения в этой теме понял что остро стоит вопрос экономии средств на печати... Сейчас как раз рассматриваю один проект и готов предложить решение проблемы экономии печати. Есть один такой лицензионный продукта - разработка израильской компании компании “Preton” который поможет Вам: сократить затраты на расходные материалы до 50%. Совместим продукт с 98% принтеров и МФУ, интеграция с MS Active Directory, Поддержка драйверов печати PCL и PostScript, любых терминальных решений, легкая интеграция в инфраструктуру Microsoft.
-ОТЧЕТЫ ПО СТОИМОСТИ ПЕЧАТИ
-ОТЧЕТЫ ПО ИСПОЛЬЗОВАНИЮ ПРИНТЕРОВ
-ОТЧЕТЫ ПО ПОЛЬЗОВАНИЮ ПРИЛОЖЕНИЯМИ
-ОТЧЕТЫ ПО ПЕЧАТНОЙ АКТИВНОСТИ ПОЛЬЗОВАТЕЛЕЙ И ГРУПП ПОЛЬЗОВАТЕЛЕЙ
-ПОИСК ПО НАПЕЧАТАННЫМ ДОКУМЕНТАМ…
Возможность разрешения печати из выбранных приложений, только выбранным пользователям
Разрешение на цветную печать только выбранным пользователям
Возможность назначения лимитированного количества страниц цветной/ монохромной печати в день/неделю/месяц
Возможность принудительного применения настройки двусторонней печати
Возможность сжатия двух страниц в одну
Возможность принудительного применения монохромной печати для выбранных пользователей
Возможность разрешения печати графики и картинок для выбранных пользователей
Возможность проставления водных знаков на распечатанных документах
если кого заинтересовало, стучите в асю 243523916 , объясню что к чему
-ОТЧЕТЫ ПО СТОИМОСТИ ПЕЧАТИ
-ОТЧЕТЫ ПО ИСПОЛЬЗОВАНИЮ ПРИНТЕРОВ
-ОТЧЕТЫ ПО ПОЛЬЗОВАНИЮ ПРИЛОЖЕНИЯМИ
-ОТЧЕТЫ ПО ПЕЧАТНОЙ АКТИВНОСТИ ПОЛЬЗОВАТЕЛЕЙ И ГРУПП ПОЛЬЗОВАТЕЛЕЙ
-ПОИСК ПО НАПЕЧАТАННЫМ ДОКУМЕНТАМ…
Возможность разрешения печати из выбранных приложений, только выбранным пользователям
Разрешение на цветную печать только выбранным пользователям
Возможность назначения лимитированного количества страниц цветной/ монохромной печати в день/неделю/месяц
Возможность принудительного применения настройки двусторонней печати
Возможность сжатия двух страниц в одну
Возможность принудительного применения монохромной печати для выбранных пользователей
Возможность разрешения печати графики и картинок для выбранных пользователей
Возможность проставления водных знаков на распечатанных документах
если кого заинтересовало, стучите в асю 243523916 , объясню что к чему
- Busine2009
- Сообщения: 322
- Зарегистрирован: 18 июл 2009, 15:34
- Контактная информация:
Может я не в тему, но вот ссылка, где я писал про 2-х стороннюю печать в Excel
http://www.cyberforum.ru/vba/thread44328.html
http://www.cyberforum.ru/vba/thread44328.html