Данный код выводит список всех установленных в системе принтеров:
Sub ПолучениеСпискаПринтеров() Set AllPrinters = GetObject("winmgmts://./root/CIMV2").ExecQuery("SELECT * FROM Win32_Printer", , 48) For Each printer In AllPrinters n = n + 1: Debug.Print "Принтер №" & n & ": " & printer.Name Next Debug.Print "Всего принтеров: " & n End Sub
Результат работы макроса:
Принтер №1: PDFCreator
Принтер №2: Microsoft XPS Document Writer
Принтер №3: Microsoft Office Document Image Writer
Принтер №4: \\192.168.0.1\Samsung ML-2010 Series
Всего принтеров: 4
===================================
Ещё один вариант того же макроса (у меня он работает намного быстрее первого варианта):
Sub ПолучениеСпискаПринтеров_версия2() With CreateObject("Shell.Application").NameSpace(4).Items For n = 1 To .Count - 1 Debug.Print "Принтер №" & n & ": " & .Item(n).Name Debug.Print vbTab & "Путь к принтеру №" & n & ": " & .Item(n).Path Next Debug.Print "Всего принтеров: " & .Count - 1 End With Debug.Print "Активный принтер: " & Application.ActivePrinter End Sub
Результат работы макроса:
Принтер №1: PDFCreator
Путь к принтеру №1: PDFCreator
Принтер №2: Microsoft XPS Document Writer
Путь к принтеру №2: Microsoft XPS Document Writer
Принтер №3: Microsoft Office Document Image Writer
Путь к принтеру №3: Microsoft Office Document Image Writer
Принтер №4: Samsung ML-2010 Series на 192.168.0.1
Путь к принтеру №4: \\192.168.0.1\Samsung ML-2010 Series
Всего принтеров: 4
Активный принтер: PDFCreator on NE03:
========================================
Данный код позволяет активировать виртуальный PDF-принтер в Microsoft Word:
(в случае успешной активации функция возвращает TRUE)
Function ActivatePDFprinter() As Boolean If Application.ActivePrinter Like "*PDF*" Then ActivatePDFprinter = True: Exit Function On Error Resume Next: Err.Clear With CreateObject("Shell.Application").NameSpace(4).Items For n = 1 To .Count - 1 ИмяПринтера = .Item(n).Name If ИмяПринтера Like "*PDF*" Then Application.ActivePrinter = ИмяПринтера ActivatePDFprinter = True: Exit For End If Next End With If Not (Application.ActivePrinter Like "*PDF*") Then MsgBox "Не найден виртуальный принтер для печати в ПДФ", vbExclamation End If If Err Then MsgBox "Не удалось активировать виртуальный принтер для печати в ПДФ", vbExclamation End Function
ВНИМАНИЕ: Для Microsoft Excel код будет немного другим (там принтеры именуются несколько иначе)
Данный код позволяет активировать виртуальный PDF-принтер в Microsoft Excel:
(в случае успешной активации функция возвращает TRUE)
Function ActivatePDFprinter() As Boolean If Application.ActivePrinter Like "*PDF*" Then ActivatePDFprinter = True: Exit Function On Error Resume Next: Err.Clear With CreateObject("Shell.Application").Namespace(4).Items For n = 1 To .Count - 1 ИмяПринтераExcel = .Item(n).Name & " (Ne" & Format(n - 1, "00") & ":)" If ИмяПринтераExcel Like "*PDF*" Then Application.ActivePrinter = ИмяПринтераExcel ActivatePDFprinter = True: Exit For End If Next End With If Not (Application.ActivePrinter Like "*PDF*") Then MsgBox "Не найден виртуальный принтер для печати в ПДФ", vbExclamation End If If Err Then MsgBox "Не удалось активировать виртуальный принтер для печати в ПДФ", vbExclamation End Function
Комментарии
в версии excel 2019 в windows 10
надо:
ИмяПринтераExcel = .Item(n).Name & " (Ne" & Format(.Count - (n + 1), "00") & ":)"
Понял! Спасибо за ответ!
Ошибку с выводом на печать не отловить, - так устроена Windows
(Эксель отправляет файл на печать, - спулер печати принимает задание на печать. с точки зрения Excel, задача по выводу на печать выполнена)
Т.е. на уровне Excel ошибку не получить (о чем вам на форуме уже написали)
нет
вот у меня к компу подключен работающий принтер,
и то, я не могу сказать, напечатает он документ или нет (зависит от наличия бумаги в лотке)
Так что проще всего вывести пользователю MSGBOX с вопросом «Распечаталось?» и вариантами ответа да / нет,
и на основании ответа пользователя продолжать работу макроса
Доброго времени суток!
У меня есть таблица, у которой перед печатью должны скрываться некоторые строки и столбцы (всегда разные, зависит от выбора пользователя).
Я построил макрос так, что сначала скрывается то, что является лишним, затем сформированная таблица идет на печать и затем производится возврат в прежнее состояние таблицы (раскрытие скрытых строк и столбцов).
Проблема образовалась в том, что когда к ПК не подключен принтер (я про реальный принтер), то выдается ошибка, что принтер неактивен (ошибка принтера). Сначала я хотел поймать эту ошибку и выдавать свое сообщение, типа "Принтер неактивен! Обратитесь к админу!" и т.д., но не смог, так как к Excel эта ошибка не имеет никакого отношения. Затем, предложили мне сначала сделать проверку на активные принтеры, но у меня в активных принтерах весит виртуальный (распечатать-то он не может), поэтому Application.ActivePrinter всегда равен этому принтеру (*PDF*). Самого принтера у меня нет.
По итогу, пока, оставил как есть, так как данная ошибка не рушит работу макроса: если принтер подключен - напечатает, если нет - выдаст сообщение об ошибке, и дальше макрос будет работать. + добавил выбор принтера Application.Dialogs(xlDialogPrinterSetup).Show, но, это окно отражает кучу лишних устройств - виртуальные принтеры, Fax и т.д. Это не очень нравится.
Но, все таки интересно, можно ли как-то ловить такие ошибки, или как-то проверять на реальное подключение к принтеру (который напечатает таблицу), или в окне Application.Dialogs(xlDialogPrinterSetup).Show отражать только раельные принтеры (а если их нет, то пусто и тогда пользователь нажмет отмену)??? Выше Вы предлагаете проанализировать свойства всех установленных принтеров, и отфильтруйте подходящие принтеры. Скажите пожалуйста, по какому-то из свойств можно понять распечатает принтер или нет?
Данная таблица будет использоваться на разных ПК, поэтому принтеры всегда будут разные! Вроде понятно расписал.
Данную тему обсуждали на форуме: http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=1...
Ну и зачем нужен этот огромный макрос с доп. функциями,
который, ко всему прочему, не будет работать в 64-битной версии Office?
Когда оба моих макроса из 5 строк выдают тот же самый результат...
должно работать в любой версии Excel, видоизменить на то чтоб выбирал на печать нужный, а потом возвращал установленный ранее на основе этого кода, думаю труда не составит.
Спасибо за ответ, сначала так и сделал http://clip2net.com/s/1OiZ5 но изза ошибки пошёл "обходными путями", может что не включено или еще изза чего. Пишу дома (и принтеров нету кроме виртуальных Офиса) может на работе нормально сработает.
К сожалению, вряд ли смогу помочь.
Я писал этот код, ориентируясь на имена принтеров, выводимых моим Excel (версии 2003)
И нет никакой гарантии, что все версии Excel, и в любой версии Windows, будут именовать принтеры точно также.
Сделайте проще:
1) При открытии формы (событие UserForm_Initialize) заполните комбобокс списком имён принтеров,
используя цикл из моего макроса
2) При щелчке на CommandButton5 просто активируйте выбранный принтер одной строкой кода:
http://clip2net.com/s/1OiGj
Не подскажете где ошибка? Хочу на форму в Excel добавить ComboBox со списком установленных принтеров (здесь поможет ваш код) и выводить печать на выбранный принтер, но вылезает такая вот ошибка. И еще экспериментировал и выбирал различные принтеры, номер .Item(n).Name & " (Ne" & Format(n - 1, "00") & ":)" и тот номер который показывает Application.ActivePrinter не совпадают.
Проанализируйте свойства всех установленных принтеров, и отфильтруйте подходящие принтеры.
Пример кода для просмотра свойств принтеров, установленных в системе:
А вот этот код выведет список принтеров, доступных в текущий момент:
(мы в запросе указываем, что нас интересуют только принтеры со статусом Idle)
...список всех установленных в системе принтеров - это хорошо
Но, как отобразить список принтеров кроме выключенных из сети, но подключенных к компьютеру?
Опрос системы должен произойти до начала пуска печати.
Отправить комментарий