Voor de liefhebber:
Lijkt erop dat deze kan werken.
Nog niet uitgetest, maar komt wel.
http://www.excelgaard.dk/Lib/PrinterDuplex/
even google translate gebruikt:
PrinterDuplex
Dubbelzijdig printen betekent dubbelzijdig afdrukken van hetzelfde stuk papier - iets dat de meeste moderne printers kunnen ...
... maar Excel is hiertoe niet in staat - in ieder geval niet in staat om de instelling voor dubbelzijdig afdrukken in VBA-code te maken.
Als u een handmatige afdruk maakt, is er vanuit het menu <Bestanden> geen probleem, omdat u gewoon dubbelzijdig afdrukken kunt selecteren door op de knop [Printereigenschappen] te klikken, maar als u die instelling wilt maken vanuit een macro, komt u de probleem, dat er geen optie is in de VBA-programmeertaal voor het instellen van dubbelzijdig afdrukken - dit is één plaats, waar de VBA-ontwikkeling de ontwikkeling van printers niet heeft ingehaald.
Traditioneel is de manier van dubbelzijdig afdrukken geweest door een dubbel printerstuurprogramma te installeren, waarbij de duplexeigenschap is ingesteld en vervolgens naar die printer te printen (door de ActivePrinter te wijzigen), wanneer u in duplex wilt afdrukken (zoals wordt geïllustreerd in de afbeelding rechts).
Maar er is een andere, en naar mijn mening, betere manier om dubbelzijdig afdrukken vanuit VBA in te stellen - een manier die bijna ingenieus is in al zijn eenvoud ...
De 'PrinterDuplex.DLL'-bibliotheek
• VB-referentie instellen op 'PrinterDuplex.DLL'
• Stel de duplex-optie in voordat u gaat afdrukken
• Lees de huidige duplex-instelling van een printer
• Maak een lijst van alle printers die op de computer / het systeem zijn aangesloten
• De door de gebruiker gedefinieerde functie, 'pdPrinter ()'
PrinterDuplex.DLL
Het enige wat u hoeft te doen, is VB-verwijzing instellen op 'PrinterDuplex.DLL' in de werkmappen, waar u wilt kunnen kiezen tussen dubbelzijdig afdrukken vanuit VBA of niet.
Als u 'PrinterDuplex.DLL' niet kunt vinden of niet kunt vinden op uw computer, kunt u 'PrinterDuplex.DLL' downloaden door op het downloadpictogram in het hoofdmenu te klikken.
Wanneer u 'PrinterDuplex.DLL' hebt gedownload, moet dit op het systeem worden geregistreerd.
U registreert 'PrinterDuplex.DLL' op het systeem door de opdrachtpromptvensters te openen en 'RegSvr32' in te voeren, gevolgd door het volledige pad en de volledige naam naar het gedownloade 'PrinterDuplex.DLL', zoals te zien in de kleine schermafbeelding, naar de rechts.
U kunt 'PrinterDuplex.DLL' downloaden en het bestand, waar u maar wilt, op uw computer opslaan - persoonlijk bewaar ik het bestand altijd in het pad: C: \ Windows \ PrinterDuplex.DLL
... waar zich reeds een aantal andere .DLL-systemen bevinden.
Merk op dat als u de werkmap downloadt en alle codevoorbeelden van deze pagina bevat (door op het Excel-bladpictogram in het bovenste menu te klikken), dit werkboek 'veronderstelt' dat de 'PrinterDuplex.DLL' zich bevindt in 'C: \ Windows \ PrinterDuplex.DLL ', en als' PrinterDuplex.DLL 'niet kan worden gevonden, mislukken alle macro's in de werkmap ...
... net als alle andere macro's op deze website die 'PrinterDuplex.DLL' gebruiken, dus u kunt net zo goed het bestand vanaf het begin in dit pad plaatsen
VB-referentie instellen op 'PrinterDuplex.DLL'
Als u VB Reference direct in uw werkmap wilt instellen op 'PrinterDuplex.DLL', doet u het als volgt:
1. Open Visual Basic Editor (VBE) door op [Alt] + [F11] te drukken
2. Selecteer het menu <Hulpmiddelen → Verwijzingen ...>
3. In de vensters die nu worden geopend, hebt u twee opties ...
4. Als u 'PrinterDuplex.DLL' hebt geïnstalleerd of geregistreerd (met 'RegSvr32'), hoeft u alleen maar door de lijst met VB-verwijzingen te bladeren totdat u 'PrinterDuplex' vindt.
5. Stel VB Reference in op 'PrinterDuplex.DLL' door een vinkje te zetten naast 'PrinterDuplex'
6. Als u 'PrinterDuplex.DLL' niet kunt vinden in de lijst, moet u handmatig naar het bestand verwijzen. Klik hiervoor op de knop [Bladeren ...]
7. In het dialoogvenster dat wordt geopend, wordt het bestand 'PrinterDuplex.DLL' gevonden en klikt u op de knop [Open]
8. Nadat u een van de bovenstaande handelingen hebt uitgevoerd, klikt u op de knop [OK] in het venster Referenties van VB en heeft u de werkmap nu 'verteld' dat de macro's in de werkmap 'PrinterDuplex.DLL' kunnen (kunnen) gebruiken.
Als u VB Reference programmatisch wilt instellen op 'PrinterDuplex.DLL' met behulp van VBA-code, kunt u dit doen door de zogenaamde GUID van 'PrinterDuplex.DLL' te gebruiken, als u 'PrinterDuplex.DLL' hebt geïnstalleerd of geregistreerd op uw computer, of u kunt dit doen door rechtstreeks naar het bestand te verwijzen.
Code:
ThisWorkbook.VBProject.References.AddFromGuid "{EA363DC8-6EFA-48A5-979A-E5AD8A3F699C}", 4, 0 ' PrinterDuplex Library
ThisWorkbook.VBProject.References.AddFromFile "C:\Windows\PrinterDuplex.DLL" ' PrinterDuplex Library
Merk op, die methode 2, waar je naar verwijst, 'PrinterDuplex.DLL', kan ook worden gebruikt als je 'PrinterDuplex.DLL' op je computer hebt geïnstalleerd / geregistreerd.
Nog een klein detail: als u uw werkmap, die gebruik maakt van 'PrinterDuplex.DLL', wilt distribueren naar andere computers / gebruikers, moet dit het 'PrinterDuplex.DLL'-bestand zich in hetzelfde exacte pad bevinden als op uw eigen computer - of anders mislukken de macro's op de andere computers / gebruikers (nogmaals, iets in het voordeel van het altijd plaatsen van het bestand, 'PrinterDuplex.DLL', dezelfde plaats, in C: \ Windows \ PrinterDuplex.DLL
Nadat u VB Reference hebt ingesteld op 'PrinterDuplex.DLL' in de werkmap, waar u wilt kunnen kiezen tussen dubbelzijdig afdrukken of niet, bent u klaar om te gaan, en hieronder vindt u enkele codevoorbeelden over hoe je kunt je macro-codes maken
Stel de duplex-optie in voordat u gaat afdrukken
De macrocode hieronder laat zien hoe u 'PrinterDuplex.DLL' kunt gebruiken om dubbelzijdig afdrukken in te stellen voor elke printer voordat deze wordt afgedrukt.
• In coderegel 19 lezen we eerst de huidige duplexinstelling van de printer, zodat we de duplexinstelling opnieuw kunnen instellen wanneer we klaar zijn met afdrukken.
• In coderegel 20 stellen we vervolgens de gewenste duplexmodus in - voor het gemak worden de mogelijke opties als constanten in het aangiftegebied bovenaan de codemodule in de codelijnen 1 - 6 gemaakt.
• In coderegel 21 geven we een foutmelding als het niet mogelijk was om de duplexmodus van de printer in te stellen - deze foutmelding wordt ook gedefinieerd in het declaratiegebied van de codemodule, in de codelijnen 7 - 11, in het geval u de foutmelding in een andere taal wilt vertalen.
• In coderegel 23 moet u uw eigen afdrukroutine invoegen (of een afdrukmacro aanroepen), die nu in de gewenste duplexmodus afdrukt (dubbelzijdig afdrukken).
• In coderegel 26 hebben we de duplexinstelling van de printer teruggezet naar de oorspronkelijke instelling die de printer had, voordat we de instelling wijzigden in overeenstemming met ons dubbelzijdig afdrukken.
Let op, codelijn 15, waar we de gebruikersdefined-functie (UDF) gebruiken, genaamd 'pdPrinter ()', om de printer in te stellen waarmee we willen werken - deze functie en waarom we deze functie gebruiken, wordt beschreven op de onderste, laatste, op deze pagina.
Als u de functie 'pdPrinter ()' gebruikt, zonder argument, zoals weergegeven, wordt de huidige actieve printer gebruikt. U kunt ook gewoon de naam van de printer schrijven, als dit nuttiger is in uw code
Code:
' (C) Dan Elgaard (www.EXCELGAARD.dk)
' Constants for reading and setting the duplex state of the printer(s)
Public Enum vbPrinterDuplex
vbPRDPDefault = 0 ' The printer's default duplex setting (use this for reading the duplex state of the printer)
vbPRDPSimplex = 1 ' Single-sided printing with the current orientation setting
vbPRDPHorizontal = 2 ' Double-sided printing using a horizontal (landscape) page turn (book)
vbPRDPVertical = 3 ' Double-sided printing using a vertical (portrait) page turn (legal)
End Enum
' When you use horizontal duplex printing, the tops of both sides of the page are on the same end of the sheet.
' When you use vertical duplex printing, the bottom of one page is at the same end of the sheet as the top of the next page.
' Module level constant for error message
Private Const PrinterDuplexErrorMessage As String = "Unable to read duplex state. " & vbNewLine & vbNewLine & _
"Possible causes could be: " & vbNewLine & vbNewLine & _
" - Printer doesn't support duplex printing, " & vbNewLine & _
" - Printer is disconnected or off-line, " & vbNewLine & _
" - Wrong printer name given. "
Option Explicit
Sub PrinterDuplex_SetState()
' This macro show, how to set the duplex state of the printer before printing, and then reset the state afterwards
' * ' Define variables
Dim Printer As String
Printer = pdPrinter ' Set specific printer, if you like, i.e. "Brother MFC-J6910DW"
Dim PDO As Object ' PrinterDuplex Object
Set PDO = CreateObject("PrinterDuplex.Class1")
Dim InitialState As vbPrinterDuplex
InitialState = PDO.Duplex(Printer, vbPRDPDefault) ' Read the initial duplex state of the printer, so we can reset it after printing
' * ' Set the duplex state before printing
If PDO.Duplex(Printer, vbPRDPHorizontal) = False Then ' Set to double-sided printing using a horizontal (landscape) page turn (book)
MsgBox PrinterDuplexErrorMessage, vbOKOnly + vbExclamation, " PrinterDuplex"
Else
' Do your printing here...
End If
ES: ' End of Sub
PDO.Duplex Printer, InitialState ' Reset the duplex state to its initial state after printing
Set PDO = Nothing
End Sub
Lees de huidige duplexinstelling van een printer
Een klein beetje macro, dat laat zien hoe u de duplex-instelling van een printer in duidelijke tekst kunt aangeven.
Het lezen van de duplex-instelling van de printer gebeurt in coderegel 18 en in de coderegels 19 - 21 vertellen we in 'duidelijke tekst' welke duplexinstelling de printer heeft.
Net als in het vorige voorbeeld plaatsen we de diverse opties als constanten in het declaratiegedeelte, bovenaan de codemodule, net zoals we opnieuw de door de gebruiker gedefinieerde functie 'pdPrinter ()' gebruiken om de printernaam op te geven.
Code:
' (C) Dan Elgaard (www.EXCELGAARD.dk)
' Constants for reading and setting the duplex state of the printer(s)
Public Enum vbPrinterDuplex
vbPRDPDefault = 0 ' The printer's default duplex setting (use this for reading the duplex state of the printer)
vbPRDPSimplex = 1 ' Single-sided printing with the current orientation setting
vbPRDPHorizontal = 2 ' Double-sided printing using a horizontal (landscape) page turn (book)
vbPRDPVertical = 3 ' Double-sided printing using a vertical (portrait) page turn (legal)
End Enum
' When you use horizontal duplex printing, the tops of both sides of the page are on the same end of the sheet.
' When you use vertical duplex printing, the bottom of one page is at the same end of the sheet as the top of the next page.
' Module level constant for error message
Private Const PrinterDuplexErrorMessage As String = "Unable to read duplex state. " & vbNewLine & vbNewLine & _
"Possible causes could be: " & vbNewLine & vbNewLine & _
" - Printer doesn't support duplex printing, " & vbNewLine & _
" - Printer is disconnected or off-line, " & vbNewLine & _
" - Wrong printer name given. "
Option Explicit
Sub PrinterDuplex_GetState()
' This macro will get the duplex state of the given printer
' * ' Define variables
Dim Printer As String
Printer = pdPrinter ' Set specific printer, if you like, i.e. "Brother MFC-J6910DW"
Dim PDO As Object ' PrinterDuplex Object
Set PDO = CreateObject("PrinterDuplex.Class1")
' * ' Read the duplex printing state of the printer
Select Case PDO.Duplex(Printer, vbPRDPDefault)
Case vbPRDPSimplex: MsgBox Printer & ":" & vbNewLine & vbNewLine & "Single-sided printing with the current orientation setting. ", vbOKOnly + vbInformation, " PrinterDuplex"
Case vbPRDPHorizontal: MsgBox Printer & ":" & vbNewLine & vbNewLine & "Double-sided printing using a horizontal (landscape) page turn (book). ", vbOKOnly + vbInformation, " PrinterDuplex"
Case vbPRDPVertical: MsgBox Printer & ":" & vbNewLine & vbNewLine & "Double-sided printing using a vertical (portrait) page turn (legal). ", vbOKOnly + vbInformation, " PrinterDuplex"
Case Else: MsgBox Printer & ":" & vbNewLine & vbNewLine & PrinterDuplexErrorMessage, vbOKOnly + vbExclamation, " PrinterDuplex"
End Select
ES: ' End of Sub
Set PDO = Nothing
End Sub
Maak een lijst van alle printers die op de computer / het systeem zijn aangesloten
Naast de '. Duplex'-methode bevat de bibliotheek' PrinterDuplex.DLL 'ook een methode, genaamd' .ListPrinsters '.
Met deze methode lees je eenvoudig alle printers die op de computer / het systeem zijn aangesloten, in een array die je vervolgens verder kunt gebruiken in je macro's.
In het codevoorbeeld hieronder lezen we alle printers in de variabele, 'Printers', in coderegel 7.
Daarna drukken we gewoon alle printers af naar het venster Directe (Foutopsporing) in de codelijnen 9 - 11.
Code:
' (C) Dan Elgaard (www.EXCELGAARD.dk)
Option Explicit
Sub PrinterDuplex_ListPrinters()
' This macro will use the PrinterDuplex object to retrieve a list of all printers connected to the computer
' * ' Initialize
On Error Resume Next
' * ' Define variable
Dim PDO As Object ' PrinterDuplex Object
Set PDO = CreateObject("PrinterDuplex.Class1")
Dim Printers As Variant
Printers = PDO.ListPrinters ' Read all attached printers into an array
Dim Counter As Long
' * ' List all printers to the Immediate (Debug) window
For Counter = LBound(Printers) To UBound(Printers)
Debug.Print Printers(Counter)
Next
ES: ' End of Sub
Set PDO = Nothing
If IsArray(Printers) Then Erase Printers
End Sub
pdPrinter ()
Wanneer u de naam van de printer moet opgeven waarmee u wilt werken, is het misschien verleidelijk om alleen de naam van de printer te gebruiken zoals Excel deze uit het systeem leest.
Misschien gebruikt u Application.ActivePrinter als u met de huidige actieve printer wilt werken of gebruikt u de printernaam die wordt gegeven door Application.Dialogs (xlDialogPrinterSetup) .Toon.
Maar dit zal niet werken - eenvoudig omdat 'PrinterDuplex.DLL' de naam van de printer moet gebruiken zonder poort indicatie.
U moet dus de naam van de printer als 'MijnPrinter' opgeven in plaats van 'MijnPrinter op Ne01:'
Op het eerste gezicht is het eenvoudig om de printernaam van de poortaanduiding te scheiden van de printernaam die door het systeem wordt gegeven, maar wat als het systeem in een andere taal is?
• Op een Deens systeem is de printerreeks 'MyPrinter på Ne01:'
• Op een Engels systeem is de printerstring 'MyPrinter on Ne01:'
• Op een Duits systeem is de printerstring 'MyPrinter auf Ne01:'
De functie, pdPrinter (), hieronder, neemt een bepaalde printernaam en zorgt ervoor dat de printernaam wordt geretourneerd in een indeling / syntaxis die 'PrinterDuplex.DLL' kan begrijpen en gebruiken.
Dus in plaats van het gebruik van de printernaam door het systeem, kunt u het volgende gebruiken:
Printer2Use = pdPrinter ("Myprinter on Ne01:")
... of welke printernaam u ook heeft gebruikt.
Als u geen printerargument opgeeft ...
Printer2Use = pdPrinter
... de huidige actieve printer wordt gebruikt (Application.ActivePrinter)
Als u een vraagteken opgeeft, als argument ...
Printer2Use = pdPrinter ("?")
... de gebruiker zal worden gevraagd om een printer te kiezen, gebruikmakend van het standaard printerdialoogvenster van VBA.
Merk op dat dit de gebruiker ook een optie tot annuleren zal bieden, wat zal resulteren in een lege tekststring die moet worden geretourneerd, om vervolgens een test uit te voeren op:
Als Printer2Use = vbNullString Dan ...
Om het kort te houden: gebruik de printernaam zonder poortaanduiding bij gebruik van 'PrinterDuplex.DLL' of gebruik deze functie, pdPrinter (), om ervoor te zorgen dat u het juiste formaat / de juiste syntaxis voor de printernaam krijgt wanneer u 'PrinterDuplex.DLL' gebruikt .
Code:
' (C) Dan Elgaard (www.EXCELGAARD.dk)
Option Explicit
Function pdPrinter(Optional ByVal PrinterName As String) As String
' This function will return the name of the given printer without any port indication,
' which is the syntax for printer names when using PrinterDuplex.
'
' The advantage of using this method is that you don't have to care about
' the language of the system, that you're running your macros on.
' Another advantage is that this function is using the PrinterDuplex object itself, to find
' the printer, thus you can be fairly sure, that the function will return a proper printer.
'
' If either no printer name is passed on to the function, or if the given printer cannot be found,
' the function will return the name of the active printer.
'
' If you want the active printer with the port indication in the language of the current system
' (i.e. your own language), you can just use the the standard 'Application.ActivePrinter' property.
' * ' Initialise
On Error Resume Next
' * ' Define variables
If PrinterName = vbNullString Then PrinterName = Application.ActivePrinter
Dim PDO As Object ' PrinterDuplex Object
Set PDO = CreateObject("PrinterDuplex.Class1")
Dim Counter As Long
Dim FoundPrinter As String
Dim Printers As Variant
Printers = PDO.ListPrinters ' Read all attached printers into an array
' * ' Request printer from user (if argument request that)
If PrinterName = "?" Then
PrinterName = Application.Dialogs(xlDialogPrinterSetup).Show
If UCase$(PrinterName) = "FALSE" Then GoTo EF:
End If
' * ' Search for the printer
For Counter = LBound(Printers) To UBound(Printers)
FoundPrinter = Left$(Printers(Counter), InStrRev(LCase$(Printers(Counter)), " on ") - 1)
If LCase$(FoundPrinter) = Left$(LCase$(PrinterName), Len(FoundPrinter)) Then
Exit For
Else
FoundPrinter = vbNullString
End If
Next
' * ' Default to the active printer if no printer is found
If FoundPrinter = vbNullString Then
FoundPrinter = Application.ActivePrinter
Counter = -3
Counter = InStrRev(FoundPrinter, " ")
If Counter > 2 Then
FoundPrinter = Left$(FoundPrinter, Counter - 1)
Counter = -3
Counter = InStrRev(FoundPrinter, " ")
If Counter > 2 Then
FoundPrinter = Left$(FoundPrinter, Counter - 1)
End If
End If
End If
EF: ' End of Function
pdPrinter = FoundPrinter
Set PDO = Nothing
If IsArray(Printers) Then Erase Printers
End Function
p.s. Kom hierop terug na het testen voor de liefhebber.
Kan wel enige weken duren i.v.m. andere werkzaamheden.
Gr. Dutch