Страницы: 1
RSS
Двухсторонняя печать средствами VBA (Переключение дуплекса)
 
Постараюсь изложить проблему не вдаваясь в ненужные детали.  
Я уже несколько лет пишу простенький софт на VBA для заполнения налоговых деклараций. Excel + VBA позволяют быстренько состряпать ново введенную форму, а сроки, это для меня главное.  
Идет много печати, и в процессе нужно отправлять одни задания с дуплексом, другие просто на одной стороне. У команды PrintOut нет параметров выбора дуплекса. Да и простого пути тут тоже нет. Сейчас пользуюсь прогой FinePrint. Отправляю печать на нее, а она может перенаправить на выбранный принтер с указанием флага дуплекса. Способ не полностью автоматизировал работу. Оператору нужно каждый раз выбирать, печатать с дуплексом или без.  
 
Вчера удалось найти еще одно временное решение. Добавил нововведение в программу. Все получилось. Дуплекс нормально работает. Были редкие несрабатывания, но задержка в одну секунду даже простым способом Application.Wait исправила положение.  
Что получилось найти:  
Есть два способа переключить дуплекс. Первый полностью на VBA, второй использует стороннюю dll библиотеку.  
У этих способов есть общий минус. Они меняют параметры принтера не в Excel, а общие (Пуск -> Принтеры). Это конечно неудобство, но можно мириться. Оба способа рабочие, но столкнулся с такой проблемой. Я не могу поменять дуплекс у принтера, если он выбран активным в Excel (2003). То есть поменять то я могу, и после запуска VBA дуплекс действительно переключится, и это можно увидеть открыв свойства принтера из проводника Windiws, но не из Excel. Нашел только следующее решение:  
- Делаем нужный принтер не активным (выбираем любой другой).  
- Переключаем дуплекс нужному принтеру  
- Выбираем его активным.  
Тогда настройки будут прочитаны. Способ тоже не очень, но он пока единственный.  
Я прикладываю примеры в файле, чтобы не раздувать тему тут.  
В примере есть еще разные модуля, думаю они будут интересны тем, кто изучает тему печати.  
Хотелось бы обсудить модуль PrinterDuplexVBA Function TestPrinter()  
Неплохо бы было изменять не общие настройки драйвера а только настройки активного принтера Excel, чтобы это не касалось других программ.  
 
Смотрите в моем файле модуль PrinterDuplexVBA. Там две функции. Это все что надо для работы.  
Функция TestPrinter запускает функцию SetPrinterDuplex.
 
У кого-нибудь получилось воспользоваться этим советом?  
 
Макрос из модуля PrinterDuplexDLL вообще не запускается... Ошибка на Set pd = CreateObject("printerduplex.class1")  
 
В модуле PrinterDuplexPrintui с макросом так и не разобрался: не смог грамотно запустить. На Shell "rundll32 ..." появляется окно с предупреждением "... введено неправильное имя принтера...". Примерно ясно, что надо что-то написать в файл C:\Duplex.dat, а что именно?  
 
Макрос из модуля PrinterDuplexVBA запускается, но принтер в дуплекс не устанавливается. Зато хоть срабатывает фишка, что если у принтера нет вообще дуплекса, то выскакивает окно с предупреждением.  
 
Макрос из модуля Порты_Имена работает - список принтеров выдаёт. Вот только если принтеров много (у меня более 15 в RemoteDesktop), то на 14-17 принтере вылетает ошибка на предпредпоследней строке:    
aPrn(n) = aPrn(n) & " (" & Mid(sBuf, InStr(sBuf, ",") + 1, lRet - InStr(sBuf, ",") - 1) & ":)"  
Ошибку можно обойти, ограничив цикл.  
 
 
Вообще, есть ли у кого рабочий способ из макроса запустить двухстороннюю печать?  
Т.е. идея очевидная: если число страниц больше 1, то печатать на обеих сторонах.  
 
Пробовал и через SendKeys... Но почему-то каждый раз результат получается совсем разный...В окне свойств принтера некоторые "нажатия" то срабатывают, то нет...  
 
 
Теоретически можно двухстороннюю печать и вообще не выключать: если данные входят только на одну страницу, то и напечатается только одна. Правда, это только при условии, что число копий тоже равно 1.  
Для этого я устанавливал в систему 2 одинаковых принтера, второй из них по умолчанию ставился в дуплекс. И в макросе, если нужна была двухсторонняя печать, то посылал на второй принтер. Но это всё глючно и работает только локально. А на других рабочих местах, где используется файл с макросом, ясное дело, второй принтер с нужными настройками установить не получится... А уж если надо выбирать портрет/ландшафт, то вообще заморочно...  
 
PS. Все отсылки в поиск - посылаются...    
Утверждаю: за много лет не нашёл нигде нормально работающих макросов для простой двухсторонней печати! Обязательно возникают какие-нибудь подводные камни...
 
Так у меня и получилось :)  
 
Проблема двухсторонней печати из Офиса активно обсуждается с 2007 года. Да может и ранее, не суть. Но до сих пор решения нет. А нет его потому, что Офис не работал и не работает с настройками принтера. То что мы можем переключить при подготовке документа на печать, это свойства драйвера принтера, а не настройки Офиса.    
 
Теперь нужно уловить один важный момент: Офис при открытии считывает настройки принтера по умолчанию. Структура DEVMODE.  
 
Скоро выложу примерчик по понятней, и будем разбираться.
 
Это переделанный первый пример. Убрано лишнее, добавлено интересное.  
 
Пример изменяет настройки драйвера принтера. И у него это отично получается. Но нужно изменять настройки текущего принтера в Ексел. Подробности в примере.  
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
 
Вы чего прикалывайтесь? 118 килобайт всего файл был.
 
Вы хотите сказать, что 118<100?
 
Юрий, ну даже зипом не сжать было меньше. Давайте лучше по теме, и не будем тут воду лить.  
Вот, постирал некоторое описание и пустые листы. Вы уж блесните знаниями по поставленному вопросу, чем файлы подрезать. Я бы с радостью почитал любые мысли и идеи.
 
{quote}{login=Багир}{date=05.10.2012 12:33}{thema=}{post}не будем тут воду лить.{/post}{/quote}Вот и не лейте - просто соблюдайте правила.
 
Обновил пример. Все комментарии в модуле PrinterDuplex. Пробуем, пишем любые идеи.
 
Тут все равно уже курилка а не ветка.  
Продолжение обсуждения темы http://www.planetaexcel.ru/forum.php?thread_id=46166&forum_id=129&page_forum=lastpage&allnum_forum=0#post369486  
Там все обобщено и убрано не нужное.
Страницы: 1
Читают тему
Наверх