ACCESS-Bericht an verschiedene Drucker senden

Und noch ein Problem:

Aus einer ACCESS-Anwendung heraus kann der Benutzer einen Bericht drucken - es stehen aber verschiedene Drucker zur Verfügung. Wie kann ich einen speziellen Drucker direkt ansteuern, ohne den Anwender über das bekannte Druckermenü „schicken“ zu müssen?

Besten Dank für eure Hilfe!

Matthias

Die übliche Strategie ist, den Bericht für den Standarddrucker zu entwerfen und dann den Standarddrucker über die API umzusetzen, z.B. so:

Public Const HWND\_BROADCAST = &HFFFF
Public Const WM\_WININICHANGE = &H1A

Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
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
Declare Function WriteProfileString Lib "kernel32" Alias "WriteProfileStringA" (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As Long

Public Function SetDefaultPrinter(PrName As String)
' Parameter: Druckername
' Rückgabewert: Erfolg der Aktion
Dim Buffer As String, RW, Tmp As String
On Error GoTo Er

 Buffer = String(255, 0)
 RW = GetProfileString(ByVal "devices", ByVal PrName, ByVal "", Buffer, Len(Buffer))
 If RW 1 Then
 SetDefaultPrinter = False
 Exit Function
 End If
' und mitteilen, daß sich die WIN.INI geändert hat
 RW = SendMessage(HWND\_BROADCAST, WM\_WININICHANGE, 0&, 0&amp:wink:
 SetDefaultPrinter = True

Ex:
 Exit Function

Er:
 MsgBox "SetDefaultPrinter: " & Err.Description
 SetDefaultPrinter = False
 Resume Ex

End Function

Reinhard

Super, danke, klappt perfekt - wenn ich den Namen des Standarddruckers weiss. Ich kenne aber nur den Spezialdrucker, die einzelnen Arbeitsplätze verwenden unterschiedliche Drucker. Ich möchte nun aber nach dem Senden an den Spezialdrucker die Einstellungen wieder zurücksetzen. Schwierig?

Matthias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Dann musst du dir wohl den Namen des Druckers vorher merken:

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

Public Function GetDefaultPrinter()
' Rückgabewert: Standarddrucker
' (In der Form: Druckername,Treibername,Gerätename)
' Z.B. HP LaserJet III,HPPCL5MS,LPT1:
Dim Tmp As String, RW, Res
On Error GoTo Er

 Res = ""
 Tmp = String(256, 0)
 RW = GetProfileString("Windows", "Device", "", Tmp, Len(Tmp))
 If RW \> 0 Then Res = Mid(Tmp, 1, RW)

Ex:
 GetDefaultPrinter = Res
 Exit Function

Er:
 MsgBox "GetDefaultPrinter: " & Err.Description
 Resume Ex

End Function