Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA: Drucker wechseln

Forumthread: VBA: Drucker wechseln

VBA: Drucker wechseln
04.09.2024 10:14:48
David
Hallo zusammen,
ich habe versucht, "gemeinsam" mit ChatGPT ;) ein Makro zu erstellen, welches das aktive Blatt ausdruckt, vorher aber die Möglichkeit bietet, den Drucker über eine Userform auszuwählen (ohne den System-Dialog zu verwenden). Es ist immer wieder daran gescheitert, dass der Druck-Befehl die Übergabe des richtigen Druckers entweder mit Fehler quittiert oder einfach den Standard-Drucker verwendet hat.
Um das einzugrenzen, habe ich einen Testcode erstellt (erstellen lassen), der einfach alle Drucker nacheinander durchgehen soll (mit Ausnahmen):

Private Sub Test_Click()

Dim objWMI As Object
Dim printer As Object
Dim i As Integer
Dim response As VbMsgBoxResult
Dim formattedPrinterName As String
Dim portName As String

Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_Printer")

i = 1
For Each printer In objWMI
' Prüfen, ob der Druckername "XPS" oder "OneNote" enthält oder ob der Port "Portprompt" ist
If InStr(1, printer.Name, "XPS", vbTextCompare) = 0 And _
InStr(1, printer.Name, "OneNote", vbTextCompare) = 0 And _
InStr(1, printer.portName, "Portprompt", vbTextCompare) = 0 Then

' Druckername und Port korrekt formatieren
formattedPrinterName = printer.Name
portName = printer.portName

' Vor dem Setzen den Druckernamen und Port anzeigen
'MsgBox "Drucker: " & formattedPrinterName & vbCrLf & "Port: " & portName

response = MsgBox("Drucker " & i & ":" & vbCrLf & _
" Name: " & formattedPrinterName & " auf " & portName & vbCrLf & _
" Status: " & printer.PrinterStatus & vbCrLf & _
" Standarddrucker: " & printer.Default, _
vbOKCancel, "Druckerinformationen")

If response = vbCancel Then
Exit For
End If

On Error GoTo HandleError ' Fehlerbehandlung aktivieren

' Versuche, den aktiven Drucker zu setzen
Application.ActivePrinter = formattedPrinterName & " auf " & portName

' Drucke das aktive Blatt
ActiveSheet.PrintOut

i = i + 1
End If
Next printer

Exit Sub ' Ende des Makros, wenn kein Fehler auftritt

HandleError:
MsgBox "Fehler beim Setzen des Druckers: " & formattedPrinterName & " auf " & portName & vbCrLf & "Fehler: " & Err.Description
Resume Next ' Fortsetzen mit dem nächsten Drucker
End Sub


Obwohl hier der Druckername inklusive Port anscheinend korrekt übergeben wird (der String sieht zumindest optisch genauso aus), kommt ein Fehler "Die Methode 'ActivePrinter' für das Objekt '_Application' ist fehlgeschlagen"

ChatGPT kommt hier anscheinend an seine Grenzen, die Vorschläge drehen sich im Kreis.

Meine Vermutung ist, dass der Druckername mit Port vielleicht irgendwie anders formatiert werden muss. Kann hier jemand der VBA-Experten sagen, wo das Problem ist und ob meine Vorgehensweise überhaupt richtig ist?

Danke und Gruß
David
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: Drucker wechseln
04.09.2024 11:01:59
Alwin Weisangler
Hallo David,

so?


Private Sub Test_Click()
Dim objWMI As Object
Dim printer As Object
Dim WSHShell As Object
Dim i As Integer
Dim response As VbMsgBoxResult
Dim formattedPrinterName As String
Dim portName As String

Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_Printer")
Set WSHShell = CreateObject("WScript.Shell")
i = 1
For Each printer In objWMI
' Prüfen, ob der Druckername "XPS" oder "OneNote" enthält oder ob der Port "Portprompt" ist
If InStr(1, printer.Name, "XPS", vbTextCompare) = 0 And _
InStr(1, printer.Name, "OneNote", vbTextCompare) = 0 And _
InStr(1, printer.portName, "Portprompt", vbTextCompare) = 0 Then

' Druckername und Port korrekt formatieren
formattedPrinterName = printer.Name
portName = Replace(WSHShell.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices\" & printer.Name), "winspool,", " auf ")

'Ausgabe Drucker + Port
MsgBox printer.Name & portName

If response = vbCancel Then
Exit For
End If

' Versuche, den aktiven Drucker zu setzen
Application.ActivePrinter = formattedPrinterName & portName

' Drucke das aktive Blatt
ActiveSheet.PrintOut

i = i + 1
End If
Next printer
End Sub


Gruß Uwe
Anzeige
AW: VBA: Drucker wechseln
04.09.2024 12:00:53
David
Hallo Uwe,

das scheint erst mal weitestgehend zu funktionieren. Bei einem der vorhandenen Drucker hat er eine kleine "Gedenkminute" eingelegt, sodass ich dachte, Excel wäre abgestürzt (war aber wohl nur, weil der aktuell nicht erreichbar war) und bei einem kam eine Fehlermeldung zum Registry-Eintrag. Wäre aber auch nicht so tragisch, den könnte ich noch herausfiltern, das war einer, der sowieso nicht verwendet wird.

Nur um das zu verstehen:
Im Prinzip wird nur der Port "umgeschrieben", oder? Ich hatte schon bemerkt, dass im alten Code der Port irgendwie nicht gepasst hat, normal hätte da sowas wie "ne04:" stehen müssen, statt dessen war da eine IPv4-Adresse bzw. bei anderen eine IPv6 und noch ein paar andere 'seltsame' Portnamen. Heißt dann, dass VBA die 'richtigen' Port-Bezeichnungen nicht auslesen kann?

Ich überlege noch, ob das Ganze wirklich sinnvoll ist. Aktuell hab ich das eigentliche Makro so verändert, dass der Drucken-Systemdialog aufgerufen wird, das ist allemal besser als die vorige Variante, wo einfach der eingestellte Standard-Drucker verwendet wurde. Das hat für einige Benutzer nicht gut gepasst.

Vielen Dank.
Gruß
David
Anzeige
AW: VBA: Drucker wechseln
04.09.2024 12:20:00
Alwin Weisangler
Es wird nicht umgeschrieben, sondern aus der Registry zum Druckernamen das Port ausgelesen.
Frage: Wo und wie passiert dieser Fehler (bitte eindeutige Beschreibung)?

Wenn es nur um ein in ein Projekt eingebundenes Druckermenü habe ich mir vor geraumer Zeit mal das zusammengeschnitzt:
https://www.herber.de/bbs/user/171984.xlsm

Gruß Uwe
Anzeige
AW: VBA: Drucker wechseln
04.09.2024 14:25:59
David
ich denke, der Fehler ist spezifisch:
Ungültige Wurzel im Registrierungssschlüssel "HKEY.....\Devices\desprint01\Sicheres_drucken"

das ist eine Variante des echten Druckers mit PIN-Abfrage. Ich benutze das nicht und hab schon lange nicht getestet, ob das überhaupt noch funzt (geht auch gerade nicht im Home-Office).

Würde ich eigentlich auch rausfiltern, weil irrelevant.

Das andere schaue ich mir bei nächster Gelegenheit an, Vielen Dank.

Gruß
David
Anzeige
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige