Re: Druckersteuerung über VBA
- From: Eike Bimczok <eikenospam@xxxxxx>
- Date: Wed, 31 Aug 2005 23:07:34 +0200
Hallo Klaus,
so etwas müsste am Besten mit API Funktionen gehen. Leider kenne ich mich nur wenig damit aus. Vielleicht hilft dir folgender Code weiter. Speziell die Eigenschaft "Printer.PaperBin = ..." ist wohl das, was du suchst.
Der Code kommt von http://www.vbusers.com/code/codeget.asp?ThreadID=599&PostID=1&NumReplies=0
Google wird dir weiterhelfen mit diesen Suchbegriffen: PaperBin vba api
Gruß und viel Erfolg noch, Eike
*****************************************************************
The code below shows to select printer common dialog and sets the application printer to the printer selected by the user.
Option Explicit
Private Const PD_PRINTSETUP = &H40
Private Const PD_DISABLEPRINTTOFILE = &H80000
Private Const CCHDEVICENAME = 32, CCHFORMNAME = 32
Private Type PRINTDLG_TYPE
lStructSize As Long
hwndOwner As Long
hDevMode As Long
hDevNames As Long
hDC As Long
flags As Long
nFromPage As Integer
nToPage As Integer
nMinPage As Integer
nMaxPage As Integer
nCopies As Integer
hInstance As Long
lCustData As Long
lpfnPrintHook As Long
lpfnSetupHook As Long
lpPrintTemplateName As String
lpSetupTemplateName As String
hPrintTemplate As Long
hSetupTemplate As Long
End Type
Private Type DEVNAMES_TYPE
wDriverOffset As Integer
wDeviceOffset As Integer
wOutputOffset As Integer
wDefault As Integer
extra As String * 100
End Type
Private Type DEVMODE_TYPE
dmDeviceName As String * CCHDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
Private Declare Function PrintDialog Lib "comdlg32.dll" Alias "PrintDlgA" (pPrintdlg As PRINTDLG_TYPE) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
'Purpose : Shows the printer common dialog. 'Inputs : [lOwnerForm] The handle to the owner form. ' [lPrintFlags] Any printer flags. 'Outputs : Returns the email address of the specified outlook message. 'Author : Andrew Baker 'Date : 25/03/2000 'Notes :
Public Sub ShowPrinter(Optional lOwnerForm As Long = 0, Optional lPrintFlags As Long = PD_PRINTSETUP)
Const GMEM_MOVEABLE = &H2, GMEM_ZEROINIT = &H40
Const DM_DUPLEX = &H1000&, DM_ORIENTATION = &H1&
Dim tPrinterDialog As PRINTDLG
Dim tDevMode As DEVMODE
Dim tDevName As DEVNAMES
Dim lDevModePtr As Long, lDevNamePtr As Long
Dim sNewPrinterName As String
Dim prnTestPrinter As Printer
tPrinterDialog.lStructSize = Len(tPrinterDialog)
tPrinterDialog.hWndOwner = lOwnerForm tPrinterDialog.flags = lPrintFlags
'Get the current orientation and duplex setting
tDevMode.dmDeviceName = Printer.DeviceName
tDevMode.dmSize = Len(tDevMode)
tDevMode.dmFields = DM_ORIENTATION Or DM_DUPLEX
tDevMode.dmPaperWidth = Printer.Width
tDevMode.dmOrientation = Printer.Orientation
tDevMode.dmPaperSize = Printer.PaperSize
tDevMode.dmDuplex = Printer.Duplex'Copy settings into type
tPrinterDialog.hDevMode = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(tDevMode))
lDevModePtr = GlobalLock(tPrinterDialog.hDevMode)
If lDevModePtr > 0 Then
CopyMemory ByVal lDevModePtr, tDevMode, Len(tDevMode)
Call GlobalUnlock(tPrinterDialog.hDevMode)
End If
'Set driver, device, and port name
With tDevName
.wDriverOffset = 8
.wDeviceOffset = .wDriverOffset + 1 + Len(Printer.DriverName)
.wOutputOffset = .wDeviceOffset + 1 + Len(Printer.Port)
.wDefault = 0
.extra = Printer.DriverName & Chr(0) & Printer.DeviceName & Chr(0) & Printer.Port & Chr(0)
End With
'Allocate memory for the initial hDevName structure
'and copy the settings gathered above into this memory
tPrinterDialog.hDevNames = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(tDevName))
lDevNamePtr = GlobalLock(tPrinterDialog.hDevNames)
If lDevNamePtr > 0 Then
CopyMemory ByVal lDevNamePtr, tDevName, Len(tDevName)
Call GlobalUnlock(lDevNamePtr)
End If
'Call the print dialog up and let the user make changes
If PrintDialog(tPrinterDialog) <> 0 Then
'First get the tDevName structure.
lDevNamePtr = GlobalLock(tPrinterDialog.hDevNames)
CopyMemory tDevName, ByVal lDevNamePtr, 45
Call GlobalUnlock(lDevNamePtr)
GlobalFree tPrinterDialog.hDevNames'Next get the tDevMode structure and set the printer properties appropriately
lDevModePtr = GlobalLock(tPrinterDialog.hDevMode)
CopyMemory tDevMode, ByVal lDevModePtr, Len(tDevMode)
Call GlobalUnlock(tPrinterDialog.hDevMode)
GlobalFree tPrinterDialog.hDevMode
sNewPrinterName = UCase$(Left(tDevMode.dmDeviceName, InStr(tDevMode.dmDeviceName, Chr$(0)) - 1))
If Printer.DeviceName <> sNewPrinterName Then
'Find the new printer
For Each prnTestPrinter In Printers
'Note, the API only supports 32 character long printer names (was a 16 bit windows API call)
If Left$(UCase$(prnTestPrinter.DeviceName), Len(sNewPrinterName)) = sNewPrinterName Then
'Found matching printer
Set Printer = prnTestPrinter
Exit For
End If
Next
End If
'Set printer object properties according to selections made by user
On Error Resume Next
Printer.Copies = tDevMode.dmCopies
Printer.Duplex = tDevMode.dmDuplex
Printer.Orientation = tDevMode.dmOrientation
Printer.PaperSize = tDevMode.dmPaperSize
Printer.PrintQuality = tDevMode.dmPrintQuality
Printer.ColorMode = tDevMode.dmColor
Printer.PaperBin = tDevMode.dmDefaultSource
On Error GoTo 0
End If
End Subklaus.schmitz schrieb:
Hallo,
Über die Druckersteuerung mit VBA wurde schon viel geschrieben. Es gibt Leute die schwören auf die Druckersteuerung mit Sendkeys, ich nicht so, weil da leider nicht immer das gewünschte Ergebnis kommt und flexibel ist man da auch nicht.
Ich habe statt dessen für meinen Drucker zunächst 4 Treiber angelegt, die ich dann mit VBA aufrufe.
Das funktioniert zwar sehr zuverlässig, aber leider ist auch das nur eine Behelflösung weil man damit dann nur eine einzige Druckereinstellung anwählen kann, die man speziell über Windows für diesen Treiber festgelegt hat.
Ich möchte gerne an den Drucker die Steuersequenzen per VBA schicken und bitte um Hilfestellung.
z.B.
Papierzuführung 1 (Standard Papierkassette) dez. 27 38 108 49 72 hex. 1B 26 6C 31 48
Papierzuführung MF (Multifunktionsschacht) dez 27 38 108 52 72 hex. 1B 26 6C 34 48
Papierzuführung 2 (optionale zweite Papierkassette) dez. 27 38 108 53 72 hex. 1B 26 6C 35 48
Wie kann ich die Steuersequenzen an den Drucker schicken ?
Wenn möglich bitte die genaue Schreibweise für eine der oben genannten Steuersequenzen.
Danke für jeden Hinweis.
MfG Klaus
.
- Follow-Ups:
- Re: Druckersteuerung über VBA
- From: klaus.schmitz
- Re: Druckersteuerung über VBA
- Prev by Date: Re: Nur Inhalte kopieren/einfügen
- Next by Date: Re: Makro-Problem beim Umstieg auf Excel 2003
- Previous by thread: Re: aus VBA bestimmtes Verzeichnis anzeigen
- Next by thread: Re: Druckersteuerung über VBA
- Index(es):
Relevant Pages
|