Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
780to784
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
780to784
780to784
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Netzwerkdrucker anspringen per VBA

Netzwerkdrucker anspringen per VBA
18.07.2006 10:55:22
Martin
Hi,
ich hoffe mir kann hier jemand helfen.
Euer Forum war bisher jedenfalls für mich immer hilfreich.
Folgendes ist der Fall:
Ich möchte per VBA einen Netzwerkdrucker anspringen, diese Excel muss aber auf verschiedenen Rechnern laufen. Ich habe hierzu schon den unten stehenden Code gefunden, der auch bis auf ein Problemchen funktioniert. Dieses krieg ich aber nicht gelöst...
Nachdem der Code den Drucker richtig ermittelt hat, gibt er diesen unter aPrinter als ",,domäne,drucker" aus, wo natürlich ein Feher entsteht, da ja "\\domäne\drucker" erwartet wird... Was ist das Problem ?
Ach so, OS ist Win 2000...
Der (hier) gefundene Code:
Option Explicit
'(C) by Ramses
'Liest alle installierten Netzwerk-
'und lokalen Drucker aus
'Das gehört in ein Modul
Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
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
Declare Function RegEnumKeyEx _
Lib "advapi32.dll" Alias "RegEnumKeyExA" ( _
ByVal hKey As Long, _
ByVal dwIndex As Long, _
ByVal lpName As String, _
lpcbName As Long, ByVal _
lpReserved As Long, _
ByVal lpClass As String, _
lpcbClass As Long, _
lpftLastWriteTime As FILETIME) As Long
Declare Function RegCloseKey Lib "advapi32.dll" _
(ByVal hKey As Long) As Long
Public Function fncEnumInstalledPrintersReg() As Collection
'Liest alle am lokalen Computer
'installierten Drucker aus
Dim tmpFunctionResult As Boolean
Dim aFileTimeStruc As FILETIME
Dim AddressofOpenKey As Long, aPrinterName As String
Dim aPrinterIndex As Integer, aPrinterNameLen As Long
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const HKEY_LOCAL_MACHINE = &H80000002
Set fncEnumInstalledPrintersReg = New Collection
aPrinterIndex = 0
tmpFunctionResult = Not CBool( _
RegOpenKeyEx( _
hKey:=HKEY_LOCAL_MACHINE, _
lpSubKey:="SYSTEM\CURRENTCONTROLSET\CONTROL\PRINT\PRINTERS", _
ulOptions:=0, _
samDesired:=KEY_ENUMERATE_SUB_KEYS, _
phkResult:=AddressofOpenKey))
If tmpFunctionResult = False Then GoTo ExitFunction
Do
aPrinterNameLen = 255
aPrinterName = String(aPrinterNameLen, CStr(0))
tmpFunctionResult = Not CBool _
(RegEnumKeyEx _
(hKey:=AddressofOpenKey, _
dwIndex:=aPrinterIndex, _
lpName:=aPrinterName, _
lpcbName:=aPrinterNameLen, _
lpReserved:=0, _
lpClass:=vbNullString, _
lpcbClass:=0, _
lpftLastWriteTime:=aFileTimeStruc))
aPrinterIndex = aPrinterIndex + 1
If tmpFunctionResult = False Then Exit Do
aPrinterName = Left(aPrinterName, aPrinterNameLen)
On Error Resume Next
fncEnumInstalledPrintersReg.Add aPrinterName
On Error GoTo 0
Loop
Call RegCloseKey(AddressofOpenKey)
Exit Function
ExitFunction:
If Not AddressofOpenKey = 0 Then _
Call RegCloseKey(AddressofOpenKey)
Set fncEnumInstalledPrintersReg = Nothing
End Function
Public Function fncEnumInstalledPrintersRegNetwork() As Collection
'Liest alle unter dem Benutzer
'installierten Netzwerkdrucker aus
Dim tmpFunctionResult As Boolean
Dim aFileTimeStruc As FILETIME
Dim AddressofOpenKey As Long, aPrinterName As String
Dim aPrinterIndex As Integer, aPrinterNameLen As Long
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const HKEY_Current_user = &H80000001
Set fncEnumInstalledPrintersRegNetwork = New Collection
aPrinterIndex = 0
tmpFunctionResult = Not CBool( _
RegOpenKeyEx( _
hKey:=HKEY_Current_user, _
lpSubKey:="Printers\Connections", _
ulOptions:=0, _
samDesired:=KEY_ENUMERATE_SUB_KEYS, _
phkResult:=AddressofOpenKey))
If tmpFunctionResult = False Then GoTo ExitFunction
Do
aPrinterNameLen = 255
aPrinterName = String(aPrinterNameLen, CStr(0))
tmpFunctionResult = Not CBool _
(RegEnumKeyEx _
(hKey:=AddressofOpenKey, _
dwIndex:=aPrinterIndex, _
lpName:=aPrinterName, _
lpcbName:=aPrinterNameLen, _
lpReserved:=0, _
lpClass:=vbNullString, _
lpcbClass:=0, _
lpftLastWriteTime:=aFileTimeStruc))
aPrinterIndex = aPrinterIndex + 1
If tmpFunctionResult = False Then Exit Do
aPrinterName = Left(aPrinterName, aPrinterNameLen)
On Error Resume Next
fncEnumInstalledPrintersRegNetwork.Add aPrinterName
On Error GoTo 0
Loop
Call RegCloseKey(AddressofOpenKey)
Exit Function
ExitFunction:
If Not AddressofOpenKey = 0 Then _
Call RegCloseKey(AddressofOpenKey)
Set fncEnumInstalledPrintersRegNetwork = Nothing
End Function

Private Sub CommandButton1_Click()
Dim aPrinter As Variant
Dim oldPrinter As Variant
Dim iRow As Integer
oldPrinter = Application.ActivePrinter
For Each aPrinter In fncEnumInstalledPrintersReg
Debug.Print "Lokale Drucker: " & aPrinter
If InStr(1, aPrinter, "Drucker2") > 0 Then
Application.ActivePrinter = aPrinter
'Befehl zum Ausdrucken
'Dein Code
'Drucker zurücksetzen
Application.ActivePrinter = oldPrinter
Exit Sub
End If
Next aPrinter
For Each aPrinter In fncEnumInstalledPrintersRegNetwork
Debug.Print "Netzwerkdrucker: " & aPrinter
If InStr(1, aPrinter, "Drucker2") > 0 Then
Application.ActivePrinter = aPrinter
'Befehl zum Ausdrucken
'Dein Code
'Drucker zurücksetzen
Application.ActivePrinter = oldPrinter
Exit Sub
End If
Next aPrinter
End Sub

________________________________
ThanX a Lot für jede Meinung...

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Netzwerkdrucker anspringen per VBA
18.07.2006 12:48:01
marcl
Hallo Martin,
bei mir sieht das so aus:

Sub Makro1()
Application.ActivePrinter = "\\N0001139\P9020139 auf Ne06:"
ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _
"\\N0001139\P9020139 auf Ne06:", Collate:=True
End Sub

Hat der Netzwerkdrucker nicht immer den gleichen Namen? Dann kannst Du doch einfach Makro aufzeichnen.
Extras / Makro / Aufzeichnen...
dann Datei / Drucken usw.
und dann Extras / Makro / Aufzeichnung beenden
Gruß
marcl
AW: Netzwerkdrucker anspringen per VBA
18.07.2006 13:25:34
Martin
Hi marcl,
Das ist ja gerade das Problem, dass ich zu umschiffen suche.
"xxx auf Ne06:" ist eine feste Portzuweisung, die rechnerspezifisch ist. Deswegen experimentiere ich mit diesem Script, da es mir die jeweils auf dem Rechner installierten Drucker ausliest, leider aber nicht die Ports, wie ich inzwischen rausbekommen habe.
Da ich eher ein VBA-"Durchfuchser" bin, aber unbedingt die Funktionalität benötige, per Button den Druckbefehl an einen bestimmten Netzwerkdrucker zu senden (von jedem im Netzwerk vorhandenen Rechner), kann ich hier leider mit dem sonst nützlichen Makrorekorder nichts anfangen... :(
Aber danke fürs Feedback... ;)
Eine andere Lösung hast du nicht zufällig parat ?
Anzeige
AW: Netzwerkdrucker anspringen per VBA
18.07.2006 14:40:04
marcl
So Martin,
versuch mal das:

Private Sub CommandButton1_Click()
Dim aPrinter As Variant
Dim oldPrinter As Variant
Dim iRow As Integer
oldPrinter = Application.ActivePrinter
For Each aPrinter In fncEnumInstalledPrintersReg
Debug.Print "Lokale Drucker: " & aPrinter
If InStr(1, aPrinter, "Drucker2") > 0 Then
Application.ActivePrinter = aPrinter
'Befehl zum Ausdrucken
'Dein Code
'Drucker zurücksetzen
Application.ActivePrinter = oldPrinter
Exit Sub
End If
Next aPrinter
For Each aPrinter In fncEnumInstalledPrintersRegNetwork
'ab hier geändert
Range("A1") = aPrinter
Range("B1").FormulaR1C1 = "=RIGHT(RC[-1],8)" 'je nachdem wie lang der Druckername ist
If Range("B1") = "P9020139" Then GoTo weiter ' hier deinen Druckernamen eintragen
Next aPrinter
weiter:
Range("A1").Replace What:=",", Replacement:="\", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
aPrinter = Range("A1")
Range("B1").FormulaR1C1 = "=CONCATENATE(RC[-1],"" auf Ne6:"")"
Range("A1:B1").ClearContents
ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _
Range("B1"), Collate:=True
End Sub

Gruß
marcl
Anzeige
AW: Netzwerkdrucker anspringen per VBA
18.07.2006 15:00:45
marcl
leider hat das Makro nicht alles Tests bestanden. Leider falsch.
AW: Netzwerkdrucker anspringen per VBA
18.07.2006 15:18:49
Martin
Hey,
hab eine (nicht ganz so schöne) Lösung gefunden !!!
Siehe angehängter xls, die ich gefunden habe...
https://www.herber.de/bbs/user/35180.xls
Hier macht man einfach noch eine Eingabe per Steuerelement, Skript o.ä in die Zelle A2, nachdem man die Prozedur mit dem Tabellenblatt verknüpft hat und das Ganze läuft einwandfrei... ;)
Drucken geht dann ganz einfach:

Private Sub CommandButton2_Click()
Application.ActivePrinter = Cells(2, 2)
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
End Sub

Hier kann ich dann sogar noch dem User verschiedene Drucker zur Verfügung stellen ( geht nämlich um Netzwerk-Ghostscript für verschiedene PDF-Handlings )... ;)
Grüße und besten Dank für deine Mühe,
Martin
Anzeige
AW: Netzwerkdrucker anspringen per VBA
18.07.2006 15:04:35
Martin
Wow,
dafür, dass du behauptest, ebenfalls kaum Kenntnisse zu haben, ratterst du ganz schön los... ;)
Leider läuft dein Skript nach allem Anpassen zwar, allerdings nicht durch und spuckt mir alles auf dem lokal markierten Standarddrucker aus. Kein Erkennen des gesuchten Druckers...
Außerdem sorgen die Parameter "MatchCase:=False, SearchFormat:=False," für Fehler...
Greetz,
Martin

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige