Экономия бумаги при печати. Вопрос специалистам.

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Я формирую в Excel на одном листе множество (около 300) документов.
Один документ может занимать от 5 строк до нескольких листов печати.
Если документ занимает более одного листа печати он начинается с нового физического листа.
При этом возможна печать на дуплексном принтере. Разумеется разные документы не могут печататься на обороте листа. На нём можно печатать только продолжение документа.
Цель - экономия бумаги при регулярной печати. Сформированные документы печатаются все сразу.
Прошу срочно откликнуться тех, кто реально решал подобные проблемы.
Дионис
Сообщения: 153
Зарегистрирован: 11 июл 2005, 13:42
Откуда: Крым, Алушта
Контактная информация:

Вопросы:
1. Кол-во строк "от 5..." для каждого конкретного документа меняется во времени? т.е. сегодня док1 имел 5 строк, а завтра - 300 строк, послезавтра -15 строк?

2. Имеется ли признак окончания документа?

3. Все ли документы должны печататься вертикально\горизонтально и если нет, то есть ли признак нужного направления печати?

4. если два (и более) последовательных документов имеют суммарное колво строк (с шапкой и подвалом) менее, чем может попасть на один лист, то обязательно ли их печатать на отдельных листах?
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

если послать на дуплекс "всю книгу" он будет каждый Лист печатать с новой страницы
Изображение
Дионис
Сообщения: 153
Зарегистрирован: 11 июл 2005, 13:42
Откуда: Крым, Алушта
Контактная информация:

так ведь автор и не предполагает делить документы по Листам, они все 300 штук на одном Листе
Аватара пользователя
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 строке с каждой стороны не делать ... ;)
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

пардон, сбила фраза "Если документ занимает более одного листа печати он начинается с нового физического листа"
Изображение
tolikt
Сообщения: 93
Зарегистрирован: 29 окт 2005, 12:33
Откуда: NewVasюbirsk

Если исходить из предположения, что каждый новый документ (кроме самого первого, естественно) обязательно имеет перед своей первой строкой принудительно вставленный разрыв страницы, то можно попробовать следующую идею.

Принтер должен быть сразу установлен в дуплекс.
Далее макросом.
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
и даже в этом случае иногда на строке с HpageBreaks(i) выскакивает ошибка выполнения '9', хотя явно индекс не выходит за пределы допустимого диапазона.
Если у кого есть способ решения этой проблемки, то расскажите.

Замечания по способу Б
Для последнего документа не смог точно определить последней страницы печати. Методы

Код: Выделить всё

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
не дают однозначно номер последнего столбца, который будет именно распечатываться, т.к. UsedRange даёт значение всей используемой области (напр., если изменён формат ячейки - шрифт, но в ней нет данных, то они не будут выводиться на печать), а SpecialCells(xlLastCell) даёт последнюю ячейку с данными (а если ниже есть, напр., закрашенная ячейка, то она выведется на печать). Т. е. с UsedRange последний документ может распечатываться с лишними пустыми страницами, а с SpecialCells(xlLastCell) может в конце не распечататься какая-нибудь закрашенная или обрамлённая ячейка.
Так что по этой проблемке тоже, может быть, у кого-то есть соображения.
tolikt
Сообщения: 93
Зарегистрирован: 29 окт 2005, 12:33
Откуда: NewVasюbirsk

Во блин, не уложился в 5000 символов на пост! :-)
Продолжаю тут.

По поводу установки дуплекса не предварительно, а в самом макросе.
Пробовал через SendKeys в различных вариантах. Но после появления окна свойств самого принтера SendKeys ничего не мог сделать. Как будто никакие клавиши не «нажимаются». Проверил на нескольких принтерах – везде одно и то же.
На другом форуме (http://forum.sources.ru/index.php?showtopic=166764) рассказано о установке дуплекса принтера через WinAPI (не знаю, что это такое). Но только для Word. Там (в Word) эта штука работает, но для Excel я её адаптировать не смог, ибо совершенно в этом не разбираюсь. Если у кого получится, выложите код тут.
A.Zharkov
Сообщения: 1
Зарегистрирован: 06 авг 2009, 16:10

Добрый день, просмотрев сообщения в этой теме понял что остро стоит вопрос экономии средств на печати... Сейчас как раз рассматриваю один проект и готов предложить решение проблемы экономии печати. Есть один такой лицензионный продукта - разработка израильской компании компании “Preton” который поможет Вам: сократить затраты на расходные материалы до 50%. Совместим продукт с 98% принтеров и МФУ, интеграция с MS Active Directory, Поддержка драйверов печати PCL и PostScript, любых терминальных решений, легкая интеграция в инфраструктуру Microsoft.

-ОТЧЕТЫ ПО СТОИМОСТИ ПЕЧАТИ
-ОТЧЕТЫ ПО ИСПОЛЬЗОВАНИЮ ПРИНТЕРОВ
-ОТЧЕТЫ ПО ПОЛЬЗОВАНИЮ ПРИЛОЖЕНИЯМИ
-ОТЧЕТЫ ПО ПЕЧАТНОЙ АКТИВНОСТИ ПОЛЬЗОВАТЕЛЕЙ И ГРУПП ПОЛЬЗОВАТЕЛЕЙ
-ПОИСК ПО НАПЕЧАТАННЫМ ДОКУМЕНТАМ…



Возможность разрешения печати из выбранных приложений, только выбранным пользователям
Разрешение на цветную печать только выбранным пользователям
Возможность назначения лимитированного количества страниц цветной/ монохромной печати в день/неделю/месяц
Возможность принудительного применения настройки двусторонней печати
Возможность сжатия двух страниц в одну
Возможность принудительного применения монохромной печати для выбранных пользователей
Возможность разрешения печати графики и картинок для выбранных пользователей
Возможность проставления водных знаков на распечатанных документах

если кого заинтересовало, стучите в асю 243523916 , объясню что к чему
Аватара пользователя
Busine2009
Сообщения: 322
Зарегистрирован: 18 июл 2009, 15:34
Контактная информация:

Может я не в тему, но вот ссылка, где я писал про 2-х стороннюю печать в Excel
http://www.cyberforum.ru/vba/thread44328.html
Ответить