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

Forumthread: vorhandere Drucker auflisten

vorhandere Drucker auflisten
23.02.2009 23:42:24
Daniel
Hallo
wie kann ich die Namen der vorhandenen Drucker per VBA auflisten oder in einem Array ablegen?
hintergrund ist, ich habe eine Anwendung, deren Ergebnis unbedingt als PDF gedruckt werden soll.
der PDF-Maker ist als Druckertreiber installiert soweit kein Problem, nur ist dies auf den verschiedenen Rechnern jedesmal ein anderer PDF-Drucker angegeben.
dh. Application.ActivePrinter = "FreePDF auf xyz" funktioniert bei mir, aber nicht beim Kollegen, der den "GhostWriter PDF auf abc" hat.
ich würde jetzt gerne die vorhandenen Drucker in einer Schleife durchsuchen und denjenigen als Aktiven Drucker setzen, dessen Name "PDF" enthält.
vielen Dank, Daniel
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: vorhandere Drucker auflisten kompliziert
24.02.2009 00:21:54
Daniel
Hi Thorsten
vielen Dank, der erste Link funktionert, nur:
gibts da echt nix einfacheres, um an die Auflistung ranzukommen?
ich würde ja gerne den Code, den ich verwende auch verstehen, aber das ist ne Nummer zu gross für mich.
Gruß Daniel
hier noch ein Code
24.02.2009 06:19:19
Tino
Hallo,
dies war kürzlich eine Frage, daher habe ich einen Code dafür zur Hand.
Option Explicit

Private Declare Function RegEnumValue Lib "advapi32.dll" Alias _
  "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, _
  ByVal lpValueName As String, lpcbValueName As Long, ByVal _
  lpReserved As Long, lpType As Long, lpData As Byte, _
  lpcbData As Long) As Long

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
  Alias "RegOpenKeyExA" (ByVal hKey As Long, _
  ByVal lpSubKey As String, ByVal ulOptions As Long, _
  ByVal samDesired As Long, phkResult As Long) As Long

Private Declare Function RegCloseKey Lib "advapi32.dll" _
  (ByVal hKey As Long) As Long

Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const KEY_QUERY_VALUE = &H1
Private Const READ_CONTROL = &H20000
Private Const KEY_READ = (READ_CONTROL Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY)
Private Const HKEY_CURRENT_USER = &H80000001
Private Const Schlüsselname = "Software\Microsoft\Windows NT\CurrentVersion\Devices\"



Private Function FindDrucker(ByVal sDruckerName$) As String

Dim dummy, hwndSchlüssel&
Dim Länge&, lngIndex&
Dim strFeld As String, lngLänge As Long
Dim arrPuffer() As Byte, strPuffer As String
Dim lngArrLänge As Long, lngPortlänge As Long
Dim Drucker As String

  dummy = RegOpenKeyEx(HKEY_CURRENT_USER, _
    Schlüsselname, 0&, KEY_READ, hwndSchlüssel)
  If dummy <> 0 Then MsgBox "Falscher Schlüssel": Exit Function
  strFeld = String(1024, 0)
  lngLänge = 1023
  Redim arrPuffer(0 To 1000)
  
  Do While RegEnumValue(hwndSchlüssel, lngIndex, _
    strFeld, lngLänge, 0&, ByVal 0&, ByVal 0&, ByVal 0&) = 0
    
    Drucker = Left$(strFeld, lngLänge) & " auf "
    lngArrLänge = 1024
    
    RegEnumValue hwndSchlüssel, lngIndex, strFeld, _
      lngLänge, 0&, 0&, arrPuffer(0), lngArrLänge
    
    strPuffer = (StrConv(arrPuffer, vbUnicode))
    
    lngPortlänge = InStr(1, strPuffer, ":") - InStr(1, strPuffer, ",")
    
    strPuffer = Mid$(strPuffer, InStr(1, strPuffer, ":") - 4, lngPortlänge)
    strPuffer = Replace(strPuffer, ",", "")
    strPuffer = IIf(Right$(strPuffer, 1) = ":", strPuffer, strPuffer & ":")
    Drucker = Drucker & strPuffer
    
    If Drucker Like sDruckerName Then FindDrucker = Drucker: Exit Do
    lngIndex = lngIndex + 1
    strFeld = String(1024, 0)
    
    lngLänge = 1023
  Loop

  dummy = RegCloseKey(hwndSchlüssel)
End Function


Sub TestDruckerUmstellen()
Dim sAktuellerDrucker As String
Dim sDrucker As String
'aktuellen Drucker in einem String merken 
sAktuellerDrucker = Application.ActivePrinter
'Drucker Suchen, Platzhalter verwenden 
sDrucker = FindDrucker("*PDF*")

If sDrucker <> "" Then
    Application.ActivePrinter = sDrucker
End If
    
    
    'hier Dein Code für den Ausdruck 
    '... 
    '... 


'Drucker wieder zurückstellen, sollte er umgestellt sein 
If sDrucker <> "" Then
 Application.ActivePrinter = sAktuellerDrucker
End If

End Sub


Gruß Tino

Anzeige
AW: Danke
24.02.2009 11:11:05
Daniel
Hi Tino
vielen Dank.
ich verstehe zwar nicht so genau, was das passiert, aber solange es funktioniert, macht das ja nichts.
Gruß, Daniel
Kürzere Variante zur Fassnacht
24.02.2009 11:25:36
Ramses
Hallo
Das Teil liest alle installierten Drucker aus der Registry aus
Option Explicit

Public Sub ListPrinter()
    'by Ramses
    'Speichert alle installierten Drucker im Array "arrPrinter"
    Const HKEY_current_user = &H80000001
    Dim oReg As Object, i As Long
    Dim strKeyPath As String, strValue As String, msg As String
    Dim arrPrinter As Variant
    Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    strKeyPath = "Software\Microsoft\Windows NT\CurrentVersion\Devices"
    oReg.EnumValues HKEY_current_user, strKeyPath, arrPrinter
    For i = 0 To UBound(arrPrinter)
        oReg.GetStringValue HKEY_current_user, strKeyPath, arrPrinter(i), strValue
        msg = msg & arrPrinter(i) & Replace(strValue, "winspool,", " auf ") & vbCr
    Next
    Set oReg = Nothing
    MsgBox msg, vbInformation, "Druckerliste WMI"
End Sub

Ultrakurz mit dem gleichen Effekt
Sub Demo()
    Dim x As String
    x = "Aktiver Drucker: " & Application.ActivePrinter
    MsgBox Application.ActivePrinter
    Application.Dialogs(xlDialogPrinterSetup).Show
    MsgBox "Alter Drucker: " & x & vbNewLine & "Neuer Drucker: " & Application.ActivePrinter
End Sub

Gruss Rainer
Gruss Rainer
Anzeige
nicht schlecht,...
24.02.2009 11:38:21
Tino
Hallo,
diese Version kannte ich noch nicht, habe ich mir direkt mal abgespeichert. (darf ich doch oder?)
Gruß Tino
AW: Kürzere Variante zur Fassnacht
24.02.2009 11:48:38
Daniel
Hi
supi vielen Dank
das erste Makro lässt sich super in meine Anwendung integrieren.
ich hoffe mal, daß es im Büro dann auch läuft.
ich verstehs zwar immer noch nicht, aber hauptsache, es läuft.
jetzt kann ich feiern gehen.
Gruß, Daniel
Anzeige
ist doch die Version von Ramses? oT.
24.02.2009 12:42:09
Ramses?
AW: ist doch die Version von Ramses? oT.
24.02.2009 12:57:50
Ramses?
HI
zumindest ist sie seeehr änhlich ;-)
das 2. Makro ist auch sehr interessant, hat aber den Nachteil, das der Textteil "... auf XYZ" nicht mitgeliefert wird und daher nicht für die Einstellung des Aktiven Druckers verwendet werden kann.
und ich möchte den Kollegen nur sehr ungern den Standarddrucker verstellen.
Gruß, Daniel
Anzeige
Verzeihung. Das stimmt....
24.02.2009 13:59:57
Ramses
Hallo
...da ist mir wohl bei der Archivierung ein Lapsus passiert.
Das liegt bei mir als Teil von einigen anderen umfangreichen WINMGMTS Scripts in einem Modul.
Dort sind aber alle Makros mit meinem Namen markiert (hab ich nun geändert :-( )
Ich hab das nur noch rauskopiert weil es das kürzeste von allen dort gespeicherten ist
Das ist die Variante die ich mir daraus abgeleitet habe
Option Explicit

Public prtArray() As Variant

Sub Get_Printer_Info()
    'by Ramses
    'speichert alle Drucker in einem Array
    Dim objWMIService As Object
    Dim objPrinterList As Object, objPrinter As Object, objPrinterCol As Object
    Dim strPCName As String
    Dim i As Long
    'Lokaler Computer
    '"." ist der lokale Computer
    'Ansonsten den RemoteComputernamen angeben um von dort die Drucker auszulesen
    'u.U. sind dort Adminrechte nötig
    strPCName = "."
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strPCName & "\root\cimv2")
    Set objPrinterCol = objWMIService.ExecQuery("Select * from Win32_Printer")
    'Liste der wichtigsten zurückgegebenen Werte die möglich sind zum Abfruf
    'die vollständige Liste unter
    'http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx
    ' string Caption;
    ' string CharSetsSupported[];
    ' uint16 CurrentLanguage
    ' string CurrentPaperType
    ' boolean Default
    ' uint16 DetectedErrorState;
    ' string DeviceID;
    ' boolean Direct;
    ' boolean ErrorCleared;
    ' string ErrorDescription;
    ' string ErrorInformation[];
    ' boolean Local;
    ' string Location;
    ' string Name;
    ' boolean Network;
    ' string Parameters;
    ' string PNPDeviceID;
    ' string PortName;
    ' uint32 PrinterState;
    ' uint16 PrinterStatus;
    ' string ServerName;
    ' boolean Shared;
    ' string ShareName;
    ' boolean SpoolEnabled;
    ' datetime StartTime;
    ' string Status;
    ' uint16 StatusInfo;
    ' string SystemName;
    ' boolean WorkOffline
    i = 0
    For Each objPrinter In objPrinterCol
        With objPrinter
            ReDim Preserve prtArray(i)
            prtArray(i) = .Name
            i = i + 1
        End With
    Next
End Sub

Das Array kann nun zum Füllen einer Listbox oder eines Tabellenebereiches verwendet werden solange die Mappe offen ist ohne die Abfrage erneut zu starten
Interessante Links hierzu gibt es übrigens hier
http://www.microsoft.com/germany/technet/datenbank/articles/600682.mspx#EPMAE
und hier
http://www.activexperts.com/activmonitor/windowsmanagement/adminscripts/printing/ports/#DetPortAvail.htm
Zu 2.
Das ist nicht nötig. Wenn der Benutzer den Drucker auswählt und auf OK klickt wird der Drucker automatisch auf aktiv gesetzt und steht zum Ausdruck zur Verfügung
Gruss Rainer
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Vorhandene Drucker in Excel auflisten


Schritt-für-Schritt-Anleitung

Um die vorhandenen Drucker in Excel aufzulisten, kannst du ein VBA-Skript verwenden. Folge diesen Schritten:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Klicke auf Einfügen und wähle Modul, um ein neues Modul zu erstellen.
  3. Füge den folgenden Code in das Modul ein:
Sub ListAllPrinters()
    Dim objWMIService As Object
    Dim objPrinter As Object
    Dim colPrinters As Object
    Dim printerList As String

    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colPrinters = objWMIService.ExecQuery("Select * from Win32_Printer")

    For Each objPrinter In colPrinters
        printerList = printerList & objPrinter.Name & vbCrLf
    Next objPrinter

    MsgBox "Vorhandene Drucker:" & vbCrLf & printerList, vbInformation, "Druckerliste anzeigen"
End Sub
  1. Schließe den VBA-Editor und kehre zu Excel zurück.
  2. Drücke ALT + F8, wähle ListAllPrinters aus und klicke auf Ausführen.

Das Skript zeigt dir eine Nachricht mit allen installierten Druckern an.


Häufige Fehler und Lösungen

  • Fehler: "Zugriff verweigert"
    Lösung: Stelle sicher, dass du als Administrator angemeldet bist, da für den Zugriff auf die Druckereinstellungen möglicherweise Administratorrechte erforderlich sind.

  • Fehler: Keine Drucker angezeigt
    Lösung: Überprüfe, ob die Drucker korrekt installiert sind. Du kannst dies tun, indem du die Druckeroptionen in der Systemsteuerung öffnest.


Alternative Methoden

Es gibt verschiedene Möglichkeiten, um alle Drucker anzuzeigen:

  1. WMIC-Befehl in der Eingabeaufforderung:

    • Öffne die Eingabeaufforderung und gebe wmic printer list ein, um alle Drucker anzuzeigen.
  2. Verwendung von Active Directory:

    • Wenn du in einer Unternehmensumgebung arbeitest, kannst du die Drucker über printer active directory abfragen. Dies erfordert jedoch spezifische Berechtigungen und Einstellungen.

Praktische Beispiele

Hier sind einige praktische Beispiele für die Verwendung von VBA zum Auslesen von Druckern:

  1. Drucker mit spezifischem Namen finden:

    Sub FindPDFPrinter()
       Dim sPrinter As String
       sPrinter = FindDrucker("*PDF*")
       If sPrinter <> "" Then
           Application.ActivePrinter = sPrinter
           MsgBox "Aktiver Drucker: " & sPrinter
       Else
           MsgBox "Kein PDF-Drucker gefunden."
       End If
    End Sub
  2. Druckerliste in eine Excel-Tabelle einfügen:

    Sub ExportPrintersToSheet()
       Dim ws As Worksheet
       Set ws = ThisWorkbook.Sheets(1)
       Dim i As Integer
       i = 1
    
       For Each objPrinter In colPrinters
           ws.Cells(i, 1).Value = objPrinter.Name
           i = i + 1
       Next objPrinter
    End Sub

Tipps für Profis

  • Nutze Application.ActivePrinter, um den aktiven Drucker in deinen VBA-Projekten dynamisch zu setzen.
  • Erstelle eine Benutzeroberfläche (UserForm), um die Drucker auszuwählen und die Auswahl zu speichern.
  • Verwende vba drucker auslesen, um Druckerinformationen effizient zu verwalten und zu nutzen.

FAQ: Häufige Fragen

1. Wie kann ich alle Drucker in einer Liste speichern?
Du kannst die Drucker in einem Array speichern, indem du den obigen Code anpasst, um die Druckernamen in ein Array zu speichern.

2. Gibt es eine Möglichkeit, die Drucker zu filtern?
Ja, du kannst in der FindDrucker-Funktion Platzhalter verwenden, um nur Drucker anzuzeigen, deren Namen einen bestimmten Text enthalten.

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