Hallo Access Gemeinde.
Bei einem Projekt kann ich in einem Formular den Drucker (Kombifeld) für den Berichtsdruck auswählen.
Ebenso kann ich mittels Kombifeld einstellen, ob Einseitiger oder beidseitiger Druck erfolgen soll.
In dem Zusammenhang, kam mir jetzt der Gedanke, ob es auch die Möglichkeit gibt, mittels VBA über die "Application.Printer" Eigenschaft feststellen zu können, ob der Drucker überhaupt Duplex fähig ist.
Ich kann kann ja den Wert ".Duplex" auslesen, aber der zeigt mir ja nur den eingestellten Wert an.
Meine beiden Drucker sind ja "Dublex" fähig.
Ich denke mal, wenn ein Drucker nicht "Dublex" fähig ist, bekomme ich eine Fehlermeldung, wenn ich zu drucken des Berichtes "beidseitiger Druck" einstellen würde?
Oder kann man diese Eigenschaft irgendwie über eine Schleife ermittel (also ob acPRDPSimplex, acPRDPVertical, acPRDPHorizontal möglich ist)?
Grüßle
Hallo,
zumindest mit der PS kannst du das abfragen:
Get-CimInstance -ClassName Win32_Printer | Select-Object -Property Caption, CapabilityDescriptions
Allerdings sind diese Infos stark abhängig vom installierten Treiber und müssen nicht immer stimmen.
https://powershell.one/wmi/root/cimv2/win32_printer (https://powershell.one/wmi/root/cimv2/win32_printer)
Damit sollte es auch in VBA möglich sein.
Alternativ würde es auch per API gehen. Hier ein Beispiel für ein BIN-Abfrage, sollte aber auch für Duplex (DC_DUPLEX) gehen.
https://learn.microsoft.com/en-us/office/vba/access/concepts/printing/programmatically-retrieve-printer-capabilities (https://learn.microsoft.com/en-us/office/vba/access/concepts/printing/programmatically-retrieve-printer-capabilities)
Knobbi38
Nachtrag:
Der Indexwert für Duplex:
Const DC_DUPLEX = 7&
Hallo Knobbi38,
danke für die Information.
Werde mich, bei Gelegenheit, mal damit beschäftigen.
Grüßle
Hier mal die WMI Variante:
Public Function GetDuplexPrinter() As String()
Dim oPrinters As Object
Dim oPrinter As Object
Dim avntCapabilities As Variant
Dim astrPrinter() As String
Dim i
Const cDUPLEX_PRINTING = 3&
astrPrinter = Split("")
Set oPrinters = GetObject("winmgmts:").InstancesOf("Win32_Printer")
If oPrinters.Count > 0 Then
For Each oPrinter In oPrinters
avntCapabilities = oPrinter.Capabilities
For i = 0 To UBound(avntCapabilities)
If avntCapabilities(i) = cDUPLEX_PRINTING Then
ReDim Preserve astrPrinter(UBound(astrPrinter) + 1)
astrPrinter(UBound(astrPrinter)) = oPrinter.Name
Exit For
End If
Next
Next
End If
GetDuplexPrinter = astrPrinter
Set oPrinter = Nothing
Set oPrinters = Nothing
End Function
und ein Beispiel für den Aufruf:
Sub ListDuplexPrinter()
Dim astrPrinter() As String
Dim i As Long, n As Long
astrPrinter = GetDuplexPrinter()
n = UBound(astrPrinter)
Debug.Print UBound(astrPrinter) + 1; " Duplex printer found."
For i = 0 To UBound(astrPrinter)
Debug.Print i, astrPrinter(i)
Next
End Sub
Nach dem Muster lassen sich auch noch andere Eigenschaften abfragen.
Siehe:
https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-printer (https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-printer)
Knobbi38
Hallo Knobbi38,
Merci für den Code.
Funktioniert tadellos.
So möchte ich mal programmieren können :)
Wollte mich schon früher bedanken, aber ich hatte auf das Forum teilweise keinen zugriff.
Grüßle