Dubbelzijdig printen

Status
Niet open voor verdere reacties.

DutchOirs

Gebruiker
Lid geworden
30 sep 2009
Berichten
720
Goedemiddag allen,

Zit met het volgende probleem: zou graag met VBA (2003) een printer zo instellen dat hij dubbelzijdig print.
Weet dat er andere manieren zijn, maar wilde dit graag op deze manier realiseren.
Dit i.v.m. dat in het file verschillende gegevens achter elkaar moet en andere weer niet.

Heb al diverse pogingen gedaan, en zag hier niet zoveel vragen daarover die opgelost werden.

Heb een voorbeeldje gemaakt en ben daarmee aan het stoeien.

Alvast many thanks.

Dutch
 

Bijlagen

  • Printer_Dubbelzijdig_Printen #1.xls
    58,5 KB · Weergaven: 78
Laatst bewerkt:
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
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan