Форумы HiProg.com - MS ACCESS, VBA, VB

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

ник: 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*")


Ваше имя:

Пароль:

Цитировать: [quote][/quote] Код: [code][/code]
Жирный: [b][/b] Наклонный: [i][/i]
URL: [url][/url] 

Сообщение:

 Размер файла не более 50 Кбт. Большие файлы можно размещать на www.slil.ru

Прикрепить:

 

Для вставки смайлов в текст щелкните по значку.