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

Forumthread: Druckerport suchen

Druckerport suchen
20.01.2013 12:17:49
Franz
Hallo Fachleute,
ich suche den Port des Standarddruckers (bei mir ein "HP LaserJet M1120 MFP"), dazu gibt es verschiedene MÖglichkeiten, ich hab mächtig in der Recherche gesucht - und gefunden. Allerdings gibt's bei mir ein Problem, der richtige Port wird nicht erkannt:
Wenn ich im Druckerdialog den HP als aktiven Drucker einstelle und das mit dem Rekorder aufzeichne, bekomme ich:
Application.ActivePrinter = "HP LaserJet M1120 MFP auf Ne03:"
ABER:
beim Auslesen des Standarddruckers mit verschiedenen Codes, die ich in der Recherche gefunden habe, z. B. damit:
Option Explicit
Private 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
Sub DruckerAnzeigen()
Dim PrinterName$, Driver$, Port$
Call GetStdPrinterName(PrinterName, Driver, Port)
'MsgBox "Standarddrucker: " & vbLf & PrinterName & vbLf & Driver & vbLf & Port
MsgBox PrinterName & " auf " & Port
End Sub
Private Sub GetStdPrinterName(PrinterName$, Driver$, Port$)
Dim Buffer$, r&, x&, y&
Buffer = Space(8192)
r = GetProfileString("windows", "Device", "", Buffer, Len(Buffer))
If r Then
Buffer = Mid(Buffer, 1, r)
x = InStr(Buffer, ",")
PrinterName = Mid(Buffer, 1, x - 1)
y = InStr(x + 1, Buffer, ",")
Driver = Mid(Buffer, x + 1, y - x - 1)
Port = Mid(Buffer, y + 1)
Else
PrinterName = ""
Driver = ""
Port = ""
End If
End Sub

wird als Port Ne02: ermittelt.
Wenn ich dann im Makro mit dem ermittelten "Port = Ne02:" die Anweisung
    Application.ActivePrinter = PrinterName & " auf " & Port

verwende, gibt's ne Fehlermeldung ("Anwendungs- oder objektdefinierter Fehler").
Setz ich davor noch:
    Port = "Ne03:"

dann stimmt's.
Wie kann ich den Port des Standarddruckers richtig ermitteln?
Danke schonmal und Grüße
Franz

Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
P. S.: Hintergrund
20.01.2013 12:21:20
Franz
der Hintergrund ist:
nach dem Ab- und dann wieder Anstöpseln des Druckers vom PC ist der Druckerport nicht mehr zwangsläufig derselbe. Darum muss er jedesmal neu ermittelt werden........

AW: Druckerport suchen
20.01.2013 12:31:49
Anton
Hallo Franz,
vllt hilft dir das hier weiter.
mfg Anton

Anzeige
AW: Druckerport suchen
20.01.2013 12:46:03
Franz
Hallo Anton,
ja, vielen Dank, das ist schonmal super: Hier wird der HP mit dem aktuell richtigen Port "Ne03:" ermittelt.
Allerdings ist mir Dein Code zu hoch, und ich weiß nicht, wie ich aus der Liste aller Drucker nur den Standarddrucker herausnehmen kann. Kannst Du mir da bitte noch weiterhelfen?
Grüße
Franz

Anzeige
AW: Druckerport suchen
20.01.2013 12:49:23
Anton
Hallo Franz,
so?:
Option Explicit
Public Sub Drucker_mit_port()
Dim strDrucker As String, oReg As Object
Dim gefunden As Boolean, strKeyPath As String
Dim arrValueNames, i As Integer, strValue As String
Const HKEY_current_user = &H80000001
strDrucker = "HP" 'anpassen
gefunden = False
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")  _
strKeyPath = "Software\Microsoft\Windows NT\CurrentVersion\Devices"
oReg.EnumValues HKEY_current_user, strKeyPath, arrValueNames
For i = 0 To UBound(arrValueNames)
If InStr(1, arrValueNames(i), strDrucker)  0 Then
oReg.GetStringValue HKEY_current_user, strKeyPath, arrValueNames(i), strValue
MsgBox arrValueNames(i) & Replace(strValue, "winspool,", " auf ")
gefunden = True
End If
Next
Set oReg = Nothing
If gefunden = False Then MsgBox "Drucker " & strDrucker & " ist nicht installiert!"
End Sub  

mfg Anton

Anzeige
noch besser, aber....
20.01.2013 13:08:50
Franz
Hallo Anton,
ja, gut. Aber jetzt ist ja "HP" vorgegeben. Der Code funktioniert aber halt nur wenn der HP angeschlossen ist, ob als Standarddrucker oder nicht.
Gibt es einen neuen Drucker (was bei meinem alten HP ja mal der Fall sein wird :-))), muss der Code angepasst werden.
Auch auf einem anderen Rechner mit einem anderen Drucker als Standard klappt der Code nicht, müsste erst angepasst werden.
Gibt es nicht vielleicht die Möglichkeit, aus der mit Deinem Code erstellten Liste der ermittelten Drucker den Standarddrucker rauszufiltern, egal was für einer das sein mag?
Fragende Grüße
Franz

