【发布时间】: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在该位置显示的内容吗?