Problemstellung:
Für 32Bit und 64Bit Office Versionen
Wie kann ich beim Berichtsdruck den Standarddrucker wechseln, ohne Druckerdialog?
Voraussetzungen:
Da es das Printer-Objekt erst ab AXP gibt, ist das Bsp erst AXP lauffähig.
Es werden 2 Möglichkeiten vorgestellt:
1. Einlesen allen verfügbaren Drucker und einiger Eigenschaften in eine Tabelle
2. Alle verfügbaren Drucker werden direkt in eine Kombobox eingelesen.
Das Sub "GetAllPrinters" liest alle im System verfügbaren Drucker in die Tabelle "tbl_Printers" ein.
Public Sub GetAllPrinters() '---------------------------------------------------------------------------- ' Procedure : GetAllPrinters ' DateTime : 05.08.2005 15:35 ' Author : TommyK ' Purpose : Liest alle verfügbaren Drucker in die angegebene Tabelle ein ' Inputs : ohne ' Output : ' Example : GetAllPrinters '---------------------------------------------------------------------------- On Error GoTo GetAllPrinters_Error Dim prtLoop As Printer Dim rst As DAO.Recordset Dim i As Integer i = 0 CurrentDb.Execute ("DELETE tbl_Printers.ID FROM tbl_Printers;") Set rst = CurrentDb.OpenRecordset("tbl_Printers") For Each prtLoop In Application.Printers With prtLoop rst.AddNew rst!ID_Index = i rst!DeviceName = .DeviceName rst!DriverName = .DriverName rst!Port = .Port rst!PaperBin = .PaperBin rst!PaperSize = .PaperSize rst!ColorMode = .ColorMode rst!PrintQuality = .PrintQuality rst!Ausrichtung = .Orientation rst.Update End With i = i + 1 Next prtLoop rst.Close: Set rst = Nothing On Error GoTo 0 Exit Sub GetAllPrinters_Error: Dim strErrString As String strErrString = "Error Information..." & vbCrLf strErrString = strErrString & "Error#: " & Err.Number & vbCrLf strErrString = strErrString & "Description: " & Err.Description MsgBox strErrString, vbCritical + vbOKOnly, "Error in procedure GetAllPrinters of Modul mod_Printers" End Sub
Diese Methode hat den Vorteil das noch mehrere Eigenschaften der Drucker mit eingelesen werden.
Die genaue Bedeutung der Konstanten ist im Objektkatalog des Printer-Objekts nachzuschlagen.
In der Bsp-DB gehe ich nur auf die Eigenschaft "Ausrichtung" und "Anzahl der Kopien" ein.
Die 2. Möglichkeit ist das Einlesen aller Drucker, mittels AddItem-Methode in ein Kombinationsfeld, Sub "FillPrinter"
Public Sub FillPrinter(ctlPrinterkombi As ComboBox) '--------------------------------------------------------------------------------------- ' Procedure : FillPrinter ' DateTime : 05.08.2005 15:33 ' Author : TommyK ' Purpose : Liest alle verfügbaren Drucker in die angegebene Kombobox ein ' Inputs : ctlPrinterkombi = Name des Kombifeldes ' Output : ' Example : FillPrinter Me.MeinKombo '--------------------------------------------------------------------------------------- On Error GoTo FillPrinter_Error ctlPrinterkombi.RowSource = "" Dim prtLoop As Printer Dim i As Integer i = 0 For Each prtLoop In Application.Printers With prtLoop ctlPrinterkombi.AddItem i & ";" & .DeviceName End With i = i + 1 Next prtLoop On Error GoTo 0 Exit Sub FillPrinter_Error: Dim strErrString As String strErrString = "Error Information..." & vbCrLf strErrString = strErrString & "Error#: " & Err.Number & vbCrLf strErrString = strErrString & "Description: " & Err.Description MsgBox strErrString, vbCritical + vbOKOnly, "Error in procedure FillPrinter of Modul mod_Printers" End Sub
Da diese Sub Public ist, muss ihr das Kombifeld beim Aufruf übergeben werden.
Kommen wir nun zum eigentlichen Wechsel des Standarddruckers. Sub "ChangePrinter"
Public Sub ChangePrinter(sReportName As String, iPrtIndex As Integer, _ Optional lngCopies As Long = 1, _ Optional lngAusrichtung As Long = 1) '------------------------------------------------------------------------------ ' Procedure : ChangePrinter ' DateTime : 05.08.2005 15:36 ' Author : TommyK ' Purpose : wechselt den Standarddrucker für den gewählten Bericht ' Inputs : sReportName = Name des Berichts, ' iPrtIndex = Index des gewählten Druckers ' lngCopies = Anzahl der Kopien, lngAusrichtung = 1 = Hochformat, ' 2 = Querformat ' Output : ' Example : ChangePrinter "rpt_MeinBericht", 1 ' Würde den Bericht "rpt_MeinBericht" auf dem 2. Drucker des Systems ' mit 1 Kopie und im Hochformat ausgeben '-------------------------------------------------------------------------------- Dim prtDefault As Printer Dim prtReportPrinter As Printer Dim prtPrinter As Printer On Error GoTo ChangePrinter_Error Set prtDefault = Application.Printer Set prtPrinter = Application.Printers(iPrtIndex) Application.Printer = prtPrinter DoCmd.OpenReport sReportName, acViewDesign, acHidden Set prtReportPrinter = Reports(sReportName).Printer With Reports(sReportName).Printer .Copies = lngCopies .Orientation = lngAusrichtung End With DoCmd.OpenReport sReportName, acViewNormal DoCmd.Close acReport, sReportName, acSaveNo Set prtReportPrinter = Nothing Application.Printer = prtDefault On Error GoTo 0 Exit Sub ChangePrinter_Error: Dim strErrString As String strErrString = "Error Information..." & vbCrLf strErrString = strErrString & "Error#: " & Err.Number & vbCrLf strErrString = strErrString & "Description: " & Err.Description MsgBox strErrString, vbCritical + vbOKOnly, "Error in procedure ChangePrinter of Modul mod_Printers" End Sub
Der Sub müssen 2 Parameter übergeben werden und 2 können übergeben werden
Pflicht:
1. Name des Berichtes
2. Index des gewählten Druckers (Der Index wird bei beiden Möglichkeiten automatisch ermittelt und ist in den Kombifelden vorhanden)
Optional:
1. Anzahl der Kopien (Standardwert=1)
2. Hoch- oder Querformat (Im Tabellenbeispiel wird dieser Wert mit ausgelesen und kann über die Optionsgruppe geändert werden,
Sonst Standardwert=Hochformat.
Aufruf der Sub z.B.:
ChangePrinter "rpt_Printers", 2, 3, 2
würden den Bericht "rpt_Printers" auf dem 3. Drucker des System mit 3 Kopien im Querformat ausgeben.
Das Ändern des Druckers ist nur Temporär, da die Änderungen nicht gespeichert werden.
Für 32Bit und 64Bit Office Versionen
Änderung des Standarddruckers mittels VBA
Die Zip-Datei enthält eine Version ab AXP/02
Ähnliche Artikel
Weiterlesen...