首页 文章

MS Access:自定义纸张尺寸

提问于
浏览
7

我正在构建MS Access(2010)应用程序,我将从此应用程序打印条形码标签 . 还有许多其他报告和表格也将使用标准打印机设置进行打印,但是使用条形码我需要将其打印到特定打印机,并且必须将其设置为使用特殊页面大小 .

在我的搜索中,我有found the printer object's property "Papersize",它本身有相当多的'standard'默认选项,包括标准美国信函8.5" x 11"的acPRPSLetter和A4纸张尺寸的acPRPSA4 . 所有预设尺寸都不适合我的使用 . 有一个预设表示用户自定义大小,acPRPSUser,但我没有找到任何方式以编程方式设置自定义大小 .

我确实读过打印机的'.height'和'.width'属性,但看起来它们并不存在于用于Access 2010的VB中(我相信它基于VB6) .

任何人都可以帮我在Access 2010中使用VB代码设置自定义纸张大小吗?

3 回答

  • 0

    不需要VBA . 您可以使用菜单中的页面设置命令设置页边距,方向,纸张,打印机和列的所有页面设置:报表设计工具>页面设置>页面设置>页面>纸张>尺寸,或>页面> ReportName的打印机>使用特定打印机>打印机>属性 . 为每个简单报告保存这些设置 .

    Screenshot

  • 1

    我有同样的问题 . 我用How to: Programmatically Retrieve Printer Capabilities解决了

    我制作了一个带有程序打印输出的模块 . 使用Function Printerselection,我可以使用printername的特定部分调用打印机 . PaperSelection函数用于使用纸张名称的特定部分指定纸张 .

    首先,我必须使用DeviceCapabilities函数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
    
  • 2

    看起来你需要注意 .DefaultSize - 如果是真的,那么你的 ItemSizeHeightItemSizeWidth 设置会被忽略

    有关MSDN以及一些示例的更多信息

相关问题