访问不打印到选择的打印机
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,这意味着我没有使用默认打印机 ...以上是关于访问不打印到选择的打印机的主要内容,如果未能解决你的问题,请参考以下文章