访问不打印到选择的打印机

Posted

技术标签:

【中文标题】访问不打印到选择的打印机【英文标题】:Access Not Printing to the Printer Chosen 【发布时间】:2020-10-14 13:54:01 【问题描述】:

我遇到了访问表单/报告的问题,因为它没有打印到我从组合框中选择的打印机(列出了所有可用的打印机)。

我确实知道我确实通过设计器使用打印机 zebra-01 创建了报告,我认为这可能是导致问题的原因。

我有以下代码可以从报告中打印标签:

    'Option Compare Database

Private Sub btnPrint_Click()
    'Validate Input Given. If the input is less than or equal to 0 discard the print command.
    'Two If statements, one for validating the input type and if the input is a positive number.
    
    If IsNull(Me.txtNumberOfLabels) Or Not IsNumeric(Me.txtNumberOfLabels.Value) Then
        MsgBox "O valor introduzido não é um valor numérico.", _
        vbOKOnly, "Erro"
        DoCmd.GoToControl "txtNumberOfLabels"
        Exit Sub
    End If
    
    If Me.txtNumberOfLabels.Value <= 0 Then
        MsgBox "O número de etiquetas a imprimir deve ser superior a 0", _
        vbOKOnly, "Erro"
        DoCmd.GoToControl "txtNumberOfLabels"
        Exit Sub
    End If
    
    Dim availablePrinters As Printer
    Dim selectedPrinter As String
    
    DoCmd.GoToControl "cbPrintersList"
    
    selectedPrinter = Me.cbPrintersList.Text
    
    For Each availablePrinters In Application.Printers
        If availablePrinters.DeviceName = selectedPrinter Then
            Set Application.Printer = availablePrinters
            Exit For
        End If
    Next availablePrinters
    
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    
    Dim lastLabelRecordIndex_Part1 As String
    Dim lastLabelRecordIndex_Part2 As String
    Dim lastLabelRecordIndex_Part3 As String
    Dim oldLastLabelRecordIndex_Part1 As String
    Dim oldLastLabelRecordIndex_Part2 As String
    Dim oldLastLabelRecordIndex_Part3 As String
    
    Dim strSQL As String
    
    Set db = CurrentDb
    strSQL = "SELECT MAX(Pre_SSCC) As MaxRecord FROM SSCC_Gen"
    Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
    
    oldLastLabelRecordIndex_Part1 = CStr(Left(rs("MaxRecord"), 8))
    oldLastLabelRecordIndex_Part2 = CStr(Mid(rs("MaxRecord"), 9, 4))
    oldLastLabelRecordIndex_Part3 = CStr(Right(rs("MaxRecord"), 5))
    
    rs.Close
    db.Close

    Dim labelRecordIndex As Long
    
    DoCmd.SetWarnings False
    
    For labelRecordIndex = CLng(oldLastLabelRecordIndex_Part3) To CLng(oldLastLabelRecordIndex_Part3) + Me.txtNumberOfLabels.Value - 1
        DoCmd.RunSQL "INSERT INTO SSCC_GenCount (Data) VALUES (#" & Format(Now(), "dd/mm/yyyy") & "#)"
    Next labelRecordIndex
    
    DoCmd.SetWarnings True
    
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
    
    lastLabelRecordIndex_Part1 = CStr(Left(rs("MaxRecord"), 8))
    lastLabelRecordIndex_Part2 = CStr(Mid(rs("MaxRecord"), 9, 4))
    lastLabelRecordIndex_Part3 = CStr(Right(rs("MaxRecord"), 5))
    rs.Close
    db.Close
    
    Dim oldLastLabelRecordIndex As String
    Dim lastLabelRecordIndex As String
    
    oldLastLabelRecordIndex = oldLastLabelRecordIndex_Part1 & oldLastLabelRecordIndex_Part2 & CStr(oldLastLabelRecordIndex_Part3 + 1)
    lastLabelRecordIndex = lastLabelRecordIndex_Part1 & lastLabelRecordIndex_Part2 & lastLabelRecordIndex_Part3
    
    DoCmd.SetWarnings False
    
    DoCmd.OpenReport Report_Labels_SSCC_Gen.Name, acViewPreview, , "Pre_SSCC BETWEEN '" & CStr(oldLastLabelRecordIndex) & "' AND '" & CStr(lastLabelRecordIndex) & "'", acHidden
    Set Report_Labels_SSCC_Gen.Printer = Application.Printers(Me.cbPrintersList.ListIndex)
    'MsgBox Report_Labels_SSCC_Gen.Printer.DeviceName
    DoCmd.OpenReport Report_Labels_SSCC_Gen.Name, , , "Pre_SSCC BETWEEN '" & CStr(oldLastLabelRecordIndex) & "' AND '" & CStr(lastLabelRecordIndex) & "'", acHidden
    DoCmd.Close acReport, Report_Labels_SSCC_Gen.Name, acSaveNo
    
    DoCmd.SetWarnings True
End Sub    

这是用可用打印机列表填充组合框的代码,只要表单出现:

Private Sub Form_Load()
    Dim printerIndex As Integer
    
    For printerIndex = 0 To Application.Printers.Count - 1
        Me.cbPrintersList.AddItem (Application.Printers(printerIndex).DeviceName)
    Next printerIndex
    
    DoCmd.GoToControl "cbPrintersList"
End Sub

