Help!

PC-Problemen?
De vrijwilligers van Oplossing.be zoeken gratis met u mee!

Hulp bij posten

Recente topics

Auteur Topic: eenmalig selecteren van printers in een netwerk  (gelezen 12387 keer)

0 leden en 1 gast bekijken dit topic.

Offline spyder

  • Ambassadeur
  • *****
  • Berichten: 5.265
  • PC probleem zit meestal tussen scherm en rugleun
eenmalig selecteren van printers in een netwerk
« Gepost op: 21 april 2007, 19:45:15 »
Hoi,

Ik heb een bestelbon de moet dienenbinnen een bedrijfje. Deze moet afgedrukt kunnen worden op een printer EN als PDF bestand (met CutePDF) opgeslagen en dat later ook afgedrukt moet kunnen worden.
Het probleem zit 'm in de verscheidenheid aan printers.
Op elke PC hangt een lokale printer en een lokale versie van CutePDF.

Ik zou een macro kunnen opnemen, maar dan moet ik deze op elke locatie (elke Pc binnen het netwerk) gaan uitvoeren, en de code manueel gaan aanpassen; iets waar ik vecht tegenop zie.
Is er een mogelijkheid om dit op een simpele manier op te lossen??

Ik speelde zelf al met het idee om bij de eerste ingebruikname van het Excelblad 2 knoppen aan te bieden. Eentje om de fysieke printer en eentje om de PDF printer te selecteren, deze gegevens ergens op een verborgen blad op te slaan, en dat deze gegevens dan op 1 of andere manier gelezen kon worden als locatie van de printer. Is dit te doen, en zo ja, hoe being ik daar dan aan?

Bestaat er een mogelijkheid om dit eventueel op een andere manier op te lossen?

spyder
Windows 7 Ultimate Unknow NLD
Intel(R) Core(TM) i7 CPU         870  @ 2.93GHz 2934
P7P55D-E PRO
NVIDIA GeForce GTX 470 1280MB 1680 x 1050
HD 1 : INTEL SSDSA2M080G2GC (80GB)
HD 2 : ST31500341AS (1,5TB)
HD 3 : ST320006 41AS (2TB)
browser: Maxthon  mail:Thunderbird AV: Bitdefender
Scarlet user

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.280
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: eenmalig selecteren van printers in een netwerk
« Reactie #1 Gepost op: 21 april 2007, 20:44:45 »
Spyder, Je kan dit oplossen door gebruik te maken van de application methode 'activeprinter'. Dan is het wel zaak dat de verschillende pc's eenzelfde benaming hebben voor de PDF-output. Ik heb een voorbeeld subje gemaakt waarin ik de actieve printer opvraag en vervolgens een  andere printer selecteer...Sub ActievePrinter()

    If Application.ActivePrinter = "Canon PIXMA iP5000 on Ne01:" Then
        Application.ActivePrinter = "Lexmark E321 on Ne00:"
        'ActiveSheet.PrintOut
    Else:
        Application.ActivePrinter = "Canon PIXMA iP5000 on Ne01:"
    End If

End Sub
Jij zou dus de 1e afdruk naar de actieve printer kunnen sturen. De standaard printer dan aanpassen naar de PDF-output (en afdrukken) en als laatste de default printer weer instellen (die moet je dan wel aan het begin van je code in een variabele opslaan!)

Heb je hier iets aan?

Groet, Leo
______________________________

Groet, Leo

Offline spyder

  • Ambassadeur
  • *****
  • Berichten: 5.265
  • PC probleem zit meestal tussen scherm en rugleun
Re: eenmalig selecteren van printers in een netwerk
« Reactie #2 Gepost op: 22 april 2007, 23:15:32 »
Hoi Leo,

Ik "denk" (hoop ;)) dat ik daar al een beetje verder mee kan. Bedankt daarvoor. 8)

Weet je eventueel ook iets om die printers per Pc op te sporen?

Moest er iets niet lukken hoor je nog van mij.

