previously posted by KeepItCool as indicated:
http://groups.google.co.uk/groups?se...&output=gplain
This should produce exactly what you're looking for
but note it will NOT work for xl97
The PrinterFind function will return an array of
localized strings ready to assign to the ActivePrinter.
I've amended an old post from myself to allow filtering.
see test procedure for example of how to use.
On a userform you could simply use s'th like
cboPrinters.list=PrinterFind
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 laserjets
vaList = PrinterFind(Match:="Laserjet")
'Switch to the first laserjet 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) & sCon & _
Mid(sBuf, InStr(sBuf, ",") + 1, lRet - InStr(sBuf, ","))
Next
'Return the result
PrinterFind = aPrn
End Function
--
Regards,
Tom Ogilvy
"PO" <po> wrote in message news:ODQSHnrEFHA.3596@TK2MSFTNGP12.phx.gbl...
> Hi
>
> Excel 2000
>
> I use the following wsh script to set the default printer:
>
>
> Dim oNet
> Set oNet =WScript.CreateObject("WScript.Network")
>
> oNet.SetDefaultPrinter("hp LaserJet 1300 PCL 5e")
>
> Set oNet=nothing
>
>
> (The port name for that printer is DOT4_002)
> This works fine and the controlpanel is showing that "hp LaserJet..." is
the
> default printer. Excel however indicates that the
Application.DefaultPrinter
> is "unknown". When I set the default printer manually in the controlpanel
> Excel recognizes the default printer to be "hp LaserJet 1300 PCL 5e on
> Ne02:". I don't understand where Excel gets "on Ne02:" from. The portname
> should be DOT4_002.
>
> On some computers Excel still prints correctly to the "hp LaserJet...",
> however on others Excel reports an error.
>
> Any ideas?
>
> TIA
> po
>
>
Bookmarks