Постараюсь изложить проблему не вдаваясь в ненужные детали. Я уже несколько лет пишу простенький софт на VBA для заполнения налоговых деклараций. Excel + VBA позволяют быстренько состряпать ново введенную форму, а сроки, это для меня главное. Идет много печати, и в процессе нужно отправлять одни задания с дуплексом, другие просто на одной стороне. У команды PrintOut нет параметров выбора дуплекса. Да и простого пути тут тоже нет. Сейчас пользуюсь прогой FinePrint. Отправляю печать на нее, а она может перенаправить на выбранный принтер с указанием флага дуплекса. Способ не полностью автоматизировал работу. Оператору нужно каждый раз выбирать, с дуплексом или без, раз уж я не могу это делать средствами VBA. Что получилось найти: Есть два способа переключить дуплекс. Первый полностью на VBA, второй использует стороннюю dll библиотеку. У этих способов есть общий минус. Они меняют параметры принтера не в Excel, а общие (Пуск -> Принтеры). Это конечно неудобство, но с ним можно мириться. Оба способа рабочие, но столкнулся с такой проблемой. Я не могу поменять дуплекс у принтера, если он выбран активным в Excel (2003). То есть поменять то я могу, и после запуска VBA дуплекс действительно переключится, и это можно увидеть открыв свойства принтера из проводника Windiws, но не из Excel. Нашел только следующее решение: - Делаем нужный принтер не активным (выбираем любой другой). - Переключаем дуплекс нужному принтеру - Выбираем его активным. Тогда настройки будут прочитаны. Способ тоже не очень, и похоже нужна задержка после переключения, но он пока единственный. Я прикладываю примеры в файле, чтобы не раздувать тему тут. В примере есть еще разные модуля, думаю они будут интересны тем, кто изучает тему печати. Хотелось бы обсудить модуль PrinterDuplexVBA Function TestPrinter() Неплохо бы было изменять не общие настройки драйвера а только настройки активного принтера Excel, чтобы это не касалось других программ.
Постараюсь изложить проблему не вдаваясь в ненужные детали. Я уже несколько лет пишу простенький софт на VBA для заполнения налоговых деклараций. Excel + VBA позволяют быстренько состряпать ново введенную форму, а сроки, это для меня главное. Идет много печати, и в процессе нужно отправлять одни задания с дуплексом, другие просто на одной стороне. У команды PrintOut нет параметров выбора дуплекса. Да и простого пути тут тоже нет. Сейчас пользуюсь прогой FinePrint. Отправляю печать на нее, а она может перенаправить на выбранный принтер с указанием флага дуплекса. Способ не полностью автоматизировал работу. Оператору нужно каждый раз выбирать, с дуплексом или без, раз уж я не могу это делать средствами VBA. Что получилось найти: Есть два способа переключить дуплекс. Первый полностью на VBA, второй использует стороннюю dll библиотеку. У этих способов есть общий минус. Они меняют параметры принтера не в Excel, а общие (Пуск -> Принтеры). Это конечно неудобство, но с ним можно мириться. Оба способа рабочие, но столкнулся с такой проблемой. Я не могу поменять дуплекс у принтера, если он выбран активным в Excel (2003). То есть поменять то я могу, и после запуска VBA дуплекс действительно переключится, и это можно увидеть открыв свойства принтера из проводника Windiws, но не из Excel. Нашел только следующее решение: - Делаем нужный принтер не активным (выбираем любой другой). - Переключаем дуплекс нужному принтеру - Выбираем его активным. Тогда настройки будут прочитаны. Способ тоже не очень, и похоже нужна задержка после переключения, но он пока единственный. Я прикладываю примеры в файле, чтобы не раздувать тему тут. В примере есть еще разные модуля, думаю они будут интересны тем, кто изучает тему печати. Хотелось бы обсудить модуль PrinterDuplexVBA Function TestPrinter() Неплохо бы было изменять не общие настройки драйвера а только настройки активного принтера Excel, чтобы это не касалось других программ.Bagir
Добавил нововведение в программу. Все получилось. Дуплекс нормально работает. Были редкие несрабатывания, но задержка в одну секунду даже простым способом Application.Wait исправила положение. Осталось решить две проблемы, которые тесно связанны. Предложенные способы меняют параметры драйвера принтера по умолчанию, а не временные параметры печати активного принтера, пока "живет" программа. В виду этого чтобы их считать, нужно перед изменением параметров сделать принтер неактивным (выбрать любой другой), а потом выбрать нужный. Отличнейшим решением было бы изменение не параметров по умолчанию а сразу временных параметров, которые помнит Excel. Господа, код в примере открыт. Но тут нужны спецы по части API. Смотрите в моем файле модуль PrinterDuplexVBA. Там две функции. Это все что надо для работы. Функция TestPrinter запускает функцию SetPrinterDuplex.
Добавил нововведение в программу. Все получилось. Дуплекс нормально работает. Были редкие несрабатывания, но задержка в одну секунду даже простым способом Application.Wait исправила положение. Осталось решить две проблемы, которые тесно связанны. Предложенные способы меняют параметры драйвера принтера по умолчанию, а не временные параметры печати активного принтера, пока "живет" программа. В виду этого чтобы их считать, нужно перед изменением параметров сделать принтер неактивным (выбрать любой другой), а потом выбрать нужный. Отличнейшим решением было бы изменение не параметров по умолчанию а сразу временных параметров, которые помнит Excel. Господа, код в примере открыт. Но тут нужны спецы по части API. Смотрите в моем файле модуль PrinterDuplexVBA. Там две функции. Это все что надо для работы. Функция TestPrinter запускает функцию SetPrinterDuplex.Bagir
А вы на дату публикации этой ветки посмотрите пожалуйста... Просто тут тема сразу замерла без обсуждения, но закрыта не была. Ну раз там тему подняли, то может быть там ее и продолжу. За наводку спасибо, почитаю сейчас.
А вы на дату публикации этой ветки посмотрите пожалуйста... Просто тут тема сразу замерла без обсуждения, но закрыта не была. Ну раз там тему подняли, то может быть там ее и продолжу. За наводку спасибо, почитаю сейчас.Bagir
Следует знать: Excel не умеет работать с двухсторонней печатью и вообще не знает что это такое. Все что связано с дуплексом находится в драйвере принтера.
Замеченно: При выборе принтера, Excel получает его настройки, в том числе и настройки дуплекса. Excel помнит их "пока живет" или до выбора другого принтера. Изменение настроек в Экселе Файл -> Печать -> Свойства вызывает окно драйвера принтера, Но не изменяет общих настроек этого принтера.
То есть изменения настроек принтера сделанные в Эксел не увидеть например в Ворде.
Если нужный принтер в Excel уже выбран, то изменение его настроек по средствам Панель управления - > Принтеры -> Свойства ничего не дадут.
Главный недостаток предложенного кода: Изменения дуплекса будут сделаны в общих настройках драйвера принтера, а не в тех, что уже запомнил Excel
вариант обхода: После изменения настроек, выбрать любой другой принтер, а затем обратно выбрать нужный, чтобы его измененные настройки были заного прочитаны Excel-ом. Но такой вариант работает нестабильно, да и он просто вообще "кривой" и не является решением.
Нужно: Заставить функцию изменять настройки принтера, уже считанные Excel-ом
Еще раз хочу отметить: Свойства принтера открытые из окна печати Excel и из Палень управления -> Принтеры Не одно и тоже!
Продублирую тут тему с excelworld.ru
Следует знать: Excel не умеет работать с двухсторонней печатью и вообще не знает что это такое. Все что связано с дуплексом находится в драйвере принтера.
Замеченно: При выборе принтера, Excel получает его настройки, в том числе и настройки дуплекса. Excel помнит их "пока живет" или до выбора другого принтера. Изменение настроек в Экселе Файл -> Печать -> Свойства вызывает окно драйвера принтера, Но не изменяет общих настроек этого принтера.
То есть изменения настроек принтера сделанные в Эксел не увидеть например в Ворде.
Если нужный принтер в Excel уже выбран, то изменение его настроек по средствам Панель управления - > Принтеры -> Свойства ничего не дадут.
Главный недостаток предложенного кода: Изменения дуплекса будут сделаны в общих настройках драйвера принтера, а не в тех, что уже запомнил Excel
вариант обхода: После изменения настроек, выбрать любой другой принтер, а затем обратно выбрать нужный, чтобы его измененные настройки были заного прочитаны Excel-ом. Но такой вариант работает нестабильно, да и он просто вообще "кривой" и не является решением.
Нужно: Заставить функцию изменять настройки принтера, уже считанные Excel-ом
Еще раз хочу отметить: Свойства принтера открытые из окна печати Excel и из Палень управления -> Принтеры Не одно и тоже!Bagir
Нужно: Заставить функцию изменять настройки принтера, уже считанные Excel-ом
Эксу вообще пофиг, какие там у принтера настройки. Он отправляет задание в диспетчер печати. См. Сообщение № 10 в теме: http://www.excelworld.ru/forum/2-2191-1 А с драйвером принтера работает тот же диспетчер. Эксел не знает, какой там драйвер и какого принтера. Через АПИ можно добраться к драйверу, но Экс опять же, будет тут ни при чем. ЗЫ "по средствам" в Вашем контексте правильно писать - "посредством".
Quote (Bagir)
Нужно: Заставить функцию изменять настройки принтера, уже считанные Excel-ом
Эксу вообще пофиг, какие там у принтера настройки. Он отправляет задание в диспетчер печати. См. Сообщение № 10 в теме: http://www.excelworld.ru/forum/2-2191-1 А с драйвером принтера работает тот же диспетчер. Эксел не знает, какой там драйвер и какого принтера. Через АПИ можно добраться к драйверу, но Экс опять же, будет тут ни при чем. ЗЫ "по средствам" в Вашем контексте правильно писать - "посредством".KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
Стоп, тут немного не так. Эксу вовсе не пофиг. При открытии Екса или при смене в Эксе текущего принтера, запоминаются настройки этого принтера на время жизни Экса или до выбора другого принтера. Приведенный мною пример хорошо меняет настройки у принтера, но не те, которые уже помнит Екс, и с которыми задание и будет отправлено на печать.
Стоп, тут немного не так. Эксу вовсе не пофиг. При открытии Екса или при смене в Эксе текущего принтера, запоминаются настройки этого принтера на время жизни Экса или до выбора другого принтера. Приведенный мною пример хорошо меняет настройки у принтера, но не те, которые уже помнит Екс, и с которыми задание и будет отправлено на печать.Bagir
Другими словами мы может открыть Екс и Водр например. Выбрать в обоих один и тот же принтер, в одном указать двухстороннюю печать, а в другом одностороннюю. А мой пример изменит именно параметры принтера, которые можно посмотреть Палень управления -> Принтеры.
Так где же находятся параметры принтера, которые уже прочитал и запомнил Екс?
Другими словами мы может открыть Екс и Водр например. Выбрать в обоих один и тот же принтер, в одном указать двухстороннюю печать, а в другом одностороннюю. А мой пример изменит именно параметры принтера, которые можно посмотреть Палень управления -> Принтеры.
Так где же находятся параметры принтера, которые уже прочитал и запомнил Екс?Bagir
Еще раз - никто ничего не читал и не запоминал. Вызывая Параметры печати, мы вызываем одно из окон Диспетчера печати и он уже передает драйверу выбранные параметры. И он помнит, откуда какое задание получил. Мясорубка не в курсе, что приготовят из фарша - тефтели, фрикадельки или котлеты:-) Просто выдает фарш. Это мое мнение. Сумеете опровергнуть, буду только рад.
Еще раз - никто ничего не читал и не запоминал. Вызывая Параметры печати, мы вызываем одно из окон Диспетчера печати и он уже передает драйверу выбранные параметры. И он помнит, откуда какое задание получил. Мясорубка не в курсе, что приготовят из фарша - тефтели, фрикадельки или котлеты:-) Просто выдает фарш. Это мое мнение. Сумеете опровергнуть, буду только рад.KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
Это все понятно и верно, про мясорубку )) Делаем так: Лезем в Палень управления -> Принтеры. Выбираем принтер и настраиваем его на одностороннюю печать. Открываем Екс. Жмем Файл -> Печать, выбираем наш принтер и смотрит параметры. Там выбрана односторонняя печать. Меняем ее на двухстороннюю. Печатаем документ. Открываем Палень управления -> Принтеры. Смотрим там. Там как была выставленна односторонняя печать, так и останется. Открываем в Ексе Файл -> Печать. Смотрим. Там висит у этого принтера двухсторонняя. Это как объяснить?
Екс запомнил на время пока он открыт, или пока в нем не будет выбран другой принтер все параметры печати. И будет применять их при отправке следующего задания на печать.
Мой пример может изменить параметры у принтера, которые всегда можно увидеть в Палень управления -> Принтеры А для успеха нужно изменять параметры которые существуют, пока открыт Екс.
Это все понятно и верно, про мясорубку )) Делаем так: Лезем в Палень управления -> Принтеры. Выбираем принтер и настраиваем его на одностороннюю печать. Открываем Екс. Жмем Файл -> Печать, выбираем наш принтер и смотрит параметры. Там выбрана односторонняя печать. Меняем ее на двухстороннюю. Печатаем документ. Открываем Палень управления -> Принтеры. Смотрим там. Там как была выставленна односторонняя печать, так и останется. Открываем в Ексе Файл -> Печать. Смотрим. Там висит у этого принтера двухсторонняя. Это как объяснить?
Екс запомнил на время пока он открыт, или пока в нем не будет выбран другой принтер все параметры печати. И будет применять их при отправке следующего задания на печать.
Мой пример может изменить параметры у принтера, которые всегда можно увидеть в Палень управления -> Принтеры А для успеха нужно изменять параметры которые существуют, пока открыт Екс.Bagir
Либо надо каким то образом заставить Экс обновить параметры принтера. Сделать это у меня получилось пока только так. Выбираем в Эксе любой другой принтер и затем опять выбираем нужный, параметры которого мы изменили.
Если уйти от моего примера и VBA вообще, объясню так:
Открывает Экс. Выбираем наш принтер. Файл -> Печать и с его свойствах выбираем одностороннюю печать. Лезем в Палень управления -> Принтеры. Выбираем наш принтер и в его свойствах переключаем печать на двухстороннюю. Возвращаемся в Экс, Файл -> Печать и смотрим там. Ну нет там двухсторонней печати. Но если мы переключим принтер на другой, затем обратно, двухсторонняя печать появится. Потому что при выборе принтера читаются его настройки, которые мы изменили в Палень управления -> Принтеры
Либо надо каким то образом заставить Экс обновить параметры принтера. Сделать это у меня получилось пока только так. Выбираем в Эксе любой другой принтер и затем опять выбираем нужный, параметры которого мы изменили.
Если уйти от моего примера и VBA вообще, объясню так:
Открывает Экс. Выбираем наш принтер. Файл -> Печать и с его свойствах выбираем одностороннюю печать. Лезем в Палень управления -> Принтеры. Выбираем наш принтер и в его свойствах переключаем печать на двухстороннюю. Возвращаемся в Экс, Файл -> Печать и смотрим там. Ну нет там двухсторонней печати. Но если мы переключим принтер на другой, затем обратно, двухсторонняя печать появится. Потому что при выборе принтера читаются его настройки, которые мы изменили в Палень управления -> ПринтерыBagir