Anzeige
Standarddrucker mit port
20.01.2013 13:23:27
Anton
Hallo Franz,
noch eine Variante:
Public Sub standarddrucker_mit_port()
Dim objWMI As Object, objItem As Object, WSHShell As Object
Set WSHShell = CreateObject("WScript.Shell")
Set objWMI = GetObject("winmgmts:\\.\root\cimv2"). _
ExecQuery("Select * from Win32_Printer where default = true")
For Each objItem In objWMI
MsgBox objItem.Name & Replace(WSHShell.RegRead _
("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices\" & _
objItem.Name), "winspool,", " auf ")
Next
Set objWMI = Nothing
Set WSHShell = Nothing
End Sub

mfg Anton

Anzeige
AW: Standarddrucker mit port
20.01.2013 13:34:31
Franz
Hallo Anton,
super, ganz vielen Dank, das funktioniert so, wie ich es brauchen kann
(mal schaun, ob ich's auch verstehen kann...?)
Grüße
Franz
;
Anzeige
Anzeige

Infobox / Tutorial

Druckerport richtig ermitteln in Excel


Schritt-für-Schritt-Anleitung

Um den Druckerport in Excel zu ermitteln, kannst Du VBA verwenden. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Füge ein neues Modul hinzu: Klicke im Menü auf Einfügen und wähle Modul.

  3. Kopiere den folgenden Code in das Modul:

    Option Explicit
    Private 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
    
    Sub DruckerAnzeigen()
        Dim PrinterName$, Driver$, Port$
        Call GetStdPrinterName(PrinterName, Driver, Port)
        MsgBox "Standarddrucker: " & vbLf & PrinterName & vbLf & "Port: " & Port
    End Sub
    
    Private Sub GetStdPrinterName(PrinterName$, Driver$, Port$)
        Dim Buffer$, r&, x&, y&
        Buffer = Space(8192)
        r = GetProfileString("windows", "Device", "", Buffer, Len(Buffer))
        If r Then
            Buffer = Mid(Buffer, 1, r)
            x = InStr(Buffer, ",")
            PrinterName = Mid(Buffer, 1, x - 1)
            y = InStr(x + 1, Buffer, ",")
            Driver = Mid(Buffer, x + 1, y - x - 1)
            Port = Mid(Buffer, y + 1)
        Else
            PrinterName = ""
            Driver = ""
            Port = ""
        End If
    End Sub
  4. Führe das Makro aus: Drücke F5 oder gehe zurück zu Excel und führe das Makro über Entwicklertools > Makros aus.

  5. Du erhältst eine Meldung mit dem Namen des Standarddruckers und dem ermittelten Port.


Häufige Fehler und Lösungen

  • Fehlermeldung: Anwendungs- oder objektdefinierter Fehler:

    • Stelle sicher, dass der Port korrekt zugewiesen ist. Wenn Du Port = "Ne03:" manuell setzt und es funktioniert, könnte der ermittelte Port nicht korrekt sein. Überprüfe die Verbindung des Druckers.
  • Port wird nicht erkannt:

    • Achte darauf, dass der Drucker richtig angeschlossen und als Standarddrucker eingestellt ist. Nach dem Ab- und Anstecken kann der Druckerport variieren.

Alternative Methoden

Eine weitere Methode, um den Druckerport herauszufinden, ist die Verwendung der Windows Management Instrumentation (WMI). Hier ein Beispielcode, um den Standarddrucker und seinen Port abzufragen:

Public Sub standarddrucker_mit_port()
    Dim objWMI As Object, objItem As Object, WSHShell As Object
    Set WSHShell = CreateObject("WScript.Shell")
    Set objWMI = GetObject("winmgmts:\\.\root\cimv2"). _
    ExecQuery("Select * from Win32_Printer where default = true")
    For Each objItem In objWMI
        MsgBox objItem.Name & Replace(WSHShell.RegRead _
        ("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices\" & _
        objItem.Name), "winspool,", " auf ")
    Next
    Set objWMI = Nothing
    Set WSHShell = Nothing
End Sub

Diese Methode verwendet WMI, um direkt auf die Systeminformationen zuzugreifen und den Standarddrucker zu ermitteln.


Praktische Beispiele

Hier sind einige praktische Beispiele für die Nutzung des Codes:

  1. Druckerport für verschiedene Drucker ermitteln:

    • Du kannst den strDrucker im Code anpassen, um den Port für einen spezifischen Drucker zu ermitteln.
  2. Liste aller Drucker anzeigen:

    • Mit dem oben beschriebenen WMI-Code kannst Du eine Liste aller Drucker anzeigen und die Informationen zum Standarddrucker herausfiltern.

Tipps für Profis

  • Druckerport dynamisch ermitteln:

    • Erstelle eine Funktion, die den Druckerport automatisch aktualisiert, wenn der Drucker ab- und wieder angesteckt wird.
  • Fehlerbehandlung einfügen:

    • Implementiere eine Fehlerbehandlung in Deinen VBA-Code, um unerwartete Probleme beim Abrufen des Druckerports zu handhaben.
  • Nutzung von getprofilestringa:

    • Der getprofilestringa-Aufruf kann in verschiedenen Szenarien nützlich sein, um Informationen aus dem Windows-Profil zu extrahieren.

FAQ: Häufige Fragen

1. Wie kann ich den Druckerport herausfinden, wenn ich mehrere Drucker habe?
Du kannst den WMI-Code verwenden, um eine Liste aller installierten Drucker zu erhalten und dann den Standarddrucker herauszufiltern.

2. Warum wird der Druckerport manchmal nicht erkannt?
Das Problem kann auftreten, wenn der Drucker nicht korrekt angeschlossen oder als Standarddrucker eingestellt ist. Überprüfe die Verbindung und die Druckereinstellungen in Windows.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige