mail mail

Получение списка доступных принтеров средствами VB (VBA)

Данный код выводит список всех установленных в системе принтеров:

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

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Спасибо за ответ, сначала так и сделал http://clip2net.com/s/1OiZ5 но изза ошибки пошёл "обходными путями", может что не включено или еще изза чего. Пишу дома (и принтеров нету кроме виртуальных Офиса) может на работе нормально сработает.

К сожалению, вряд ли смогу помочь.
Я писал этот код, ориентируясь на имена принтеров, выводимых моим Excel (версии 2003)
И нет никакой гарантии, что все версии Excel, и в любой версии Windows, будут именовать принтеры точно также.

Сделайте проще:
1) При открытии формы (событие UserForm_Initialize) заполните комбобокс списком имён принтеров,
используя цикл из моего макроса
2) При щелчке на CommandButton5 просто активируйте выбранный принтер одной строкой кода:

Application.ActivePrinter = ListOfPrint.Value

http://clip2net.com/s/1OiGj
Не подскажете где ошибка? Хочу на форму в Excel добавить ComboBox со списком установленных принтеров (здесь поможет ваш код) и выводить печать на выбранный принтер, но вылезает такая вот ошибка. И еще экспериментировал и выбирал различные принтеры, номер .Item(n).Name & " (Ne" & Format(n - 1, "00") & ":)" и тот номер который показывает Application.ActivePrinter не совпадают.

Проанализируйте свойства всех установленных принтеров, и отфильтруйте подходящие принтеры.

Пример кода для просмотра свойств принтеров, установленных в системе:

Sub ВыводСвойствВсехПринтеров()
    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)

Sub ВыводСпискаИмёнДоступныхПринтеров()
    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

...список всех установленных в системе принтеров - это хорошо
Но, как отобразить список принтеров кроме выключенных из сети, но подключенных к компьютеру?
Опрос системы должен произойти до начала пуска печати.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
15 + 0 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.