Excel-Drucker mit Erweiterung (z.B. NE01)
Will man einen anderen Drucker mittels Code einstellen, so
hat man das Problem, dass die Drucker von Rechner zu Rechner unterschiedliche
Bezeichnungen haben können.
Zum Beispiel "HPDJ690C auf NE01" auf dem einen Rechner und "HPDJ690C
auf NE05" auf einem anderen. Mein Code liefert
die vollständigen Namen aller Drucker auf einem Rechner. Mit instr auf
"HPDJ690C" lässt sich dann der gewünschte Drucker ermitteln.
Die OS-Version ist wichtig, da die Infos auf unterschiedlichen Wegen geholt
werden müssen. Mein Code funzt unter NT4.0 und WIN 95/98.
Beispieldatei druckerauswahl.zip 18 kB
'Für Win 9x
Private Declare Function lstrcpy Lib "kernel32.dll"
Alias _
"lstrcpyA" (ByVal lpString1 As String,
_
ByVal lpString2 As Long) As Long
Private Declare Function lstrlen Lib "kernel32.dll"
Alias _
"lstrlenA" (ByVal lpString As Long) As
Long
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 Const PRINTER_ENUM_LOCAL = &H2
'Nur NT und Level1
Private Const PRINTER_ENUM_NETWORK = &H40
'Nur NT
Private Const PRINTER_ENUM_CONNECTIONS = &H4
Private Const PRINTER_ENUM_DEFAULT = &H1
'Nur NT und Level1
Private Const PRINTER_ENUM_REMOTE = &H10
'Nur kombiniert mit anderen Konstanten
Private Const PRINTER_ENUM_SHARED = &H20
'Ab hier für NT
Private Declare Function RegEnumValue Lib "advapi32.dll"
Alias _
"RegEnumValueA" (ByVal hKey As Long, ByVal
dwIndex As Long, _
ByVal lpValueName As String, lpcbValueName As Long,
ByVal _
lpReserved As Long, lpType As Long, lpData As Byte,
_
lpcbData As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll"
_
Alias "RegQueryValueExA" (ByVal hKey As
Long, ByVal _
lpValueName As String, ByVal lpReserved As Long,
_
lpType As Long, lpData As Any, lpcbData As Long)
As Long
Private Declare Function RegOpenKeyEx Lib "advapi32.dll"
_
Alias "RegOpenKeyExA" (ByVal hKey As Long,
_
ByVal lpSubKey As String, ByVal ulOptions As Long,
_
ByVal samDesired As Long, phkResult As Long) As
Long
Private Declare Function RegCloseKey Lib "advapi32.dll"
_
(ByVal hKey As Long) As Long
Private Declare Function GetVersionEx Lib "kernel32"
_
Alias "GetVersionExA" (lpVersionInformation
As _
OSVERSIONINFO) As Integer
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const KEY_QUERY_VALUE = &H1
Private Const READ_CONTROL = &H20000
Private Const KEY_READ = (READ_CONTROL Or KEY_QUERY_VALUE
_
Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY)
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Const HKEY_CURRENT_USER = &H80000001
Private Const HKEY_CURRENT_CONFIG = &H80000005
Private Const HKEY_USERS = &H80000003
Private Const HKEY_PERFORMANCE_DATA = &H80000004
Private Const HKEY_DYN_DATA = &H80000006
Private Const Schlüsselname = _
"Software\Microsoft\Windows NT\CurrentVersion\Devices\"
Private Drucker() As String
Public Sub DruckerAnzeigen()
Dim a As Long, b As String
Dim c As Long, Ausgabe As String
Dim OSVersion As OSVERSIONINFO
With OSVersion
.dwOSVersionInfoSize = Len(OSVersion)
.szCSDVersion = Space$(128)
GetVersionEx OSVersion
b = Application.ActivePrinter
If .dwPlatformId = 2 Then
Druckerliste
Else
Druckerliste9x
End If
End With
For a = 1 To UBound(Drucker)
If Ausgabe <> "" Then Ausgabe = Ausgabe &
vbCrLf
Ausgabe = Ausgabe & Drucker(a)
Next
MsgBox Ausgabe
End Sub
' NT
Private Sub Druckerliste()
Dim dummy, hwndSchlüssel&
Dim Länge&, lngIndex&
Dim strFeld As String, lngLänge As Long
Dim arrPuffer() As Byte, strPuffer As String
Dim lngArrLänge As Long, lngPortlänge As Long
ReDim Drucker(1 To 500)
dummy = RegOpenKeyEx(HKEY_CURRENT_USER, _
Schlüsselname, 0&, KEY_READ, hwndSchlüssel)
If dummy <> 0 Then MsgBox "Falscher Schlüssel":
Exit Sub
strFeld = String(1024, 0)
lngLänge = 1023
ReDim arrPuffer(0 To 1000)
Do While RegEnumValue(hwndSchlüssel, lngIndex, _
strFeld, lngLänge, 0&, ByVal 0&, ByVal 0&, ByVal
0&) = 0
Drucker(lngIndex + 1) = Left$(strFeld, lngLänge) & "
auf "
lngArrLänge = 1024
RegEnumValue hwndSchlüssel, lngIndex, strFeld, _
lngLänge, 0&, 0&, arrPuffer(0), lngArrLänge
strPuffer = (StrConv(arrPuffer, vbUnicode))
lngPortlänge = InStr(1, strPuffer, ":") - _
InStr(1, strPuffer, ",")
strPuffer = Mid$(strPuffer, InStr(1, strPuffer, ":")
- 4, _
lngPortlänge)
Drucker(lngIndex + 1) = Drucker(lngIndex + 1) & strPuffer
lngIndex = lngIndex + 1
strFeld = String(1024, 0)
lngLänge = 1023
Loop
ReDim Preserve Drucker(1 To lngIndex + 1)
dummy = RegCloseKey(hwndSchlüssel)
End Sub
'##########################################
'Nur für Win 9x
'##########################################
Private Sub Druckerliste9x()
Dim arrBuffer() As Long, lngLänge As Long
Dim lngZähler As Long, lngAnzahl As Long
Dim lngRück As Long, lngBuffZähler As Long
Dim PrinterTyp As Long, strDrucker As String
ReDim arrBuffer(1)
PrinterTyp = PRINTER_ENUM_CONNECTIONS Or PRINTER_ENUM_LOCAL _
Or PRINTER_ENUM_NETWORK
'Buffergröße ermitteln
lngRück = EnumPrinters(PrinterTyp, _
vbNullString, 2, arrBuffer(0), 0&, _
lngLänge, lngAnzahl)
'Buffer bereitstellen
ReDim arrBuffer(0 To (lngLänge + 3) \ 4)
'Infos über Drucker holen
lngRück = EnumPrinters(PrinterTyp, vbNullString, _
2, arrBuffer(0), lngLänge, lngLänge, lngAnzahl)
If lngAnzahl = 0 Then MsgBox "Keine Drucker verfügbar":
Exit Sub
ReDim Drucker(1 To lngAnzahl)
For lngZähler = 1 To lngAnzahl
lngBuffZähler = lngBuffZähler + 1
strDrucker = StringVonPointer(arrBuffer(lngBuffZähler))
lngBuffZähler = lngBuffZähler + 2
strDrucker = strDrucker & " auf "
strDrucker = strDrucker & _
StringVonPointer(arrBuffer(lngBuffZähler))
Drucker(lngZähler) = strDrucker
lngBuffZähler = lngBuffZähler + 18
Next
End Sub
Private Function StringVonPointer(plngAscii As Long)
As String
Dim lngAnzahl&, strName$
lngAnzahl = lstrlen(plngAscii)
strName = String(lngAnzahl, 0)
lstrcpy strName, plngAscii
If InStr(1, strName, Chr(0)) <> 0 Then
strName = Left$(strName, InStr(1, strName, Chr(0)) - 1)
End If
StringVonPointer = strName
End Function