Страница: 1 |
Страница: 1 |
Вопрос: Как программно выбрать нужный системный принтер?
Добавлено: 05.04.07 10:24
Автор вопроса: LonerWanderer
Необходимо установить альбомную ориентацию листа и подогнать размер печатаемой области под размер листа (Excel).
Но возникла небольшая проблема: как программно узнать, какой принтер стоит в системе?
Принтер у пользователя может называться и "HP A3" и "A3 HP Color InkJet 1700" и просто "A3".
Можно ли каким-то образом программно выбрать именно тот принтер, в названии которого присутствует "A3"?
Просто при установке размера листа А3 на принтере, который этот размер не поддерживает, программа вылетает с ошибкой.
Заранее спасибо.
Ответы
Всего ответов: 4
Номер ответа: 1
Автор ответа:
SkyShark
ICQ: 209750501
Вопросов: 0
Ответов: 13
Профиль | | #1
Добавлено: 05.04.07 11:21
Можно определить список принтеров и и выставить по умолчанию, тот который удовлетворяет вашим условиям.
Я лично не пробовал, но .... почитайте тут
http://www.hostmake.ru/articles/visualbasic/222/
вдруг поможет.
Номер ответа: 2
Автор ответа:
LonerWanderer
Вопросов: 18
Ответов: 66
Профиль | | #2
Добавлено: 05.04.07 11:31
К сожалению не помогло.
По крайней мере у меня в XPюше не работает.
Даже под VB - без портирования под VBA.
Кстати, там код маленько неправильный (или это у меня VB6 глючит):
в 150 строке написано:
Я написал так, иначе ругается:
Проверьте кто-нибудь еще - может это просто у меня система глючит?
Номер ответа: 3
Автор ответа:
SkyShark
ICQ: 209750501
Вопросов: 0
Ответов: 13
Профиль | | #3
Добавлено: 05.04.07 13:55
Этот код у меня тоже не пошел. Для разбор пока нет времени.
Вот еще, опять же пока не проверял ))))
Controlling the Printer from Word VBA
http://pubs.logicalexpressions.com/pub0009/LPMFrame.asp?CMD=ArticleSearch
Номер ответа: 4
Автор ответа:
LonerWanderer
Вопросов: 18
Ответов: 66
Профиль | | #4
Добавлено: 06.06.07 16:39
Нашел вот такой код. Может кому и пригодится.
Private Declare Function GetProfileString Lib "kernel32" _
Alias "GetProfileStringA" (ByVal lpAppName As String, _
ByVal lpKeyName As String, ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long) As Long
Sub Test()
Dim vaList
'Get all printers
vaList = PrinterFind
'Show m
MsgBox Join(vaList, vbLf), , "List of printers"
'Get all printers with A3 paper size
vaList = PrinterFind(Match:="A3"
'Switch to the first "A3 paper size" found
If UBound(vaList) = -1 Then
MsgBox "Printer not found"
ElseIf MsgBox("from " & vbTab & ": " & ActivePrinter & vbLf & _
"to " & vbTab & ": " & vaList(0), _
vbOKCancel, "Switch Printers" = vbOK Then
Application.ActivePrinter = vaList(0)
End If
End Sub
Public Function PrinterFind(Optional Match As String) As String()
Dim n%, lRet&, sBuf$, sCon$, aPrn$()
Const lLen& = 1024, sKey$ = "devices"
'------------------------------------------------------------------
'written by keepITcool
'requires xl2000 or newer.
'returns a zerobased array of complete localized printer strings
'results are filtered on Match string, if no result the ubound = -1
'------------------------------------------------------------------
'Split ActivePrinter string to get localized word for "on"
aPrn = Split(Excel.ActivePrinter)
sCon = " " & aPrn(UBound(aPrn) - 1) & " " '
'Read all installed printers (1k bytes s/b enough)
sBuf = Space(lLen)
lRet = GetProfileString(sKey, vbNullString, vbNullString, sBuf, lLen)
If lRet = 0 Then
Err.Raise vbObjectError + 513, , "Can't read Profile"
Exit Function
End If
'Split buffer string
aPrn = Split(Left(sBuf, lRet - 1), vbNullChar)
'Filter array on Match
If Match <> vbNullString Then aPrn = Filter(aPrn, Match, -1, 1)
For n = LBound(aPrn) To UBound(aPrn)
'Add 16bit portname for each Printer
sBuf = Space(lLen)
lRet = GetProfileString(sKey, aPrn(n), vbNullString, sBuf, lLen)
aPrn(n) = aPrn(n) & " (" & Mid(sBuf, InStr(sBuf, "," + 1, lRet - InStr(sBuf, "," - 1) & ""
Next
'Return the result
PrinterFind = aPrn
End Function