MS Access: Custom Paper Size

I am creating an MS Access (2010) application and I will print barcode shortcuts from this application. There are many other reports and forms that will also be printed using the standard printer settings, however with the barcodes that I need to print on a particular printer, and must set it to use a special page size.

In my search, I found the property of the printer object "Papersize", in which there are many "standard" default options, including acPRPSLetter for standard US letter at 8.5 "x 11" and acPRPSA4 for A4 format. None of the predefined sizes will work for my use. There is one preset that represents a custom size, acPRPSUser, but I have not found a way to programmatically set a custom size.

I read about the ".ight" and ".width" properties for the printer, but they don't seem to exist in the VB used for Access 2010 (I believe it is based on VB6).

Can someone help me set my own paper size using the VB code in Access 2010?

+7
source share
3 answers

No need for VBA. You can set all page parameters for margins, orientations, paper, printer and columns using the page parameters command from the menu: Tools for report projects> Page settings> Page parameters> Page> Paper> Size or> Page> Printer for the report name> Use special printer> Printer> Properties. These settings are saved for each individual report.

Screenshot

+2
source

I had the same problem. I solved this using How to: Get Printer Features Programmatically

I created a module with a procedural printout. Using the Printerselection function, I could call the printer using a specific part of the printername name. The PaperSelection function was used to indicate paper using a specific part of the paper name.

First I had to use an ad to call the DeviceCapabilities API function

