Berichte drucken Kein Problem: Dialoge wie die Seiteneinstellungen und der Drucken-Dialog liefern doch alles, was das Herz an Einstellungsmöglichkeiten begehrt. Aber was, wenn Sie mal per VBA eingreifen möchten – zum Beispiel, weil der Benutzer ganz einfach zwei Exemplare eines Dokuments mit einem Mausklick drucken möchte Oder weil Sie zur Laufzeit die Anzahl der Spalten eines Berichts einstellen möchten Dies lässt sich natürlich per VBA erledigen. Dieser Beitrag zeigt, wie es funktioniert.
Alle Drucker auflisten
Wenn auf Ihrem System mehr als ein Drucker installiert ist, was in Anbetracht der vielen gängigen virtuellen Drucker wahrscheinlich ist, möchten Sie diese zunächst auflisten.
Eine durch Semikola getrennte Liste können Sie später beispielsweise als Datensatzherkunft eines Kombinationsfeldes verwenden (s. Bild 1). Zunächst einmal geben wir diese Liste jedoch einfach im Direktfenster aus, und zwar mit diesem Befehl:
Bild 1: Auswahl von Druckern per Kombinationsfeld
Debug.Print Druckerliste
Die dazu passende Funktion Druckerliste hat folgenden Code:
Public Function Druckerliste() As String Dim strTemp As String Dim objDrucker As Printer Dim i As Integer For i = 0 To Printers.Count - 1 Set objDrucker = Printers(i) strTemp = strTemp & ";" & i & ";" & objDrucker.DeviceName Next i If Len(strTemp) > 0 Then strTemp = Mid(strTemp, 2) End If Druckerliste = strTemp End Function
Diese Funktion verwendet die Auflistung Printers, die für alle dem System bekannten Drucker je ein Element enthält. Um alle Drucker zu ermitteln, durchläuft die Funktion eine Schleife über alle enthaltenen Elemenge, wobei die Anzahl mit der Eigenschaft Count der Printers-Auflistung ermittelt wird. Innerhalb der Schleife wird das jeweilige Printer-Element mit der Variablen objDrucker referenziert. Der Index sowie der Druckername werden in einer durch Semikola separierten Liste erfasst, die beispielsweise so aussieht:
0;Snagit 9;1;SnagIt 8;2;PDF-XChange 3.0;3;Microsoft XPS Document Writer;4;HP Officejet 4500 G510a-f;5;Fax;6;Brother QL-570 LE;7;Adobe PDF;8;\\MACBOOKPRO\Canon Inkjet iP2600 series
Ein Printer-Objekt besitzt neben DeviceName noch einige weitere Eigenschaften. Um diese übersichtlich darzustellen, verwenden wir ein Formular.
Dieses enthält ein Kombinationsfeld zur Auswahl des Druckers, das sinnvollerweise mit der Funktion Druckerliste gefüllt wird, sowie einige Steuerelemente, welche weitere Eigenschaften des ausgewählten Printer-Objekts anzeigen.
Nach der Auswahl des Druckers soll das Formular die über das Printer-Objekt verfügbaren Daten wie in Bild 2 anzeigen.
Bild 2: Ausgabe von Druckerinformationen
Dazu soll zunächst beim Öffnen des Formulars das Kombinationsfeld cboDrucker mit dem Ergebnis der Funktion Druckerliste gefüllt werden. Außerdem soll das Kombinationsfeld direkt beim Öffnen des Formulars den ersten Eintrag der Liste anzeigen.
Schließlich sorgt ein Aufruf der Funktion DruckereigenschaftenEinlesen dafür, dass die übrigen Steuerelemente des Formulars gefüllt werden:
Private Sub Form_Load() Me!cboDrucker.RowSource = Druckerliste Me!cboDrucker = Me!cboDrucker.ItemData(0) DruckereigenschaftenEinlesen End Sub
Der Code der Prozedur DruckereigenschaftenEinlesen sieht so aus:
Private Sub DruckereigenschaftenEinlesen() Dim objDrucker As Printer Set objDrucker = Printers.Item(CLng(Me!cboDrucker)) With objDrucker Me!txtBottomMargin = .BottomMargin Me!txtLeftMargin = .LeftMargin Me!txtRightMargin = .RightMargin Me!txtTopMargin = .TopMargin Me!cboColorMode = .ColorMode Me!txtColumnSpacing = .ColumnSpacing Me!txtCopies = .Copies Me!chkDataOnly = .DataOnly Me!chkDefaultSize = .DefaultSize Me!txtDrivername = .DriverName Me!cboDuplex = .Duplex Me!cboItemLayout = .ItemLayout Me!txtItemsAcross = .ItemsAcross Me!txtItemSizeHeight = .ItemSizeHeight Me!txtItemSizeWidth = .ItemSizeWidth Me!cboOrientation = .Orientation Me!cboPaperBin = .PaperBin Me!cboPaperSize = .PaperSize Me!txtPort = .Port Me!cboPrintQuality = .PrintQuality Me!txtRowSpacing = .RowSpacing End With End Sub
Die Prozedur ermittelt zunächst den im Kombinationsfeld cboDrucker ausgewählten Index und liest das entsprechende Printer-Objekt in die Variable objDrucker ein. Danach schreibt sie die Werte der einzelnen Variablen in die entsprechenden Steuerelemente.
Die Eigenschaften erwarten Long– und Boolean-Werte, wobei die Long-Werte teilweise mit Konstanten gefüllt werden können.
Die entsprechenden Konstantenlisten sind in der Eigenschaft Datensatzherkunft der Kombinationsfelder hinterlegt, für das Steuerelement cboOrientation beispielsweise wie folgt:
1;"acPRORPortrait";2;"acPRORLandscape"
Dadurch stehen dann die beiden Zeichenfolgen acPRORPortrait und acPRORLandscape zur Auswahl bereit.
Damit die Daten bei Auswahl eines neuen Druckers im Kombinationsfeld cboDrucker aktualisiert werden, löst dies die Prozedur Nach Aktualisierung des Kombinationsfeldes aus:
Private Sub cboDrucker_AfterUpdate() DruckereigenschaftenEinlesen End Sub
Hier ist zu erwähnen, dass einige Eigenschaften erst in Zusammenhang mit dem zu druckenden Bericht mit sinnvollen Daten gefüllt werden – mehr dazu weiter unten.
Drucker auswählen
Um die Auswahl der Drucker zu erleichtern, haben wir außerdem eine Ereignisprozedur hinterlegt, die beim Betätigen der Nach oben– und der Nach unten-Taste ausgelöst wird und jeweils den nächsten beziehungsweise den vorherigen Eintrag auswählt:
Private Sub cboDrucker_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case 38, 40 Select Case KeyCode Case 38 ''nach oben If CLng(Me!cboDrucker) > 0 Then Me!cboDrucker = Me!cboDrucker - 1 End If Case 40 ''nach unten If CLng(Me!cboDrucker) < Me!cboDrucker.ListCount - 1 Then Me!cboDrucker = Me!cboDrucker + 1 End If End Select DruckereigenschaftenEinlesen KeyCode = 0 End Select End Sub
Da der Index der Printers-Auflistung als gebundene Spalte des Kombinationsfeldes übernommen wurde (also 0, 1, 2…), können Sie durch einfaches Addieren oder Subtrahieren des Wertes 1 den vorherigen oder den folgenden Listeneintrag auswählen.
Standarddrucker für Access festlegen
Für Access ist ein Standarddrucker festgelegt, den Sie beispielsweise im Drucken-Dialog finden (s. Bild 3). Dieser Drucker wird auch etwa beim Drucken von Berichten verwendet, wenn dort kein anderer Drucker festgelegt ist. Um diesen Standarddrucker per VBA festzulegen, haben wir im Formular zur Auswahl der Drucker eine Schaltfläche namens cmdStandarddrucker hinterlegt. Diese löst die folgende Prozedur aus, wobei zunächst der im Kombinationsfeld ausgewählte Drucker ermittelt und dann durch Zuweisung an die Eigenschaft Printer des Application-Objekts als Standarddrucker festgelegt wird:
Bild 3: Der Drucken-Dialog von Access mit dem Standarddrucker
Private Sub cmdStandarddrucker_Click() Dim objDrucker As Printer Set objDrucker = Printers.Item(CLng(Me!cboDrucker)) Application.Printer = objDrucker End Sub
Der hier festgelegte Drucker wird beim Erstellen neuer Berichte als Standarddrucker für diesen Bericht verwendet. Wenn Sie anschließend einen anderen Standarddrucker festlegen, behält der Bericht den zum Zeitpunkt der Erstellung gültigen Standarddrucker.
Standarddrucker für einen Bericht festlegen
Wenn Sie einen Standarddrucker für einen Bericht festlegen möchten, der auch bei änderung des Access-Standarddruckers beibehalten wird, müssen Sie den Bericht im Entwurf öffnen. Wenn Sie diese änderung manuell vornehmen möchten, erledigen Sie dies, indem Sie zunächst den Bericht in der Entwurfsansicht anzeigen und dann den Dialog Seite einrichten öffnen.
Dort wählen Sie unter Drucker für … die Option Spezieller Drucker aus. Mit einem Klick auf die Schaltfläche Drucker… öffnen Sie einen weiteren Dialog, mit dem Sie den gewünschten Dialog auswählen können (s. Bild 4). Das Festlegen eines speziellen Druckers kann beispielsweise sinnvoll sein, wenn die Abmessungen des Berichts auf einen bestimmten Drucker abgestimmt sind.
Bild 4: Festlegen eines speziellen Druckers für einen Bericht
Um diese änderung per VBA vorzunehmen, öffnen Sie den Bericht ebenfalls in der Entwurfsansicht (gegebenenfalls unsichtbar), stellen erst die Eigenschaft UseDefaultPrinter auf False ein und legen dann mit der Eigenschaft Printer den speziellen Drucker fest:
Public Sub BerichtMitEigenemStandarddrucker_Einstellen() Dim objDrucker As Printer Dim rpt As Report Dim strReport As String strReport = "rptBerichtMitStandarddrucker" DoCmd.OpenReport strReport, acViewDesign, , , acHidden Set rpt = Reports(strReport) rpt.UseDefaultPrinter = False rpt.Printer = Printers(6) DoCmd.Close acReport, strReport, acSaveYes End Sub
Anschließend wird der Bericht geschlossen und gespeichert.
Bericht mit einem bestimmten Drucker ausgeben
Das Festlegen eines speziellen Druckers für einen Bericht ist eine Methode, einen Bericht mit einem bestimmten Drucker auszugeben. Es gibt noch zwei weitere Arten, dies durchzuführen.
Die erste funktioniert nur für Berichte, für die kein spezieller Drucker festgelegt wurde. Dort stellen Sie einfach temporär den aktuellen Access-Drucker auf einen alternativen Drucker ein, drucken den Bericht und setzen den Access-Drucker dann wieder auf die Standardeinstellung zurück.
Die zweite Methode gelingt unabhängig davon, ob Sie für den Bericht einen speziellen Drucker festgelegt haben. Dort öffnen Sie den Bericht, stellen den Berichtsdrucker auf einen alternativen Drucker ein, drucken diesen und schließen den Bericht wieder.
Beispiele für diese Vorgehensweise finden Sie im Formular frmDruckerAuswaehlen (s. Bild 5).
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo