Данный код выводит список всех установленных в системе принтеров: 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 Результат работы макроса:
=================================== 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 Результат работы макроса:
======================================== 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: 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
|
|||

Комментарии
Спасибо за ответ, сначала так и сделал 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 не совпадают.
Проанализируйте свойства всех установленных принтеров, и отфильтруйте подходящие принтеры.
Пример кода для просмотра свойств принтеров, установленных в системе:
intPrinters = 1
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Printer")
For Each PRN In colItems
txt = "Printers on " & PRN.name & ", Printer Number: " & intPrinters & vbCr & _
"====================================" & vbCr & "Availability: " & PRN.Availability & vbCr & _
"Description: " & PRN.Description & vbCr & "Printer: " & PRN.DeviceID & vbCr & _
"Driver Name: " & PRN.DriverName & vbCr & "Port Name: " & PRN.PortName & vbCr & _
"Printer State: " & PRN.PrinterState & vbCr & "Printer Status: " & PRN.PrinterStatus & vbCr & _
"PrintJobDataType: " & PRN.PrintJobDataType & vbCr & "Print Processor: " & PRN.PrintProcessor & vbCr & _
"Spool Enabled: " & PRN.SpoolEnabled & vbCr & "Separator File: " & PRN.SeparatorFile & vbCr & _
"Queued: " & PRN.Queued & vbCr & "Status: " & PRN.Status & vbCr & _
"StatusInfo: " & PRN.StatusInfo & vbCr & "Published: " & PRN.Published & vbCr & _
"Shared: " & PRN.Shared & vbCr & "ShareName: " & PRN.ShareName & vbCr & _
"Direct: " & PRN.Direct & vbCr & "Location: " & PRN.Location & vbCr & _
"Priority: " & PRN.Priority & vbCr & "Work Offline: " & PRN.WorkOffline & vbCr & _
"Horizontal Res: " & PRN.HorizontalResolution & vbCr & "Vertical Res: " & PRN.VerticalResolution & vbCr
MsgBox txt, vbInformation, "Информация о принтере № " & intPrinters
intPrinters = intPrinters + 1
Next
End Sub
А вот этот код выведет список принтеров, доступных в текущий момент:
(мы в запросе указываем, что нас интересуют только принтеры со статусом Idle)
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery _
("SELECT * FROM Win32_Printer WHERE PrinterStatus = '3'")
For Each PRN In colItems
Debug.Print PRN.name
Next
End Sub
...список всех установленных в системе принтеров - это хорошо
Но, как отобразить список принтеров кроме выключенных из сети, но подключенных к компьютеру?
Опрос системы должен произойти до начала пуска печати.
Отправить комментарий