2012-07-04 18 views
7

Estoy construyendo una aplicación MS Access (2010) y voy a imprimir etiquetas de códigos de barras desde esta aplicación. Hay una variedad de otros informes y formularios que también se imprimirán, utilizando la configuración estándar de la impresora; sin embargo, con los códigos de barras, lo necesito para imprimir en una impresora específica, y tengo que configurarlo para usar un tamaño de página especial.MS Access: tamaño de papel personalizado

En mi búsqueda tengo found the printer object's property "Papersize", que tiene bastantes opciones predeterminadas "estándar" incluyendo acPRPSLetter para la letra estándar de EE. UU. A 8.5 "x 11" y acPRPSA4 para el tamaño de papel A4. Ninguno de los tamaños preestablecidos funcionará para mi uso. Hay un valor preestablecido que representa un tamaño personalizado del usuario, acPRPSUser, pero no he encontrado ninguna forma de programáticamente establecer el tamaño personalizado.

He leído acerca de cómo están las propiedades '.height' y '.width' de la impresora, pero no parece que existan en el VB utilizado para Access 2010 (creo que está basado en VB6) .

¿Alguien me puede ayudar a establecer un tamaño de papel personalizado con el código VB en Access 2010?

+0

¿Qué tal http://msdn.microsoft.com/en-us/library/ff836635.aspx? – Fionnuala

+0

Lo vi, y tenía la intención de incluirlo en mi publicación. Gracias por encontrarlo Esto muestra la propiedad '.papersize' que se está utilizando, que en el ejemplo está usando acPRPSLetter como se mencionó anteriormente. Eso es lo que estoy llamando, a falta de un término mejor, un preset. Necesito usar un tamaño personalizado. – CertifiedKennedy

+0

El último de la lista es acPRPSUser (http://msdn.microsoft.com/en-us/library/ff845524.aspx) – Fionnuala

Respuesta

2

No hay necesidad de VBA. Puede configurar todos los ajustes de página para los márgenes, orientación, papel, impresora y columnas utilizando el comando de configuración de página del menú: Herramientas para diseños de informes> Configuración de página> Configuración de página> Página> Papel> Tamaño, o > Página> Impresora para Nombre de informe> Usar impresora específica> Impresora> Propiedades. Estas configuraciones se guardan para cada informe induvidual.

Screenshot

+3

Eso está más cerca de lo que estoy buscando, pero no del todo. Este archivo se utilizará en diferentes computadoras, por lo que la configuración del tamaño del papel debe configurarse utilizando el archivo de acceso, ya que no es práctico desde el punto de vista del soporte técnico configurar la impresora manualmente en cada máquina por separado. Me encantaría configurarlo programáticamente si fuera posible, de esa forma cada computadora que ejecuta este archivo sabrá exactamente cómo manejar las etiquetas. – CertifiedKennedy

0

parece que necesita para mirar hacia fuera para .DefaultSize - si es verdad, entonces se ignoran sus ItemSizeHeight & ItemSizeWidth configuración

Hay mucha más información sobre MSDN y algunos ejemplos

1

que tenía el mismo problema. Lo resolví usando How to: Programmatically Retrieve Printer Capabilities

Hice un módulo con una Impresión de Procedimiento. Con la Function Printerselection podría llamar a una impresora usando una parte específica del nombre de la impresora. La función PaperSelection se usó para especificar el papel usando una parte específica del nombre del papel.

primero tenía que utilizar la declaración de la función DeviceCapabilities llamada a la API

' 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