现在,根据我一整天阅读的几十篇文章,以下代码应该设置我要打印的打印机,但它仍然不断发送到 zebra-01 打印机:

    DoCmd.OpenReport Report_Labels_SSCC_Gen.Name, acViewPreview, , "Pre_SSCC BETWEEN '" & CStr(oldLastLabelRecordIndex) & "' AND '" & CStr(lastLabelRecordIndex) & "'", acHidden
    Set Report_Labels_SSCC_Gen.Printer = Application.Printers(Me.cbPrintersList.ListIndex)
    'MsgBox Report_Labels_SSCC_Gen.Printer.DeviceName
    DoCmd.OpenReport Report_Labels_SSCC_Gen.Name, , , "Pre_SSCC BETWEEN '" & CStr(oldLastLabelRecordIndex) & "' AND '" & CStr(lastLabelRecordIndex) & "'", acHidden
    DoCmd.Close acReport, Report_Labels_SSCC_Gen.Name, acSaveNo

谁能向我解释我错过了什么或做错了什么?

作为参考,以下是将打印机设置为 report.printer 属性之前和之后发生的情况:

设置打印机之前

设置打印机后

您可以从调试中清楚地看到,报表的打印机属性设置为我从组合框中选择的打印机。

但是,由于某种原因,我无法理解,在那行代码之后,当运行 OpenReport 打印标签时,它会打印到 zebra-01 打印机...

【问题讨论】:

如果If availablePrinters.DeviceName = selectedPrinter Then 永远不正确怎么办(例如,因为Me.cbPrintersList.Text 打印机在availablePrinters 中不存在?那么您将永远不会Set Application.Printer 并且它会在错误的打印机上打印。 •在我提到的代码中逐步(使用 F8)浏览您的代码,并分析这部分和循环的每个步骤中的变量值。检查 Set Application.Printer 是否运行。 那没有意义,因为在表单的加载事件中,可用的打印机被加载到组合框中。用户会看到该列表,并从组合框中选择要打印到的打印机,因此在给定时间,If 语句将为真。 If 语句永远不会为真的唯一时刻是,如果没有填充组合框,或者如果用户没有找到所需的打印机,那么在任何情况下都没有必要打印。 另外,我忘了提一下,如果您注意评论的 MsgBox Report_Labels_SSCC_Gen.Printer.DeviceName,此时,为报告设置的打印机实际上是从组合框中选择的打印机这与 zebra-01 不同(在这种特定情况下,我们要为 Zebra - Azambuja Sul 平台打印机打印,在调试时是 Report_Labels_SSCC_Gen.Printer.DeviceName 属性出现的名称。 @Pᴇʜ 我确实调试了整个代码,你提到的那段代码没有错误,并且正在运行整个打印机列表,直到找到我选择的那个,在这种情况下它是打印机 nr .12 或列表索引 = 总共 22 台打印机中的 11 台。 您的'MsgBox Report_Labels_SSCC_Gen.Printer.DeviceName 在哪里,您可以查看MsgBox Application.Printer.DeviceName 在该位置显示的内容吗? 【参考方案1】:

就个人而言,我使用以下代码将报告打印到指定的打印机:

DoCmd.OpenReport "SomeReport", acViewPreview
Set Reports("SomeReport").Printer = Application.Printers("SomePrinter")
DoCmd.SelectObject acReport, "SomeReport"
DoCmd.PrintOut
DoCmd.Close

这仅适用于未打印到默认打印机的报告,因此首先在设计视图中打开报告,转到页面设置,然后选择使用特定打印机,然后选择打印机(任何打印机),以确保报表不会在系统默认打印机上打印。

如果要指定纸张大小和bin,可以在设置报表打印机后进行:

DoCmd.OpenReport "SomeReport", acViewPreview
Set Reports("SomeReport").Printer = Application.Printers("SomePrinter")
    Reports("SomeReport").Printer.PaperSize = 1
    Reports("SomeReport").Printer.PaperBin = 2
DoCmd.SelectObject acReport, "SomeReport"
DoCmd.PrintOut
DoCmd.Close

但是,为纸张和垃圾箱编号获取正确的编号有点复杂。此处概述了该过程:https://docs.microsoft.com/en-us/office/vba/access/concepts/printing/programmatically-retrieve-printer-capabilities

【讨论】:

"在设计视图中打开报表,进入页面设置,选择使用特定打印机,然后选择打印机(任何打印机),以确保报表不会在系统上打印默认打印机。”我将发布另一个答案来询问我到底需要去哪里,因为我似乎无法找到您所指出的内容,因为我之前也想过这种可能性,但我找不到。 好吧,考虑到上一个帖子已被删除,我希望您能关注并通过您发送给我的最后一个链接帮助我。我将整个代码粘贴到一个新模块中,但我很茫然,因为我看不到一种方法来调用我需要的东西。我猜我需要使用 SetPrinterCustomPaperSize 过程,但是这个过程没有传递打印机参数,所以我怎么去使用它? 我没有可以随时调整自定义尺寸的打印机,因此您必须自己弄清楚确切的尺寸。 是的,我正在尝试找出如何使用该代码。我发现您不能使用单独模块的代码,您只能在表单或报告模块上使用它。在我的具体情况下,在 Report_Labels_SSCC_Gen 报告上使用是有意义的。现在我尝试直接从表单中使用 SetPrinterCustomPaperSize 函数,如下所示:Report_Labels_SSCC_Gen.SetPrinterCustomPaperSize 8!, 4.7!在实际测试之前,我查看了代码,它似乎不会运行,因为变量 mhDCPrinter 始终为 0,这意味着我没有使用默认打印机 ...

以上是关于访问不打印到选择的打印机的主要内容,如果未能解决你的问题,请参考以下文章

访问:选择多条记录打印报表

Excel函数打印输出选择范围如果不为空(不打印)

Windows 共享打印机

iOS Airprint 自动打印而不选择打印机

惠普9010怎么只打黑白

怎么设置打印机默认一张,无需选择打印机直接打印