groetjes
Windows 7 Ultimate Unknow NLD
Intel(R) Core(TM) i7 CPU         870  @ 2.93GHz 2934
P7P55D-E PRO
NVIDIA GeForce GTX 470 1280MB 1680 x 1050
HD 1 : INTEL SSDSA2M080G2GC (80GB)
HD 2 : ST31500341AS (1,5TB)
HD 3 : ST320006 41AS (2TB)
browser: Maxthon  mail:Thunderbird AV: Bitdefender
Scarlet user

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.280
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: eenmalig selecteren van printers in een netwerk
« Reactie #3 Gepost op: 23 april 2007, 10:54:20 »
Spyder, ik zou echt niet weten hoe je andere printer buiten de actieve printer kan tonen in VBA... :'(

Ik heb nog ff op internet voor je lopen zoeken, maar kwam daar alleen op een VB-functie uit (die dus weer niet werkt in VBA; hier gevonden). Maar misschien kan jij er wel iets mee?Public Function PopulateListControlWithPrinters(ListControl As _
Object) As Boolean

On Error GoTo errHandler:
Dim l As Long
Dim lCount As Long
ListControl.Clear

lCount = Printers.Count

If lCount = 0 Then
    ListControl.AddItem "(No Printer Installed)"
Else
    For l = 0 To lCount - 1
        ListControl.AddItem Printers(l).DeviceName
    Next
End If

PopulateListControlWithPrinters = True

Exit Function
errHandler:
PopulateListControlWithPrinters = False
Exit Function


End Function

Weet een van de andere oplossers nog raad om via VBA een 'lijst van printers' te tonen?

Groet, Leo
______________________________

Groet, Leo

Offline Erik Van Geit

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 306
  • Geslacht: Man
Re: eenmalig selecteren van printers in een netwerk
« Reactie #4 Gepost op: 23 april 2007, 12:21:38 »
Hallo,

Ja, in VBA blijkt het iets ingewikkelder te zijn.

Option Explicit

Private Declare Function lstrcpy Lib "kernel32.dll" _
Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
Private Declare Function lstrlen Lib "kernel32.dll" _
Alias "lstrlenA" (ByVal lpString As Long) As Long
Private Declare Function EnumPrinters Lib "winspool.drv" _
Alias "EnumPrintersA" (ByVal PrI_Flags As Long, ByVal name As String, ByVal Level As Long, _
pPrinterEnum As Long, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long

Const PRINTER_ENUM_LOCAL = &H2

Private Type PrinterInfo
PrI_Flags As Long
PrI_Description As String
PrI_Name As String
PrI_Comment As String
End Type

Sub ListPrinters()
    Dim longbuffer() As Long
    Dim printinfo() As PrinterInfo
    Dim numbytes As Long
    Dim numneeded As Long
    Dim numprinters As Long
    Dim c As Integer, retval As Long
    Dim PrinterList As String

    numbytes = 3076
    ReDim longbuffer(0 To numbytes / 4) As Long
    retval = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, longbuffer(0), numbytes, numneeded, numprinters)
   
    If retval = 0 Then
    numbytes = numneeded
    ReDim longbuffer(0 To numbytes / 4) As Long
    retval = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, longbuffer(0), numbytes, numneeded, numprinters)
        If retval = 0 Then
        MsgBox "Could not successfully enumerate the printers."
        End
        End If
    End If

    If numprinters <> 0 Then ReDim printinfo(0 To numprinters - 1) As PrinterInfo

    For c = 0 To numprinters - 1
        With printinfo(c)
        .PrI_Flags = longbuffer(4 * c)
        .PrI_Description = Space(lstrlen(longbuffer(4 * c + 1)))
        retval = lstrcpy(.PrI_Description, longbuffer(4 * c + 1))
        .PrI_Name = Space(lstrlen(longbuffer(4 * c + 2)))
        retval = lstrcpy(.PrI_Name, longbuffer(4 * c + 2))
        .PrI_Comment = Space(lstrlen(longbuffer(4 * c + 3)))
        retval = lstrcpy(.PrI_Comment, longbuffer(4 * c + 3))
        End With
    Next c

    For c = 0 To numprinters - 1
    PrinterList = PrinterList & vbLf & c + 1 & vbTab & printinfo(c).PrI_Name & vbCrLf
    Next c
   
    MsgBox PrinterList, 64, "Available printers"

End Sub
De auteur is me onbekend. Sindsdien heb ik de code ook bewerkt voor klaardere structuur. Bij wijze van voorbeeld een MsgBox, maar wellicht wil je liever de listbox om er één te selecteren.

beste groeten,
Erik

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.280
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: eenmalig selecteren van printers in een netwerk
« Reactie #5 Gepost op: 23 april 2007, 21:34:36 »
Erik, tjonge jonge... Wie wat bewaart die heeft wat! Mooie code. Staat ook gelijk bij mij tussen m'n 'leuke VBA-dingen'... ;)

Groet, Leo
______________________________

Groet, Leo

Offline Erik Van Geit

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 306
  • Geslacht: Man
Re: eenmalig selecteren van printers in een netwerk
« Reactie #6 Gepost op: 23 april 2007, 22:27:15 »
tja,
met API is heel wat te verrichten ...
Mijn Excel-werk doe ik thuis. Dus 1 printer volstaat: vandaar dat ik geen ervaring heb met deze code. Tot zolang er natuurlijk een klant komt opdagen met dit soort vragen. :-)

Application Programming Interface
meer info
https://msdn2.microsoft.com/en-us/library/aa383750.aspx

Offline spyder

  • Ambassadeur
  • *****
  • Berichten: 5.265
  • PC probleem zit meestal tussen scherm en rugleun
Re: eenmalig selecteren van printers in een netwerk
« Reactie #7 Gepost op: 23 april 2007, 23:36:07 »
Hoi,

Ik denk dat ik me niet volledig correct uitgedrukt had.  :-[

Sub ActievePrinter()

    If Application.ActivePrinter = "Canon PIXMA iP5000 on Ne01:" Then
        Application.ActivePrinter = "Lexmark E321 on Ne00:"
        'ActiveSheet.PrintOut
    Else:
        Application.ActivePrinter = "Canon PIXMA iP5000 on Ne01:"
    End If

End Sub

Het is ongeveer naar deze structuur dat ik toe zou willen gaan. Maar het is dan voor mij vooral zaak om die strings (bvb "Canon PIXMA iP5000 on Ne01:")automatisch te pakken te kunnen krijgen en deze als variabele in de code of als tekst in een cel te plaatsen .

Ik zou ze graag een macrootje aanbieden waar ze 2 printers kiezen: eerst de "echte , fysieke printer" selecteren, deze locatie ergens opslaan, en vervolgens de PDF printer selecteren en deze locatie ook laten opslaan.
Met deze 2 locaties "denk" ik dan te kunnen voortbreien.

Eric,

Je laatste code is voor mij veel te hoog gegrepen om ze te "lezen", maar, .... ze werkt , en goed!  8)
In het huidige geval kan ik 'm niet gebruiken, maar ik heb nog een ideetje (kwestie van de hersencellen niet te vlug te laten afsterven ;D) waar ik deze wel zeer goed voor zou kunnen gebruiken.

Citaat
maar wellicht wil je liever de listbox om er één te selecteren
En daar zou die Listbox me ideaal bij uitkomen. :-[
Hoe pak ik dat aan?

spyder

Windows 7 Ultimate Unknow NLD
Intel(R) Core(TM) i7 CPU         870  @ 2.93GHz 2934
P7P55D-E PRO
NVIDIA GeForce GTX 470 1280MB 1680 x 1050
HD 1 : INTEL SSDSA2M080G2GC (80GB)
HD 2 : ST31500341AS (1,5TB)
HD 3 : ST320006 41AS (2TB)
browser: Maxthon  mail:Thunderbird AV: Bitdefender
Scarlet user

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.280
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: eenmalig selecteren van printers in een netwerk
« Reactie #8 Gepost op: 24 april 2007, 07:51:04 »
Spyder, Ik denk dat je gebruik moet maken van de code van Erik om de gebruiker de 2 printers in een listbox te laten selecteren. Deze kan je dan opslaan in een 'naam-cel'. Bijvoorbeeld rngPrinter en rngPrinterPDF.
Vervolgens kan je mijn voorbeeldje gebruiken om zo je afdruk te sturen naar de printer van je keuze (voorbeeld...)Application.ActivePrinter = Range("rngPrinter").value
        ActiveSheet.PrintOut
Vergeet trouwens niet om de invoer van de gebruiker te testen. Het zou namelijk slordig zijn als de gebruiker de 2 'outputs' in de omgekeerde volgorde kiest (dan verwachten ze een print en krijgen een PDF). Ik hoop dus dat de naam die in het bedrijf aan de printers gegeven wordt, altijd gelijk is. Het testen zou dan je met een 'InStr' functie kunnen doen.Sub Test()
Dim sZoekIn As String, sZoekNaar As String
sZoekIn = "PDFprinter"  'of in de sheet naar: Range("rngPrinterPDF").value
sZoekNaar = "PDF"

    Do Until InStr(1, sZoekIn, sZoekNaar, 1) > 0
        MsgBox "Foute printer geselecteerd! Kies de PDF-uitvoer!", vbOKOnly, _
                "Foute uitvoer"
        'je zou hier - ipv de msgbox - de code van erik kunnen plaatsen
        'om de listbox te zien...
    Loop

End Sub

Groet, Leo

EDIT: toevoeging van een InStr functie voorbeeld....
______________________________

Groet, Leo

Offline Erik Van Geit

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 306
  • Geslacht: Man
Re: eenmalig selecteren van printers in een netwerk
« Reactie #9 Gepost op: 24 april 2007, 10:09:57 »
jongens, we zitten nog met een probleemje naar mijn gevoel ...

Willen jullie eens even een paar voorbeelden tonen van wat je krijgt met deze code?
Selecteer een aantal printers & run de code.
Range("A" & Rows.Count).End(xlup)(2) = Application.ActivePrinter

Offline spyder

  • Ambassadeur
  • *****
  • Berichten: 5.265
  • PC probleem zit meestal tussen scherm en rugleun
Re: eenmalig selecteren van printers in een netwerk
« Reactie #10 Gepost op: 24 april 2007, 10:38:55 »
Hoi Eric,

Zeer veel mogelijkheid om uitgebreid te reageren heb i momenteel niet, maar ik krijg hier op dit station binnen het netwerk volgende printers te zien.

HP LaserJet 2100 PCL6 op LPT1:
CutePDF Printer op Ne01:
CutePDF Writer op CPW2:

spyder
Windows 7 Ultimate Unknow NLD
Intel(R) Core(TM) i7 CPU         870  @ 2.93GHz 2934
P7P55D-E PRO
NVIDIA GeForce GTX 470 1280MB 1680 x 1050
HD 1 : INTEL SSDSA2M080G2GC (80GB)
HD 2 : ST31500341AS (1,5TB)
HD 3 : ST320006 41AS (2TB)
browser: Maxthon  mail:Thunderbird AV: Bitdefender
Scarlet user

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.280
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: eenmalig selecteren van printers in een netwerk
« Reactie #11 Gepost op: 24 april 2007, 11:56:45 »
Erik, als ik je regel uitvoer...Range("A" & Rows.Count).End(xlup)(2) = Application.ActivePrinter...krijg ik keurig in cel A2 de actieve printer te zien....(zie screendump) Wat is het probleem?  ???

Groet, Leo
______________________________

Groet, Leo

Offline Erik Van Geit

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 306
  • Geslacht: Man
Re: eenmalig selecteren van printers in een netwerk
« Reactie #12 Gepost op: 24 april 2007, 14:34:52 »
Leo & Spyder,

dus we krijgen
"Printernaam op Printerpoort"


probleem kort samengevat
er is een verschil tussen de printernaam "tout court" en de "volledige definitie" met poort er bij

tijd is nu effe op

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.280
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: eenmalig selecteren van printers in een netwerk
« Reactie #13 Gepost op: 24 april 2007, 15:32:25 »
Erik, misschien toch minder probleem dan gedacht.... Ik heb de volgende coderegel getest...    ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _
        "RMT905 (ICT)", Collate:=True
...en de afdruk kwam keurig uit de printer rollen. Je ziet dat ik de poort 'on Ne00' heb verwijderd en alléén nog maar de printernaam heb staan...

Groet, Leo
______________________________

Groet, Leo

Offline Erik Van Geit

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 306
  • Geslacht: Man
Re: eenmalig selecteren van printers in een netwerk
« Reactie #14 Gepost op: 24 april 2007, 21:10:03 »
Wat gebeurt er bij julllie wanneer je "RMT905 (ICT)" (of enige andere echter printernaam) vervangt door "blabla" ?

Ik krijg niet eens een foutmelding, dus had graag geweten of de code wel degelijk een andere printer aanspreekt, wanneer je een "echte" printernaam invult: dat lijkt me logisch, maar een foutmelding bij foute naam leek me ook logisch.

 


www.combell.com