' Declaration for the DeviceCapabilities function API call. Private Declare Function DeviceCapabilities Lib "winspool.drv" _ Alias "DeviceCapabilitiesA" (ByVal lpsDeviceName As String, _ ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, _ ByVal lpDevMode As Long) As Long ' DeviceCapabilities function constants. Private Const DC_PAPERNAMES = 16 Private Const DC_PAPERS = 2 Private Const DC_BINNAMES = 12 Private Const DC_BINS = 6 Private Const DEFAULT_VALUES = 0 Private Type str_DEVMODE RGB As String * 94 End Type Private Type type_DEVMODE strDeviceName As String * 32 intSpecVersion As Integer intDriverVersion As Integer intSize As Integer intDriverExtra As Integer lngFields As Long intOrientation As Integer intPaperSize As Integer intPaperLength As Integer intPaperWidth As Integer intScale As Integer intCopies As Integer intDefaultSource As Integer intPrintQuality As Integer intColor As Integer intDuplex As Integer intResolution As Integer intTTOption As Integer intCollate As Integer strFormName As String * 32 lngPad As Long lngBits As Long lngPW As Long lngPH As Long lngDFI As Long lngDFr As Long End Type Private Cnt As Integer, PrinterSelect As Integer Public Sub PrintOut(ByVal rptName As String, Printer As String, Paper As String, BinName As String, Optional Landscape As Boolean, Optional WhereCond) Dim rpt As Report DoCmd.OpenReport rptName, acViewPreview, , WhereCond Set rpt = Reports(rptName) PrinterSelect = PrinterSelection(Printer) rpt.Printer = Application.Printers(PrinterSelect) rpt.Printer.PaperSize = PaperSelection(Paper, PrinterSelect) If Landscape Then rpt.Printer.Orientation = acPRORLandscape Else rpt.Printer.Orientation = acPRORPortrait End If rpt.Printer.PaperBin = BinSelection(BinName, PrinterSelect) End Sub Public Function PrinterSelection(Printer As String) As Integer For Cnt = 0 To Application.Printers.Count - 1 If InStr(1, Application.Printers(Cnt).DeviceName, Printer) > 0 Then PrinterSelection = Cnt End If Next Cnt End Function Public Function PaperSelection(Paper As String, Printer As Integer) As Integer Dim lngPaperCount As Long Dim lngCounter As Long Dim hPrinter As Long Dim strDeviceName As String Dim strDevicePort As String Dim strPaperNamesList As String Dim strPaperName As String Dim intLength As Integer Dim strMsg As String Dim aintNumPaper() As Integer On Error GoTo GetPaperList_Err ' Get the name and port of the selected printer. strDeviceName = Application.Printers(Printer).DeviceName strDevicePort = Application.Printers(Printer).Port ' Get the count of paper names supported by the printer. lngPaperCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ lpPort:=strDevicePort, _ iIndex:=DC_PAPERNAMES, _ lpOutput:=ByVal vbNullString, _ lpDevMode:=DEFAULT_VALUES) ' Re-dimension the array to the count of paper names. ReDim aintNumPaper(1 To lngPaperCount) ' Pad the variable to accept 64 bytes for each paper name. strPaperNamesList = String(64 * lngPaperCount, 0) ' Get the string buffer of all paper names supported by the printer. lngPaperCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ lpPort:=strDevicePort, _ iIndex:=DC_PAPERNAMES, _ lpOutput:=ByVal strPaperNamesList, _ lpDevMode:=DEFAULT_VALUES) ' Get the array of all paper numbers supported by the printer. lngPaperCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ lpPort:=strDevicePort, _ iIndex:=DC_PAPERS, _ lpOutput:=aintNumPaper(1), _ lpDevMode:=DEFAULT_VALUES) ' List the available paper names. For lngCounter = 1 To lngPaperCount ' Parse a paper name from the string buffer. strPaperName = Mid(String:=strPaperNamesList, Start:=64 * (lngCounter - 1) + 1, Length:=64) intLength = VBA.InStr(Start:=1, String1:=strPaperName, String2:=Chr(0)) - 1 strPaperName = Left(String:=strPaperName, Length:=intLength) If InStr(1, strPaperName, Paper) > 0 Then ' Select the a paper number corresponding to the paper name. PaperSelection = aintNumPaper(lngCounter) End If Next lngCounter GetPaperList_End: Exit Function GetPaperList_Err: MsgBox Prompt:=err.Description, Buttons:=vbCritical & vbOKOnly, _ Title:="Error Number " & err.Number & " Occurred" Resume GetPaperList_End End Function Public Function BinSelection(BIN As String, Printer As Integer) As Integer ' Uses the DeviceCapabilities API function to choose the desired paper bin supported by the chosen printer Dim lngBinCount As Long Dim lngCounter As Long Dim hPrinter As Long Dim strDeviceName As String Dim strDevicePort As String Dim strBinNamesList As String Dim strBinName As String Dim intLength As Integer Dim strMsg As String Dim aintNumBin() As Integer On Error GoTo GetBinList_Err ' Get name and port of the default printer. strDeviceName = Application.Printers(Printer).DeviceName strDevicePort = Application.Printers(Printer).Port ' Get count of paper bin names supported by the printer. lngBinCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ lpPort:=strDevicePort, _ iIndex:=DC_BINNAMES, _ lpOutput:=ByVal vbNullString, _ lpDevMode:=DEFAULT_VALUES) ' Re-dimension the array to count of paper bins. ReDim aintNumBin(1 To lngBinCount) ' Pad variable to accept 24 bytes for each bin name. strBinNamesList = String(Number:=24 * lngBinCount, Character:=0) ' Get string buffer of paper bin names supported by the printer. lngBinCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ lpPort:=strDevicePort, _ iIndex:=DC_BINNAMES, _ lpOutput:=ByVal strBinNamesList, _ lpDevMode:=DEFAULT_VALUES) ' Get array of paper bin numbers supported by the printer. lngBinCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ lpPort:=strDevicePort, _ iIndex:=DC_BINS, _ lpOutput:=aintNumBin(1), _ lpDevMode:=0) ' List available paper bin names. strMsg = "Paper bins available for " & strDeviceName & vbCrLf For lngCounter = 1 To lngBinCount ' Parse a paper bin name from string buffer. strBinName = Mid(String:=strBinNamesList, _ Start:=24 * (lngCounter - 1) + 1, _ Length:=24) intLength = VBA.InStr(Start:=1, _ String1:=strBinName, String2:=Chr(0)) - 1 strBinName = Left(String:=strBinName, _ Length:=intLength) If InStr(1, strBinName, BIN) > 0 Then ' Select the bin number corresponding to the bin name. BinSelection = aintNumBin(lngCounter) End If Next lngCounter GetBinList_End: Exit Function GetBinList_Err: MsgBox Prompt:=err.Description, Buttons:=vbCritical & vbOKOnly, _ Title:="Error Number " & err.Number & " Occurred" Resume GetBinList_End End Function 
+1
source

it looks like you need to look for .DefaultSize - if true, then your ItemSizeHeight and ItemSizeWidth ignored

There is more information about MSDN and some examples.

0
source

All Articles