Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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 строке написано:
If DriverName "" And PrinterPort "" Then


Я написал так, иначе ругается:
If DriverName = "" And PrinterPort = "" Then

Проверьте кто-нибудь еще - может это просто у меня система глючит?

Ответить

Номер ответа: 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
Нашел вот такой код. Может кому и пригодится.
Option Explicit

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

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам