• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

VBA Printer selecteren en pinterinstellingen

Status
Niet open voor verdere reacties.

lexcellern

Gebruiker
Lid geworden
15 okt 2015
Berichten
130
Ik heb, als VBA leek, een probleem met een macro.

Situatie:
De printer staat op een ongewenste printer en ik wil een selectie printen op een geselecteerde printer met bepaalde instellingen.
De macro moet dus een andere printer selecteren en die andere printer ook bepaalde instellingen geven.
Nu lijkt onderstaande macro wel de andere (dus juiste printer te selecteren), maar bepaalde instellingen neemt hij niet over.
Als bijvoorbeeld de vorige pint of een andere printer op Portrait stond, dan zet de macro de printer niet om naar portrait, terwijl dat wel in de instellingen is gezet in de macro (.Orientation = xlLandscape)

Waarschijnlijk doe ik iets flink fout in de opzet.
Iemand een idee hoe dit op te lossen?

dus:
Printer selecteren
Gewenste Printer Instellingen
Selectie Printen


Code:
Sub testimport()
'
' testimport Macro
'
' Sneltoets: Ctrl+r
'
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Application.PrintCommunication = False
    With ActiveSheet.PageSetup
        .PrintTitleRows = ""
        .PrintTitleColumns = ""
    End With
    Application.PrintCommunication = True
    ActiveSheet.PageSetup.PrintArea = ""
    Application.PrintCommunication = False
    Selection.PrintOut Copies:=1, ActivePrinter:="HP PageWide Pro", Collate:=True
    With ActiveSheet.PageSetup
        .LeftHeader = ""
        .CenterHeader = ""
        .RightHeader = ""
        .LeftFooter = ""
        .CenterFooter = ""
        .RightFooter = ""
        .LeftMargin = Application.InchesToPoints(0.5)
        .RightMargin = Application.InchesToPoints(0.1)
        .TopMargin = Application.InchesToPoints(0.7)
        .BottomMargin = Application.InchesToPoints(0.1)
        .HeaderMargin = Application.InchesToPoints(0.3)
        .FooterMargin = Application.InchesToPoints(0.3)
        .PrintHeadings = False
        .PrintGridlines = False
        .PrintComments = xlPrintNoComments
        .PrintQuality = 600
        .CenterHorizontally = False
        .CenterVertically = False
        .Orientation = xlLandscape
        .Draft = False
        .PaperSize = xlPaperA4
        .FirstPageNumber = 1
        .Order = xlDownThenOver
        .BlackAndWhite = False
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = False
        .PrintErrors = xlPrintErrorsDisplayed
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = False
        .ScaleWithDocHeaderFooter = True
        .AlignMarginsHeaderFooter = False
        .EvenPage.LeftHeader.Text = ""
        .EvenPage.CenterHeader.Text = ""
        .EvenPage.RightHeader.Text = ""
        .EvenPage.LeftFooter.Text = ""
        .EvenPage.CenterFooter.Text = ""
        .EvenPage.RightFooter.Text = ""
        .FirstPage.LeftHeader.Text = ""
        .FirstPage.CenterHeader.Text = ""
        .FirstPage.RightHeader.Text = ""
        .FirstPage.LeftFooter.Text = ""
        .FirstPage.CenterFooter.Text = ""
        .FirstPage.RightFooter.Text = ""
    End With
    Application.PrintCommunication = True
End Sub
 
je geeft eerst de opdracht printen en pas daarna de instellingen
 
Ik heb het ook zonder succes geprobeerd met het printcommando ná de instellingen.
Dus dat is de oplossing niet.
Ik heb het idee dat ik met een regel eerst de juiste printer moet instellen, dan de instellingen van de printer en dan pas de printopdracht.

Is die gedachte juist en met welke code selecteer ik de gewenste printer zonder te printen?
Ik heb al van alles geprobeerd, maar heb te weinig kennis en er uitgebreide zoektocht op Google levert me niets op, behalve honderden mislukte pogingen.
 
Als voorbeeld heb ik bovenin de macro gezet:

Code:
Dim myprinter As String
Dim printer_name As String
printer_name = "Lex-kantoor-(HP PageWide Pro 477dw MFP)"

Hiermee dacht ik als 1e aan te geven wat de actieve printer moet zijn.
Maar dat werkt niet, dus dit deel maar weer weg gehaald. Zo heb ik nog talloze andere dingen die ik vind op google geprobeerd.

Ik dacht juist met de macro uit mijn 1e post met de 'with' functie met daarin alle printerinstellingen onder de printeropdracht op de juiste wijze te kunnen printen, maar werkt ook niet.

De suggestie van #emields om eerst de instellingen te doen en daarna pas de printopdracht werk niet.
Naar mijn mening omdat hij nog niet communiceert met de gewenste printer. Hij zou naar mijn mening eerst moeten communiceren met de juiste printer.
Dán pas kun je de instellingen van die printer neerzetten.
Maar hoe krijg ik nu eerst de gewenste printer actief? Iets met Application.ActivePrinter? Ik heb daarin ook al van alles geprobeerd, maar het werkt niet.

Iemand een idee?
 
Toon eerst eens de schermafdruk van het resultaat van deze macro:

Code:
Sub M_printers()
  For Each it In CreateObject("Wscript.network").EnumPrinterConnections
    If c01 = "" Then
      c01 = it
    Else
       c00 = c00 & vbLf & it & " on " & c01
       c01 = ""
    End If
  Next
  
  MsgBox c00
End Sub

PS. Waarom zoveel overbodige code als het er primair om gaat de wijzigingsselektie van een printer te testen ? Beperk je in testcode tot de essentie.
 
Laatst bewerkt:
Dit heb ik in een bestand in ThisWorkbook staan:
Code:
Private Sub Workbook_Open()
    printernaam = Application.Dialogs(xlDialogPrinterSetup).Show
End Sub

Daarmee kies ik bij het openen van het bestand een printer die op de betreffende PC beschikbaar is.
 
#snb: ik krijg met die macro een overzicht van alle printers met hun adressen.
Ik moet in dit geval printen op de volgende printer (die uit die macro komt):

Lex-kantoor-(HP PageWidePro 477dw MFP) on WSD-d99bdf8a-1886-4e1f-b7c6-2fae7a9e4596printers.png

Zie bijlage de afbeelding van de uitkomst van die macro (of kon ik eenvoudiger een printscreen plakken?).

In de macro heb ik dus daadwerkelijk staan:
Code:
Selection.PrintOut Copies:=1, ActivePrinter:="Lex-kantoor-(HP PageWidePro 477dw MFP)", Collate:=True

Voor alle zekerheid: hij pakt wel de juiste printer, maar niet de juiste printerinstellingen.

#Haije: dank voor je bijdrage, maar ik wil automatisch printen vanuit de macro mét de gewenste instellingen. Als ik een printer moet kiezen dan is dit een ongewenste handeling + ik moet ook nog eens de istellingen evengoed doen, want die worden niet in de macro overgenomen als je vorige print op een andere print ging met andere instellingen. Je moet dus eerst kunnen communiceren met de gewenste printen in de macro.
 
Iemand nog een suggestie?
Ik had gehoopt op een oplossing of wat huiswerk om dit van het weekend voor elkaar te krijgen.
Ik heb inmiddels zelf honderden pogingen gedaan, alle tips op het internet afgespeurd, maar aangezien ik niet heel veel weet van VBA wordt het lastig en maak ik kennelijk zelf steeds fouten.

#snb: wat was de reden van het overzichtje van de actieve printers die ik als macro moest draaien en een printscreen moest aanleveren?

Alvast dank voor hopelijk een oplossing.

Inmiddels zit ik met meer macro's waarbij ik graag een printer wil selecteren, instellingen voor die printer wil zetten, printen en weer terugzetten naar de default printer met default instellingen.

Alvast fijn weekend voor iedereen.
 
Misschien heb ik mijn probleemstelling te ingewikkeld/onduidelijk gemaakt, dus ik stel mijn vraag iets anders, vereenvoudigd:

Wat is de macro (VBA) code om de gewenste printer te activeren (aan te passen) zodat de macro vervolgens printerinstellingen kan toepassen en daarna kan printer (op die gewenste printer)?

Met Application.ActivePrinter = "[The name of your printer] on [port]:" krijg ik constant een foutcode.
Misschien moet er iets aan vooraf aan code....

Hoop dat ik hierbij wat hulp krijg?

Dus:

gewenste printer activeren (hij staat namelijk soms op een andere usb printer door een vorige print)
instellingen van die printer neerzetten
printen
Terugzetten naar de default printer met defaultinstellingen
 
Laatst bewerkt:
Ik heb die uiteraard gezien en gelezen en vanalles geprobeerd, naast alle andere talloze soortgelijke cases op internet, maar het lukt gewoon niet.
Telkens een foutmelding als ik de regel Application.ActivePrinter = "[The name of your printer] on [port]:" invoeg.

Vervelend dat ik het niet vanuit huis kan testen, moet steeds naar kantoor.

Het lijkt zo simpel:

Activeer een (andere) printer
Activeer instellingen op die printer
Print
Activeer de default printer met default instellingen.

Uiteraard worden in de macro nog veel meer handelingen uitgevoerd, maar dat is het probleem niet.
Het feit dat ik zoveel topics over dit onderwerp zie zou zeggen dat het kennelijk lastiger is dan je zou denken.
Vragen als, is het ‘op’ of ‘on’ en moet je wel of niet het poortnummer weergeven, moeten er wel of geen spaties, komma’s enz geplaatst worden.....
Moet ik vooraf definities plaatsen als dim huppeldepup en string dinges....?
Ik werk normaal met recorden van macro’s maar zonder vba programmeerkennis is het allemaal best lastig en kost het uren en uren tijd.

Begrijp ik het goed dat de code niet even zo te geven valt?
Is het een kwestie van nog een keer of duizend trials en errors?
Is er wellicht een ander forum waar dit soort kennis direct voorhanden is?
Mijn ervaring hier op helpmij is dat er enorm veel hulp geboden wordt, maar meestal leidt het bij mij niet tot een oplossing.
Dat is best jammer, maar zal wellicht aan mij liggen.
Ik hoop dat het hierbij nog wel een keertje lukt
 
Code:
Application.ActivePrinter = "[COLOR="#FF0000"][The name of your printer][/COLOR] on [COLOR="#008000"][port][/COLOR]:"
betekend
Code:
Application.ActivePrinter = "[COLOR="#FF0000"]Lex-kantoor-(HP PageWidePro 477dw MFP)[/COLOR] on [COLOR="#008000"]WSD-d99bdf8a-1886-4e1f-b7c6-2fae7a9e4596[/COLOR]:"
Je moet alleen even proberen met en zonder : op het eind, want dat weet ik niet zeker.
 
Ik begrijp het even niet.

Ik meld in mijn vorige post:
Telkens een foutmelding als ik de regel Application.ActivePrinter = "[The name of your printer] on [port]:" invoeg.

En nu krijg ik als advies om dit tóch toe te passen?
Dit werkt dus niet, foutmelding 1004, ook als ik een andere printernaam zou nemen.

Moet ik niet iets als eerste formuleren, zoiets als
Dim strActivePrinter enz.......?
 
Hoi Lex,

Ik heb hier ook regelmatig te maken met print instellingen en verschillende printers.
Wat ik voornamelijk doe is: Ik begin met een PDF-printer te selecteren (Microsoft Print to PDF), deze kun je volledig instellen, maak dan de juiste instellingen in je sheet ( Orientatie, print area. lettergroote enzovoort).
Zet je macrorecorder aan en ga een afdruk instellen in de printinstellingen en druk dit af in PDF. Als alles dan naar je zin is ingesteld, dan kopieer je de macro naar de juiste sheet en gebruik je deze om een volgende keer te printen.
Ik ga niet zeggen dat dit in 1x lukt, maar bij mij is het meestal de aanhouder die wint.......
 
Beste Frits,
Ik waardeer je hulp maar dat zal de oplossing niet brengen.
Het zijn namelijk niet de printerinstellingen die het probleem zijn, die staan immers keurig in de macro.

Het probleem is dat de macro eerst moet communiceren met de gewenste printer, zodat hij de in de macro ingestelde printereigenschappen kan toepassen.

Uitleg:
Als de laatst gedane print op dezelfde printer was als de printer die actief moet zijn in de macro, met compleet andere printinstellingen, dan werkt de macro perfect.
De macro verandert dus netjes de printerinstellingen conform ingevoerd in de macro.

Maar als de laatste print op een andere printer was, dan neemt hij NIET de printerinstellingen uit de macro over.
Hij print wel op de juiste printer, maar met de verkeerde printinstellingen.
Dit komt omdat ik niet goed weet hoe eerst communicatie moet worden gevonden met de juiste printer; ik weet de juiste commando’s hier niet voor.
Ik kan alleen maar het commando geven om te printen op een gewenste printer.

Telkens een foutmelding als ik de regel Application.ActivePrinter = "[The name of your printer] on [port]:" invoeg.
Met of zonder dubbele punt, met of zonder toevoeging van de poort, in de on of op vorm. Niets werkt.

Een macro recorden is normaal iets dat ik gebruik, maar voor selectie van printen werkt recorden niet. Dat wordt niet ge-record’.

Hoop op de juiste code voor activeren van de printer.
 
Laat dit bestandje eens lopen.
Hiermee krijg je exact de juiste benamingen, onafhankelijk in welke taal office werkt.
Plaats de resultaten.
Je kan dit ook thuis proberen, zodat je inzicht krijgt in de werking.
Als het thuis werkt dan kan je al grotendeels de problemen op het werk omzeilen.
Eerst kijken dat er iets gebeurt, daarna aanpassen aan wat we willen dat gebeurt.
 

Bijlagen

  • helpmij printer poort activeprinter.xlsm
    21,1 KB · Weergaven: 110
Laatst bewerkt:
Dank voor je reactie. Ik begrijp dat dit bestandje afwijkt van wat #snb stuurde, waarmee ik in post #7 ook een overzicht van de printers stuurde.
Dit is de uitkomst van jouw bestand:

0 ActivePrinter Names
1 Microsoft XPS Document Writer op Ne01:
2 Microsoft Print to PDF op Ne02:
3 Fax op Ne05:
4 DYMO LabelWriter 450 op Ne07:
5 Pascalle-Kantoor-(HP PageWide Pro 477dw MFP) op Ne00:
6 Lex-kantoor-(HP PageWide Pro 477dw MFP) op Ne03:
7 HP PageWide Pro 477dw MFP op Ne04:
8 OneNote for Windows 10 op Ne08:
9 DYMO LabelWriter 4XL (Kopie 1) op Ne06:

Wat me verder opvalt is dat de gewenste printer waar het om gaat zowel usb aangesloten is, als via het netwerk.
Ik heb de boel eens omgezet naar de usb versie, dus: HP PageWide Pro 477dw MFP op Ne04:
Dit heb ik eens in de macro toegepast.

Er lijkt nu verbetering in te komen, dus dat is positief. Hij zet de printer om en hanteert dan gewenste printerinstellingen.
Maar ik heb de nodige problemen, wat weer veel tijd kost en gekost heeft, namelijk, de printer loopt met een simpele test macro vast en de printopdracht blijft in de wachtrij staan en is zeer hardnekkig te verwijderen, pas na de print spooler reset en de printer opnieuw opstarten. Zelf pc opnieuw opstarten. De macro loopt ook wat stroef, krijg eerst de melding 'reageert niet' en pas even later komt de print eruit.
Het lijkt er op alsof hij 2 x een printopdracht wordt gegeven, waarbij er 1 niet doorheen komt (en dus nauwelijks te verwijderen is).

Welke code gebruik ik nu (ik heb even de printerinstellingen erin laten staan, sorry voor de langere code dan wellicht noodzakelijk):

Code:
Sub testprint()
'
' testprint Macro
' test om te kijken of de juiste printer wordt geselecteerd en de printerinstellingen worden gehanteerd
'
' Sneltoets: Ctrl+r
'
    Application.ActivePrinter = "HP PageWide Pro 477dw MFP op Ne04:"
    Application.PrintCommunication = True
    With ActiveSheet.PageSetup
        .PrintTitleRows = ""
        .PrintTitleColumns = ""
    End With
    Application.PrintCommunication = True
    ActiveSheet.PageSetup.PrintArea = ""
    Application.PrintCommunication = True
    With ActiveSheet.PageSetup
        .LeftHeader = ""
        .CenterHeader = ""
        .RightHeader = ""
        .LeftFooter = ""
        .CenterFooter = ""
        .RightFooter = ""
        .LeftMargin = Application.InchesToPoints(0.7)
        .RightMargin = Application.InchesToPoints(0.7)
        .TopMargin = Application.InchesToPoints(0.75)
        .BottomMargin = Application.InchesToPoints(0.75)
        .HeaderMargin = Application.InchesToPoints(0.3)
        .FooterMargin = Application.InchesToPoints(0.3)
        .PrintHeadings = False
        .PrintGridlines = False
        .PrintComments = xlPrintNoComments
        .PrintQuality = 600
        .CenterHorizontally = False
        .CenterVertically = False
        .Orientation = xlLandscape
        .Draft = False
        .PaperSize = xlPaperA4
        .FirstPageNumber = xlAutomatic
        .Order = xlDownThenOver
        .BlackAndWhite = False
        .Zoom = 100
        .PrintErrors = xlPrintErrorsDisplayed
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = False
        .ScaleWithDocHeaderFooter = True
        .AlignMarginsHeaderFooter = True
        .EvenPage.LeftHeader.Text = ""
        .EvenPage.CenterHeader.Text = ""
        .EvenPage.RightHeader.Text = ""
        .EvenPage.LeftFooter.Text = ""
        .EvenPage.CenterFooter.Text = ""
        .EvenPage.RightFooter.Text = ""
        .FirstPage.LeftHeader.Text = ""
        .FirstPage.CenterHeader.Text = ""
        .FirstPage.RightHeader.Text = ""
        .FirstPage.LeftFooter.Text = ""
        .FirstPage.CenterFooter.Text = ""
        .FirstPage.RightFooter.Text = ""
    End With
    Application.PrintCommunication = True
    Selection.PrintOut Copies:=1, Collate:=True
End Sub

Hoe test ik:
ik print eerst op een andere printer iets uit, met andere printerinstellingen.
Dan draai ik de macro, om te kijken of hij op de juiste printer print met de gewenst printerinstellingen.
Vervolgens zou nog weer teruggeschakeld moeten worden naar de default printer met de default instellingen. Dit punt staat niet in de macro omdat ik dacht dat het met onderstaande zou moeten lukken maar daar komt een foutcode:

Application.ActivePrinter = strCurrentPrinter 'Returns printer output to your default printer

Waarschijnlijk moet ik dan eerst iets in de kop definiëren?

Hoe dan ook, hij geeft met de huidige test macro een correcte print...maar.....hij lijkt het 2 keer te willen doen, want er blijft nog een printopdracht hangen in de wachtrij.
hoe kan ik dit oplossen?

Kortom:
is de basis code uit de macro correct?
Waarom geeft dit een wachtrij print?
Hoe krijg ik de default printer met default printinstellingen weer terug aan het einde van de macro?
 
Welke printinstellingen wil je precies aanpassen?
Orientatie van portrait naar landscape?
De margins blijven die hetzelfde?
Wat wordt er nog meer aangepast?

Hoe minder er achter
Code:
With ActiveSheet.PageSetup
staat, des te sneller
Het probleem is dat de macro-recorder hier alle instellingen laat zien, terwijl er effectief maar een paar aangepast worden.

Ik denk dat de traagheid in
Code:
Application.PrintCommunication = True
zit.
 
Laatst bewerkt:
Ik denk dat je deze code nodig hebt.
  1. Slaat de oude printer op
  2. Print met de nieuwe printer (landscape, hoge kwaliteit, A4-formaat en in kleur)
  3. Zet de oude printer weer terug.

Code:
Option Explicit

Public Sub testprint()

    Dim strCurrentPrinter As String

    strCurrentPrinter = Application.ActivePrinter    ' huidige printer bewaren

    Application.ActivePrinter = "HP PageWide Pro 477dw MFP op Ne04:"

    If Val(Application.Version) >= 14 Then 'vanaf excel2010
        Application.PrintCommunication = False
    End If
    With ActiveSheet.PageSetup
        .Orientation = xlLandscape
        .Draft = False
        .PaperSize = xlPaperA4
        .Order = xlDownThenOver
        .BlackAndWhite = False
        .Zoom = 100
    End With
    If Val(Application.Version) >= 14 Then 'vanaf excel2010
        Application.PrintCommunication = False
    End If

    Selection.PrintOut Copies:=1, Collate:=True

    Application.ActivePrinter = strCurrentPrinter    'huidige printer terugzetten

End Sub
 
Laatst bewerkt:
is de basis code uit de macro correct?
Waarom geeft dit een wachtrij print?
Hoe krijg ik de default printer met default printinstellingen weer terug aan het einde van de macro?
De basiscode is goed, alleen valt er nog wat te snoeien.
Waarom de wachtrij ontstaat weet ik niet, pagesetup is zeer trage code, dat kan meespelen
Zie hierboven voor code die je oude printer weer netjes terugzet.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan