Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1164to1168
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige