Standarddrucker auslesen

13/01/2010 - 08:54 von Manste | Report spam
Hallo,

ich habe ein Formular entworfen, in dem es Makros für Reinschrift
Drucken und Entwurf drucken gibt. Reinschrift Drucken beinhaltet:
Verborgener Text wird mit ausgedruckt. Außerdem soll bei der
Reinschrift die erste Seite auf Kopfbogen (Papierschacht 1) und die
Folgeseiten auf leeres Papier (Papierschacht 2). Dies erreiche ich
durch das Makro - Seite einrichten - Format - Leider arbeiten wir
im Haus mit ca. 8 verschiedenen Kyocera-Druckern und das Makro "Seite
einrichten" funktioniert nicht bei allen Druckern (je nachdem welcher
Druckertreiber installiert ist). Jetzt bin ich auf die Idee gekommen,
den Standarddrucker auslesen zu lassen und dass ganze dann über If
oder Case zu machen. S. Beispiel

Sub Standarddrucker_auslesen()

Dim Standarddrucker As String
Standarddrucker = Application.ActivePrinter

MsgBox Application.ActivePrinter 'soweit funktioniert es gut.

If Standarddrucker = "Kyocera FS-1030D KX on NE05:" Then
... Seite einrichten
... Drucken ohne verborgenen Text
End If

Sub End

Leider gibt er mir über die Messagebox nicht nur den Namen des
Standarddruckers sondern jeweils auch noch den Zusatz "on NE05:"
zurück. Je nach Drucker steht hier immer eine andere Zahl. Deshalb
funktioniert das ganze auch bisher nicht.

Jetzt meine Frage:

Was bedeutet dieses "on NE05:"? Gibt es eine Möglichkeit in der If-
Abfrage mit einem generischen Zeichen zu arbeiten, ihm also zu sagen
wenn der Name Kyocera FS-1030D KX * ist, dann ?

Oder weiß jemand noch eine andere Lösung, wie ich das Problem in den
Griff bekomme?

Wir arbeiten mit Win xp (SP3) und Office 2007

Gruß
Manste
 

Lesen sie die antworten

#1 Christian Freßdorf
13/01/2010 - 15:11 | Warnen spam
Hi

ich verwende folgenden Code:

Sub Drucker2ComboBox1()
Dim strPrinters As Variant, x As Long
strPrinters = ListPrinters ' Drucker einlesen
'Fist check whether the array is filled with anything, by calling another function, IsBounded.
If IsBounded(strPrinters) Then
For x = LBound(strPrinters) To UBound(strPrinters)
ComboBox1.AddItem strPrinters(x)
Next x
Else
Debug.Print "No printers found"
End If
strPrinter = Application.ActivePrinter
For x = LBound(strPrinters) To UBound(strPrinters)
If strPrinter Like "*" & strPrinters(x) & "*" Then
If ComboBox1.ListCount > 0 Then ComboBox1.ListIndex = x
Exit For
End If
Next x
End Sub
Public Function IsBounded(vArray As Variant) As Boolean

'If the variant passed to this function is an array, the function will return True;
'otherwise it will return False
On Error Resume Next
IsBounded = IsNumeric(UBound(vArray))

End Function


Und zum Ermitteln der Drucker:
Option Explicit
Const PRINTER_ENUM_CONNECTIONS = &H4
Const PRINTER_ENUM_LOCAL = &H2
Const c_cap = "Dateiübersicht: "
' Printer
Private Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" _
(ByVal Flags As Long, ByVal Name As String, ByVal Level As Long, _
pPrinterEnum As Long, ByVal cdBuf As Long, pcbNeeded As Long, _
pcReturned As Long) As Long
Private Declare Function StrLen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Long) As Long
Private Declare Function PtrToStr Lib "kernel32" Alias "lstrcpyA" _
(ByVal RetVal As String, ByVal Ptr As Long) As Long

Sub Test_AusgabederDrucker()
Dim ar As Variant
Dim i As Integer
ar = ListPrinters
For i = LBound(ar) To UBound(ar)
Debug.Print ar(i)
Next i
End Sub
Public Function ListPrinters() As Variant

Dim bSuccess As Boolean
Dim iBufferRequired As Long
Dim iBufferSize As Long
Dim iBuffer() As Long
Dim iEntries As Long
Dim iIndex As Long
Dim strPrinterName As String
Dim iDummy As Long
Dim iDriverBuffer() As Long
Dim strPrinters() As String

iBufferSize = 3072

ReDim iBuffer((iBufferSize \ 4) - 1) As Long

'EnumPrinters will return a value False if the buffer is not big enough
bSuccess = EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
PRINTER_ENUM_LOCAL, vbNullString, _
1, iBuffer(0), iBufferSize, iBufferRequired, iEntries)

If Not bSuccess Then
If iBufferRequired > iBufferSize Then
iBufferSize = iBufferRequired
Debug.Print "iBuffer too small. Trying again with "; _
iBufferSize & " bytes."
ReDim iBuffer(iBufferSize \ 4) As Long
End If
'Try again with new buffer
bSuccess = EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
PRINTER_ENUM_LOCAL, vbNullString, _
1, iBuffer(0), iBufferSize, iBufferRequired, iEntries)
End If

If Not bSuccess Then
'Enumprinters returned False
MsgBox "Error enumerating printers."
Exit Function
Else
'Enumprinters returned True, use found printers to fill the array
ReDim strPrinters(iEntries - 1)
For iIndex = 0 To iEntries - 1
'Get the printername
strPrinterName = Space$(StrLen(iBuffer(iIndex * 4 + 2)))
iDummy = PtrToStr(strPrinterName, iBuffer(iIndex * 4 + 2))

strPrinters(iIndex) = strPrinterName '& " an " & Form_Load(strPrinterName)
Next iIndex
End If

ListPrinters = strPrinters

End Function


Gruß Christian
~~~~~~~~~~~~
Antworten / Rückmeldungen nur in die NG!
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)

Ähnliche fragen