Тема: Excel/VBA: Установка двухсторонней печати (Duplex print)
Пожалуйста помогите! Возможно ли с помощью кода VBA установить/снять двухсторонюю печать листа Excel. Если нет - то как открыть диалог Печать/Свойства.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Серый форум → Общение → VBA (Visual Basic for Applications) → Excel/VBA: Установка двухсторонней печати (Duplex print)
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Пожалуйста помогите! Возможно ли с помощью кода VBA установить/снять двухсторонюю печать листа Excel. Если нет - то как открыть диалог Печать/Свойства.
Kuryachev, в каком Excel такое есть? В 2003 — нет.
Нет, дуплекс можно указать в настройках принтера (не в excel'е) http://office.microsoft.com/en-us/word/ … 71033.aspx
Есть способ включения/выключения дуплекса http://www.mrexcel.com/forum/showthread.php?t=59285
Возможно вам будет интересен этот вариант (как альтернатива) http://www.vbforums.com/showpost.php?p= … ostcount=1
Нет, дуплекс можно указать в настройках принтера (не в excel'е) http://office.microsoft.com/en-us/word/ … 71033.aspx
Коллега, как раз этот, приведённый Вами, пример относится именно к возможностям самого приложения (WinWord), а не к настройкам драйвера принтера . А за ссылки — спасибо.
Настройки драйвера/принтера специфичны для конкретного драйвера/принтера, но есть возможность включить (в частности) дуплекс через winapi через структуры свойств драйвера/принтера. Я могу ошибаться, но если принтер поддерживает дуплекс, и он включён в настройках драйвера, то в диалоге печати появляется чекбокс "двухсторонняя печать", и по-моему, это "фича" не доступна из VBA.
OFF: max7, как раз для WinWord'а данный флажок обрабатывается им самим безо всякого участия драйвера принтера (что, конечно, не отменяет возможность задействовать не его, а возможность двусторонней печати через сам драйвер принтера, если тот поддерживает такую возможность). В данном случае, для WinWord'а это:
Application.PrintOut ManualDuplexPrint:=True
Печатается одна сторона листов (нечётная), затем он просит вынуть/повернуть/вставить листы, затем печатается вторая сторона листов (чётная).
Печатается одна сторона листов (нечётная), затем он просит вынуть/повернуть/вставить листы, затем печатается вторая сторона листов (чётная).
Ну это не дуплекс, это насмешка какая-то. Я предпочитаю управлять двусторонней печатью "в ручную": печатаю нечётные, затем выдаю диалог вроде "переверните/продолжать/отмена", печатаю чётные, и т.п.
P.S.: Самое интересное (я немного изучал это вопрос), что при "прямой печати" на принтер/спуллер (форматы к PCL, PostScript, и т.д. смотря какой поддерживает принтер, либо эмулятор в драйвере) в "текущем сеансе печати" задавать режимы печати очень просто (в winapi есть специальные методы ). Для PCL это по сути однобайтовая команда, для PS - вызов процедуры.
Я предпочитаю управлять двусторонней печатью "в ручную": печатаю нечётные, затем выдаю диалог вроде "переверните/продолжать/отмена", печатаю чётные, и т.п.
Оно именно так и есть.
Я тоже как-то делал для себя под Access'ом, только чуть иначе: из отчёта формата A5 делал брошюру на листах A4, дабы можно было потом просто сложить пополам и скрепить. Так сказать четырёхсторонняя печать — нужно было трижды поворачивать листы. Было весьма весело, но всё-таки сделал и потом печатал.
Насколько я знаю, если на принтере сконфигурировать опцию duplex=on, то он все задания по-умолчанию будет печатать в дуплексе. Может лучше ориентироваться на этот вариант?
Конечно. Осталось выяснить, это ли самое имел в виду автор темы, або что иное .
Эта же проблема возникла давее как вчера
имеем книгу со 125 листами на каждом по 4 печатных страницы - как включить для каждого двухстороннюю печать ?
или усложним - как при ранее настроенных в ручнуюю свойствах в параметрах страницы изменить часть листов на двухстороннюю печать, часть на одностороннюю ?
Я разработал код, но сразу хочу сказать что он кривоват, поскольку для Экселя ничего в VBA под дуплекс не разработано(не могу сказать за Офис 2010 есть ли там какие-то добавления). А по сему как-то вот так:
Sub Duplex() 'установка двухсторонней печати
Dim prntr As String
prntr = "rundll32 printui.dll,PrintUIEntry /e /n " & Chr(34) & Printer & Chr(34) 'справка в C:\Windows\System32\printui.exe
Shell prntr, vbNormalFocus '
Application.Wait (Now + TimeValue("0:00:02"))
Application.SendKeys "+{TAB}{RIGHT}{RIGHT}%y", True 'данную строку необходимо подгонять под конкретный принтер методом тыка
End Sub
Для меня также важен код для определения поддержки (или нет) дуплекса используемым принтером.
Заранее благодарен.
Всем доброго времени суток!
Уже месяц бьюсь пальцами об "клаву" по этой же теме, и ничего не придумал лучше ниже следующего:
Перед тем как выводить на печать в дуплексе из Екселя, необходимо создать два файла на диске "C:\", которые будут содержать все настройки принтера.
Первый будет содержать настройки принтера по умолчанию, а второй настройки для печати в дуплексе.
Первый файл "Default.dat" можно создать сразу нижеследующей строкой из любого командера или в CMD.EXE, если принять
во внимание что принтер и так настроен по умолчанию: "C:\Windows\System32\printui.exe /Ss /n "Имя принтера" /a "C:\Default.dat".
Имя принтера - принтер по умолчанию, например: HP LaserJet 2200 Series PCL 5.
Перед созданием второго - "Duplex.dat", сначала необходимо зайти в настройки принтера и включить дуплекс в двух закладках - "Общие" -> "Настройка..." и
"Дополнительно" -> "умолчания...".
Обе панели должны быть настроены одинаково, только в этом случае обеспечивается надежная печать в дуплексе.
Затем нижеследующей строкой в CMD.EXE сохраняется второй файл настроек принтера:
"C:\Windows\System32\printui.exe /Ss /n "Имя принтера" /a "C:\Duplex.dat".
Теперь можно написать макрос который будет вызывать программу, с помощью которой будут меняться настройки принтера на дуплекс, затем печать и возврат принтера
в исходное состояние.
Sub DuplexPrint()
Dim PrnName As String
' Чтобы не думать в дальнейшем какой принтер используется по умолчанию,
' получаем его имя в PrnName.
PrnName = Application.ActivePrinter
' Получается, к примеру, принтер по умолчанию: "HP LaserJet 2200 Series PCL 5 (LPT1:)".
' В названии принтера присутствуют лишние данные: " (LPT1:)", следующим действием вычисляем позицию последнего пробела и
' убираем паразитные " (LPT1:)" из названия принтера.
PrnName = Left(PrnName, InStrRev(PrnName, " ") - 1)
' Теперь запускаем исполняемую программу Windows rundll32 c библиотекой printui и заранее подготовленными
' параметрами принтера в файле "Duplex.dat" для печати в дуплексе.
Shell "rundll32 printui.dll,PrintUIEntry /Sr /n " & Chr(34) & PrnName & Chr(34) & " /a " & Chr(34) & "C:\Duplex.dat" & Chr(34), vbNormalFocus
' Здесь как раз и пригодилось имя принтера по умолчанию т.к. данная прога автоматом его не определяет.
' Полный список команд этой проги можно посмотреть запустив "C:\Windows\System32\printui.exe".
' Чтобы настройки успели записаться в дрова принтера нужно сделать небольшую паузу перед дальнейшей
' печатью. Как правило 1 сек. достаточно.
Application.Wait (Now + TimeValue("0:00:01"))
' Далее идет печать листов с использованием дуплекса.
ActiveWorkbook.Sheets(Array("Лист1", _
"Лист2")).PrintOut copies:=1
' И наконец возвращаем первоначальные настройки принтера заранее подготовленым файлом "Default.dat".
Shell "rundll32 printui.dll,PrintUIEntry /Sr /n " & Chr(34) & PrnName & Chr(34) & " /a " & Chr(34) & "C:\Default.dat" & Chr(34), vbNormalFocus
' Кому нравится чтобы во время печати мелькали черные окна командной строки, может после функции Shell вместо
' "rundll32 printui.dll,PrintUIEntry ***"
' написать следующее:
' "CMD /c C:\Windows\System32\printui.exe ***"
End Sub
Выше приведенный макросовый изврат является дороботкой макроса написаного "Kuryachev"-ым (да, простит меня автор).
Отличие заключается в отсутствии необходимости писать в макросе конкретный принтер и подгонять параметры включения принтера в дуплекс
методом тыка, что для многих может стать "камнем предкновения".
Также можно подготовить файлы настроек принтера для любых других случаев печати из Екселя, например: режим брошюры.
Тем не мение, данный способ остается извратом, так как:
- меняет настройки самого драйвера принтера, а не Екселя
- необходимо держать на диске файлы настроек принтера
- для работоспособности макроса необходимо предварительно создать эти файлы настроек
- нельзя перенести макрос на другой комп и сразу работать (например: отправить по почте готовую таблицу пользователю
не объяснив как создать и куда положить файлы настроек)
- нельзя определить поддерживает ли вообще принтер дуплекс.
А, мелкософту за это ОГРОМНЫЙ -М-И-Н-У-С-.
Тоже давно ищу способ. Нашел замечательный такой пример: Duplex Printing - MrExcel Message Board. Отлично работает. Красиво оформлен и даже обработка ошибок. Похоже умелые руки его делали .
строку:
strvbPrinter = Left$(strPrinter, 24)
заменить на:
strvbPrinter = Left(strPrinter, InStrRev(strPrinter, " ") - 1)
чтобы нормально отрезать хвостик от имени принтера, полученного с помощью Application.ActivePrinter.
Но фишка в следующем: Переключает дуплекс то он отлично, но Excel зараза помнит с какими настройками при открытии он этот принтер взял. То же самое наблюдается и в уже предоставленных тут примерах. То есть чтобы понять, можно отбросить макросы в сторону.
Открываем Excel
делаем файл -> Печать
Смотрим настройки принтера
Смотрим как выставлен дуплекс
Далее ничего не изменяя закрываем настройки.
Давим кнопку "Пуск" -> Принтеры и факсы
Открываем свойства принтера и меняем дуплекс.
Закрываем с сохранением. (именно это и делают все найденные мною примеры включая этот)
Открываем диалог печати в Excel и смотрим свойства принтера - Дуплекс.
Нашего переключения, которое было сделано через "Принтеры и факсы" мы не видим. То есть Excel запомнил состояние принтера при старте.
Как бы научить его считать настройки принтеров заново, тогда бы модуль был на все 100% рабочий, и управлять дуплексом из VBA было бы реально.
Вот еще вариант переключения дуплекса с использованием DLL: VBA, office, VBS or shell duplex printing - VBForums.
Но та же проблема: Переключение можно увидеть в свойствах принтера через Пуск->Принтеры и факсы, но в свойствах принтера, вызванных через диалог печати Excel, эти переключения не видны.
не все так просто, но ексель это может, нужно узнать ДиСи окна и дальше пойдет
В общем задача решена с горем пополам, а я уж было и не верил в боле менее приемлемый вариант. Менять настройки у принтера, выбранного для печати т.е. Application.ActivePrinter бес толку. Excel все равно помнит свои параметры принтера. Вывод: Выбираем другой принтер, меняем у нужного, и выбираем его. Тогда настройки будут такими, какие в этот момент в памяти драйвера.
На данный момент есть два примера. Один очень короткий с использованием сторонней dll, другой увесистый, но полностью на VB. Оба примера не оставляют паразитных черных окон и прочей чешуи. Но минус у них общий. При работе VBA изменяются параметры драйвера принтера, т.е. переключение дуплекса идет в нем. Если в этот момент работают другие проги, и для них это критично, то вероятно это решение не подойдет. Но немного разгоню тучи. Можно сделать таким образом, чтобы первоначальное состояние настройки возвращалось после печати.
Bagir, прочтите справку по BBCode и используйте теги. Я поправил Ваши посты.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться