Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1052to1056
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

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

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
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

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen
Forumthread
Beiträge