Drucker im Griff

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:

pic001.png

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.

pic002.png

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:

pic003.png

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.

pic004.png

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

Schreibe einen Kommentar