首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问所选打印机而不是打印

访问所选打印机而不是打印
EN

Stack Overflow用户
提问于 2020-10-14 21:54:01
回答 1查看 71关注 0票数 1

我遇到了access窗体/报表的问题,因为它不能打印到我从组合框(列出所有可用打印机)中选择的打印机。

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

我有以下代码来打印报表中的标签:

代码语言:javascript
复制
    '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    

下面是在表单出现时,用可用打印机列表填充组合框的代码:

代码语言:javascript
复制
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打印机:

代码语言:javascript
复制
    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打印机。

EN

回答 1

Stack Overflow用户

发布于 2020-10-15 00:36:45

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

代码语言:javascript
复制
DoCmd.OpenReport "SomeReport", acViewPreview
Set Reports("SomeReport").Printer = Application.Printers("SomePrinter")
DoCmd.SelectObject acReport, "SomeReport"
DoCmd.PrintOut
DoCmd.Close

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

如果要指定纸张大小和纸箱,可以在设置报表打印机后执行此操作:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64354862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档