Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA: Automatisch auf richtigem Drucker drucken

VBA: Automatisch auf richtigem Drucker drucken
Martin
Hallo,
nach vielen Fehlversuchen bitte ich euch nach längerer Zeit mal wieder um Hilfe.
Der Sachverhalt:
Wir benutzen in der Firma zwei verschiedene Drucker und vergessen ständig (da schließe ich mich ein) den richtigen Drucker vor dem Druckauftrag auszuwählen. Dadurch entstehen unnötig Papiermüll und Kosten (für Toner bzw. Papier) und es geht Zeit verloren.
Die Lösungsidee:
Da der eine Drucker ausschließlich zum Druck von Urkunden eingesetzt wird, soll einfach nur der Excel-Tabellenname auf den Inhalt "Urkunde" kontrolliert und automatisch der richtige Drucker von Excel ausgewählt werden. Über das BeforePrint-Ereignis könnte ich per MsgBox hinweisen lassen, wenn der falsche Drucker ausgewählt wurde bzw. mit "Cancel = True" den Druckvorgang abbrechen. Allerdings wäre es optimal, wenn Excel automatisch den richtigen Drucker wählt.
Das Problem:
Ich habe folgenden VBA-Code geschrieben, der aber leider nicht funktioniert:

Private Sub Workbook_BeforePrint(Cancel As Boolean)
'Kontrolle, ob Urkunde gedruckt wird
If InStr(LCase(ActiveSheet.Name), "urkunde") > 0 Then
'Urkunden-Drucker
Application.ActivePrinter = "Urkunden-Drucker auf Ne06:"
Else 'Standarddrucker
Application.ActivePrinter = "Dokumenten-Drucker auf Ne04:"
End If
End Sub
Hinweis: In der Eile wird zu oft in der Symbolleiste auf das Druckersymbol geklickt, also ein separates Druckmakro hat daher leider nicht viel gebracht. Ein "BeforePrint"-Ereignis wäre daher ideal und 100% sicher.
Für Lösungsansätze wäre ich sehr dankbar.
Viele Grüße
Martin
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Sind die Druckernamen auf allen PCs identisch ?
14.07.2010 15:08:37
NoNet
Hallo Martin,
das Makro könnte schon funktionieren, allerdings müssten die Druckernamen auf allen PCs identisch sein - insbesondere der Anschluss (Port) Ne06: und Ne04:.
Mit folgendem Konstrukt, kannst Du den Drucker ändern, ohne auf den Port achten zu müssen - dieser wird hier automatisch ermittelt :
Option Base 0
Const MAX_PRINTERS = 32
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
Dim strPrinterNames(MAX_PRINTERS) As String     'Hier erscheint der Druckername (z.B. "Adobe  _
PDF")
Dim strPrinterDrivers(MAX_PRINTERS) As String   'Hier erscheint der Treiber bzw. Spoolername
Dim strPrinterPorts(MAX_PRINTERS) As String     'Hier erscheint der Druckerpot (Ne01: etc.)
Dim intPrinterCount As Integer
Private Sub Workbook_BeforePrint(Cancel As Boolean)
'Kontrolle, ob Urkunde gedruckt wird
If InStr(LCase(ActiveSheet.name), "urkunde") > 0 Then
'Urkunden-Drucker
DruckerAendern "Urkunden-Drucker"
Else 'Standarddrucker
DruckerAendern "Dokumenten-Drucker"
End If
End Sub
Sub DruckerAendern(strDrucker)
'Bitte nur dieses Makro starten !!
Dim r As Long
Dim Buffer As String
Dim i As Integer
Dim strOldPrinter As String
' Liste aller Drucker aus der Registry auslesen
Buffer = Space(8192)
r = GetProfileString("PrinterPorts", vbNullString, "", Buffer, Len(Buffer))
' Druckernamen und -ports parsen
GetPrinterNames Buffer
GetPrinterPorts
strOldPrinter = Application.ActivePrinter 'alten Standarddrucker sichern
For i = 1 To intPrinterCount
If strPrinterNames(i) = strDrucker Then
Application.ActivePrinter = strPrinterNames(i) & " auf " & strPrinterPorts(i)
End If
'MsgBox strPrinterNames(i) & " / " & strPrinterPorts(i) & " / " & strPrinterDrivers(i)
Next i
'MsgBox Application.ActivePrinter, , "Neuer Standarddrucker :"
Application.ActivePrinter = strOldPrinter 'alten Standarddrucker wieder herstellen
End Sub
'Diese Makros bitte NICHT manuell starten !
Private Sub GetPrinterNames(ByVal Buffer As String)
Dim i As Integer
Dim strName As String
intPrinterCount = 0
Do
i = InStr(Buffer, Chr(0))
If i > 0 Then
strName = Left(Buffer, i - 1)
If Len(Trim(strName)) > 0 Then
strPrinterNames(intPrinterCount) = Trim(strName)
intPrinterCount = intPrinterCount + 1
End If
Buffer = Mid(Buffer, i + 1)
Else
If Len(Trim(Buffer)) > 0 Then
strPrinterNames(intPrinterCount) = Trim(Buffer)
intPrinterCount = intPrinterCount + 1
End If
Buffer = ""
End If
Loop While (i > 0) And (intPrinterCount  0 Then
DriverName = Left(Buffer, iDriver - 1)
iPort = InStr(iDriver + 1, Buffer, ",")
If iPort > 0 Then
PrinterPort = Mid(Buffer, iDriver + 1, _
iPort - iDriver - 1)
End If
End If
End Sub
Ich hoffe, das klappt wie gewünscht.
Gruß, NoNet
Anzeige
AW: Sind die Druckernamen auf allen PCs identisch ?
14.07.2010 15:29:38
Martin
Hallo NoNet,
herzlichen Dank für deine Hilfe. Ich hätte nicht gedacht, dass ein so kleiner Wunsch gleich so viel VBA-Code benötigt. Das hätte ich garantiert nicht allein hinbekommen!
Dein Code funktioniert, allerdings musste ich eine Zeile am Ende des Makros "DruckerAendern" deaktivieren:
'Application.ActivePrinter = strOldPrinter 'alten Standarddrucker wieder herstellen

Ich bin dir wirklich sehr dankbar!
Viele Grüße
Martin
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Automatisches Drucken mit VBA in Excel


Schritt-für-Schritt-Anleitung

Um den richtigen Drucker in Excel automatisch auszuwählen, kannst du den folgenden VBA-Code verwenden. Dieser Code überprüft den Namen des aktiven Arbeitsblatts und wählt je nach Inhalt den entsprechenden Drucker aus:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Klicke im Projekt-Explorer auf ThisWorkbook.
  3. Füge den folgenden Code in das Codefenster ein:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    ' Kontrolle, ob Urkunde gedruckt wird
    If InStr(LCase(ActiveSheet.Name), "urkunde") > 0 Then
        ' Urkunden-Drucker
        Application.ActivePrinter = "Urkunden-Drucker auf Ne06:"
    Else
        ' Standarddrucker
        Application.ActivePrinter = "Dokumenten-Drucker auf Ne04:"
    End If
End Sub
  1. Speichere die Arbeitsmappe als Makro-fähige Datei (.xlsm).
  2. Teste den Druckvorgang, um sicherzustellen, dass der richtige Drucker ausgewählt wird.

Häufige Fehler und Lösungen

  • Fehler: "Drucker nicht gefunden"

    • Lösung: Stelle sicher, dass der Druckername genau übereinstimmt. Du kannst eine Liste der verfügbaren Drucker in Windows überprüfen.
  • Fehler: VBA-Code funktioniert nicht auf allen PCs

    • Lösung: Achte darauf, dass die Druckernamen und Ports auf allen PCs identisch sind. Alternativ kannst du den Code anpassen, um die Druckernamen dynamisch zu ermitteln.

Alternative Methoden

Falls du eine flexiblere Lösung benötigst, kannst du die Drucker dynamisch ermitteln, ohne die Ports manuell anzugeben. Hier ist ein Beispielcode:

Private Sub Workbook_BeforePrint(Cancel As Boolean)
    If InStr(LCase(ActiveSheet.Name), "urkunde") > 0 Then
        DruckerAendern "Urkunden-Drucker"
    Else
        DruckerAendern "Dokumenten-Drucker"
    End If
End Sub

Sub DruckerAendern(strDrucker As String)
    ' Hier wird der Drucker dynamisch geändert
    ' (Code zur Ermittlung der Drucker und Ports)
End Sub

Diese Methode ist besonders nützlich, wenn du häufig zwischen verschiedenen Druckern wechselst.


Praktische Beispiele

Hier sind einige Anwendungsszenarien, in denen dieser VBA-Code nützlich ist:

  • Urkunden drucken: Wenn du regelmäßig Urkunden drucken musst, sorgt der Code dafür, dass immer der richtige "Urkundendrucker" verwendet wird.
  • Berichte drucken: Du kannst den Code anpassen, um verschiedene Drucker für unterschiedliche Berichtstypen zu verwenden.

Tipps für Profis

  • Fehlerprotokollierung: Füge eine Protokollierungsfunktion hinzu, um festzuhalten, welcher Drucker verwendet wurde und ob Fehler aufgetreten sind.
  • Benutzerdefinierte Druckdialoge: Entwickle benutzerdefinierte Dialoge, um dem Benutzer die Auswahl des Druckers zu erleichtern.
  • Regelmäßige Wartung: Halte den VBA-Code aktuell, insbesondere wenn sich Druckernamen oder -konfigurationen ändern.

FAQ: Häufige Fragen

1. Warum funktioniert der VBA-Code nicht?
Es könnte sein, dass die Druckernamen auf deinem PC anders sind. Überprüfe die Schreibweise und die Ports.

2. Kann ich diesen Code in anderen Excel-Versionen verwenden?
Ja, der Code sollte in den meisten neueren Excel-Versionen funktionieren, die VBA unterstützen.

3. Was passiert, wenn ich den Code nicht anpasse?
Wenn die Druckernamen nicht identisch sind oder der Code nicht korrekt ist, wird möglicherweise der falsche Drucker ausgewählt, was zu unnötigem Papiermüll führt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige