ник: k@s
'Может отсюда можно что то выдернуть
Option Explicit
Option Base 0
Private Const PRINTER_ENUM_LOCAL = &H2 'Принтеры, установленные на данной машине
Private Type PRINTER_INFO_5 'Структура для InfoLevel=5
pPrinterName As String 'Имя принтера (имя иконки в панели "Принтеры")
pPortName As String '"<порт>:" или "\\<сетевой адрес>" устройства
dwAttrs As Long
dwDevNotSelectedTimeout As Long
dwTransmissRetryTimeout As Long
End Type
Private Declare Function StrCopy Lib "kernel32.dll" _
Alias "lstrcpyA" _
(ByVal lpStrDst As String, lpStrSrc As Any) As Long
Private Declare Function StrLen Lib "kernel32.dll" _
Alias "lstrlenA" (lpStrSrc As Any) As Long
Private Declare Function EnumPrinters Lib "winspool.drv" _
Alias "EnumPrintersA" _
(ByVal Flags As Long, ByVal lpsPrnName As String, _
ByVal InfoLevel As Long, _
pEnumArray As Any, ByVal pEnumArraySize As Long, _
pNeededBytes As Long, pReturnedCount As Long) As Long
Function ПринтерПоУмолчанию(МаскаИмени As String, _
Optional МаскаПорта As String) As String
'Задает принтер поумолчанию на основе заданной маски его имени [и имени порта]
Dim res As Long, need As Long, cnt As Long, i As Long
Dim buf() As Long
Dim inf() As PRINTER_INFO_5
ReDim inf(0)
ReDim buf(255) 'Работаем через промежуточный 32бит-буфер
res = EnumPrinters(PRINTER_ENUM_LOCAL, vbNullString, 5, _
buf(0), (UBound(buf) + 1) * LenB(buf(0)), _
need, cnt)
If res <> 1 Then 'Буфер слишком мал - переопределяем
ReDim buf(need \ (LenB(inf(0)) \ 4))
res = EnumPrinters(PRINTER_ENUM_LOCAL, vbNullString, 5, _
buf(0), (UBound(buf) + 1) * LenB(buf(0)), _
need, cnt)
End If
If res = 1 Then 'Переносим содержимое буфера в массив структур
If cnt > 0 Then 'Количество принтеров в системе
ReDim inf(cnt - 1) 'Резервируем массив структур
For i = 0 To cnt - 1 'Переносим только строки
inf(i).pPrinterName = Space(StrLen(ByVal buf(5 * i)))
Call StrCopy(inf(i).pPrinterName, ByVal buf(5 * i))
inf(i).pPortName = Space(StrLen(ByVal buf(5 * i + 1)))
Call StrCopy(inf(i).pPortName, ByVal buf(5 * i + 1))
Next i
Else
Exit Function 'Нет установленных принтеров на данном компьютере
End If
Else
Exit Function 'Ошибка вызова EnumPrinters()
End If
For i = LBound(inf) To UBound(inf)
If UCase(inf(i).pPrinterName) Like UCase(МаскаИмени) Then
If IsMissing(МаскаПорта) Or Len(МаскаПорта) = 0 Then
ПринтерПоУмолчанию = inf(i).pPrinterName & _
" (" & inf(i).pPortName & ")"
Exit For
Else 'Поиск по двум маскам
If UCase(inf(i).pPortName) Like UCase(МаскаПорта) Then
ПринтерПоУмолчанию = inf(i).pPrinterName & _
" (" & inf(i).pPortName & ")"
Exit For
End If
End If
End If
Next i
'Возвращает "<имя> (<порт>:)", "<имя> (\\<сетевой адрес>)",
'Или пустую строку
End Function
там циклом For i = LBound(inf) To UBound(inf) идет перебор всех твоих принтеров, которые вернул API-вызов
в экселе так: (нужно по дефолту проставить сетевой HP 5Si Mx PS, если он привязан на клиенте):
Application.ActivePrinter =ПринтерПоУмолчанию("*5Si*")