Ü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
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 Sub
klaus.schmitz schrieb:
danke, daß Du Dir Gedanken gemacht hast.
Wo hast Du denn diesen langen Code ausgekramt ?
Ich möchte ja nicht mit dem Drucker stricken sondern
dem Drucker lediglich sagen, daß er das Papier aus
dem einen oder anderen Schacht nehmen soll.
Im Prinzip funktioniert mein System mit den
4 Druckertreibern ja ganz ordentlich und auch
zuverlässig, wenn keiner den Druckertreiber verstellt.
Ich habe mir vom Druckerhersteller die Steuersequenzen
für meinen Drucker geben lassen und war der Meinung,
daß ich nur eine einzige Zeile mit der Steuersequenz
an den Drucker schicken muß um den Drucker zu steuern.
Vor etwa 15 Jahren habe ich so etwas mal mit Pascal
unter DOS gemacht und da waren es auch nur weinige
Zeilen.
Ich suche also nur eine Zeile, die meinem Drucker
von Excel aus die Steuersequenz sendet.
Sollte es von Excel aus so nicht möglich sein, dann muß
ich halt weiter suchen oder einen Freund bitten mir so
eine Druckersteuerung in C++ zu bauen.
Also nochmals Danke.
MfG
Klaus
klaus.schmitz schrieb am 31.08.2005
> Ü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.
Ja, Sendkeys ist 'pfui' ;-)
> Ich habe statt dessen für meinen Drucker zunächst
> 4 Treiber angelegt, die ich dann mit VBA aufrufe.
Das ist das gängige Verfahren, welches am besten klappt.
> Ich möchte gerne an den Drucker die Steuersequenzen
> per VBA schicken und bitte um Hilfestellung.
>
> Wie kann ich die Steuersequenzen an den Drucker
> schicken ?
Ob dies so möglich ist, kann ich nicht sagen - vie API vermutlich was Eicke
ja schon geschrieben hat.
Eventuell ist für dich das AddIn 'MulitTray Print' interessant, das Du hier
direkt herunterladen kannst:
http://members.chello.nl/keepitcool/files/MTprint_v1.0a.zip
Mit freundlichen Grüssen
Thomas Ramel
--
- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2000 SP-3]
Microsoft Excel - Die ExpertenTipps:
(http://tinyurl.com/9ov3l und http://tinyurl.com/cmned)