Reputation: 97
I am building a MS Access (2010) application and I'll be printing barcode labels from this application. There are a variety of other reports and forms which will also be printed, using the standard printer settings, however with the barcodes I need it to print to a specific printer, and have to set it to use a special page size.
In my searching I have found the printer object's property "Papersize" which itself has quite a few 'standard' default options including acPRPSLetter for the standard US Letter at 8.5" x 11" and acPRPSA4 for the A4 paper size. None of the preset sizes will work for my use. There is one preset which represents a user custom size, acPRPSUser, but I have not found any way to programmatically set the custom size.
I did read about how there are the '.height' and '.width' properties of the printer, but it does not appear that they exist in the VB used for Access 2010 (I believe it is based on VB6).
Can anyone help me set a custom paper size using VB code in Access 2010?
Upvotes: 7
Views: 24767
Reputation: 131
I had the same problem. I solved it by using How to: Programmatically Retrieve Printer Capabilities
I made a module with a Procedure Printout. With the Function Printerselection I could call a printer using a specific part of the printername. The function PaperSelection was used to specify the paper using a specific part of the paper name.
First I had to use the declaration for the DeviceCapabilities function API call
' 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
Upvotes: 3
Reputation: 15923
looks like you need to look out for .DefaultSize
- if it's true, then your ItemSizeHeight
& ItemSizeWidth
settings are ignored
There's lots more information on MSDN and some examples
Upvotes: 0
Reputation: 43664
There is no need for VBA. You can set all page settings for margins, orientation, paper, printer and columns by using the page settings command from the menu: Tools for report designs > Page settings > Page settings > Page > Paper > Size, or > Page > Printer for ReportName > Use specific printer > Printer > Properties. These settings are saved for each induvidual report.
Upvotes: 1