1

Тема: Excel/VBA: Установка двухсторонней печати (Duplex print)

Пожалуйста помогите! Возможно ли с помощью кода VBA установить/снять двухсторонюю печать листа Excel. Если нет - то как открыть диалог Печать/Свойства.

2

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

Kuryachev, в каком Excel такое есть? В 2003 — нет.

3 (изменено: max7, 2010-01-07 07:03:54)

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

Нет,  дуплекс можно указать в настройках принтера (не  в 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

4

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

max7 пишет:

Нет,  дуплекс можно указать в настройках принтера (не  в excel'е)  http://office.microsoft.com/en-us/word/ … 71033.aspx

Коллега, как раз этот, приведённый Вами, пример относится именно к возможностям самого приложения (WinWord), а не к настройкам драйвера принтера . А за ссылки — спасибо.

5

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

Настройки драйвера/принтера специфичны для конкретного драйвера/принтера, но есть возможность включить (в частности) дуплекс через winapi через структуры свойств драйвера/принтера. Я могу ошибаться, но если принтер поддерживает дуплекс, и он включён в настройках драйвера, то в диалоге печати появляется чекбокс "двухсторонняя печать", и по-моему, это "фича" не доступна из VBA.

6

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

OFF: max7, как раз для WinWord'а данный флажок обрабатывается им самим безо всякого участия драйвера принтера (что, конечно, не отменяет возможность задействовать не его, а возможность двусторонней печати через сам драйвер принтера, если тот поддерживает такую возможность). В данном случае, для WinWord'а это:

Application.PrintOut ManualDuplexPrint:=True

Печатается одна сторона листов (нечётная), затем он просит вынуть/повернуть/вставить листы, затем печатается вторая сторона листов (чётная).

7

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

alexii пишет:

Печатается одна сторона листов (нечётная), затем он просит вынуть/повернуть/вставить листы, затем печатается вторая сторона листов (чётная).

Ну это не дуплекс, это насмешка какая-то. Я предпочитаю управлять двусторонней печатью "в ручную": печатаю нечётные, затем выдаю диалог вроде "переверните/продолжать/отмена", печатаю чётные, и т.п.

P.S.: Самое интересное (я немного изучал это вопрос), что при "прямой печати" на принтер/спуллер (форматы к PCL, PostScript, и т.д. смотря какой поддерживает принтер, либо эмулятор в драйвере) в "текущем сеансе печати" задавать режимы печати очень просто (в winapi есть специальные методы ). Для PCL это по сути однобайтовая команда, для PS - вызов процедуры.

8

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

max7 пишет:

Я предпочитаю управлять двусторонней печатью "в ручную": печатаю нечётные, затем выдаю диалог вроде "переверните/продолжать/отмена", печатаю чётные, и т.п.

Оно именно так и есть.

Я тоже как-то делал для себя под Access'ом, только чуть иначе: из отчёта формата A5 делал брошюру на листах A4, дабы можно было потом просто сложить пополам и скрепить. Так сказать четырёхсторонняя печать — нужно было трижды поворачивать листы. Было весьма весело, но всё-таки сделал и потом печатал.

9

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

Насколько я знаю, если на принтере сконфигурировать опцию duplex=on, то он все задания по-умолчанию будет печатать в дуплексе. Может лучше ориентироваться на этот вариант?

10

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

Конечно. Осталось выяснить, это ли самое имел в виду автор темы, або что иное .

11

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

Эта же проблема возникла давее как вчера
имеем книгу со 125 листами на каждом по 4 печатных страницы - как включить для каждого двухстороннюю печать ?
или усложним - как при ранее настроенных в ручнуюю свойствах в параметрах страницы изменить часть листов на двухстороннюю печать, часть на одностороннюю ?

Я конечно далек от мысли... (с)

12

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

Я разработал код, но сразу хочу сказать что он кривоват, поскольку для Экселя ничего в 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

Для меня также важен код для определения поддержки (или нет) дуплекса используемым принтером.
Заранее благодарен.

13

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

Всем доброго времени суток!
Уже месяц бьюсь пальцами об "клаву" по этой же теме, и ничего не придумал лучше ниже следующего:

Перед тем как выводить на печать в дуплексе из Екселя, необходимо создать два файла на диске "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"-ым (да, простит меня автор).
Отличие заключается в отсутствии необходимости писать в макросе конкретный принтер и подгонять параметры включения принтера в дуплекс
методом тыка, что для многих может стать "камнем предкновения".
Также можно подготовить файлы настроек принтера для любых других случаев печати из Екселя, например: режим брошюры.
Тем не мение, данный способ остается извратом, так как:
- меняет настройки самого драйвера принтера, а не Екселя
- необходимо держать на диске файлы настроек принтера
- для работоспособности макроса необходимо предварительно создать эти файлы настроек
- нельзя перенести макрос на другой комп и сразу работать (например: отправить по почте готовую таблицу пользователю
   не объяснив как создать и куда положить файлы настроек)
- нельзя определить поддерживает ли вообще принтер дуплекс.

А, мелкософту за это ОГРОМНЫЙ -М-И-Н-У-С-.

14

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

Тоже давно ищу способ. Нашел замечательный такой пример: Duplex Printing - MrExcel Message Board. Отлично работает. Красиво оформлен и даже обработка ошибок. Похоже умелые руки его делали .
строку:

strvbPrinter = Left$(strPrinter, 24)

заменить на:

strvbPrinter = Left(strPrinter, InStrRev(strPrinter, " ") - 1)

чтобы нормально отрезать хвостик от имени принтера, полученного с помощью Application.ActivePrinter.

Но фишка в следующем: Переключает дуплекс то он отлично, но Excel зараза помнит с какими настройками при открытии он этот принтер взял. То же самое наблюдается и в уже предоставленных тут примерах. То есть чтобы понять, можно отбросить макросы в сторону.
Открываем Excel
делаем файл -> Печать
Смотрим настройки принтера
Смотрим как выставлен дуплекс
Далее ничего не изменяя закрываем настройки.
Давим кнопку "Пуск" -> Принтеры и факсы
Открываем свойства принтера и меняем дуплекс.
Закрываем с сохранением. (именно это и делают все найденные мною примеры включая этот)
Открываем диалог печати в Excel и смотрим свойства принтера - Дуплекс.

Нашего переключения, которое было сделано через "Принтеры и факсы" мы не видим. То есть Excel запомнил состояние принтера при старте.
Как бы научить его считать настройки принтеров заново, тогда бы модуль был на все 100% рабочий, и управлять дуплексом из VBA было бы реально.

15

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

Вот еще вариант переключения дуплекса с использованием DLL: VBA, office, VBS or shell duplex printing - VBForums.

Но та же проблема: Переключение можно увидеть в свойствах принтера через Пуск->Принтеры и факсы, но в свойствах принтера, вызванных через диалог печати Excel, эти переключения не видны.

16

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

не все так просто, но ексель это может, нужно узнать ДиСи окна и дальше пойдет

Я конечно далек от мысли... (с)

17

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

В общем задача решена с горем пополам, а я уж было и не верил в боле менее приемлемый вариант. Менять настройки у принтера, выбранного для печати т.е. Application.ActivePrinter бес толку. Excel все равно помнит свои параметры принтера. Вывод: Выбираем другой принтер, меняем у нужного, и выбираем его. Тогда настройки будут такими, какие в этот момент в памяти драйвера.
На данный момент есть два примера. Один очень короткий с использованием сторонней dll, другой увесистый, но полностью на VB. Оба примера не оставляют паразитных черных окон и прочей чешуи. Но минус у них общий. При работе VBA изменяются параметры драйвера принтера, т.е. переключение дуплекса идет в нем. Если в этот момент работают другие проги, и для них это критично, то вероятно это решение не подойдет. Но немного разгоню тучи. Можно сделать таким образом, чтобы первоначальное состояние настройки возвращалось после печати.

18

Re: Excel/VBA: Установка двухсторонней печати (Duplex print)

Bagir, прочтите справку по BBCode и используйте теги. Я поправил Ваши посты.