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. Abb. 1). Zunächst einmal geben wir diese Liste jedoch einfach im Direktfenster aus, und zwar mit diesem Befehl:

pic001.png

Abb. 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 Abb. 2 anzeigen.

pic002.png

Abb. 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. Abb. 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

Abb. 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

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access im Unternehmen:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 1.000 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar