VBA研究打印表单时指定打印机

Posted 宋哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VBA研究打印表单时指定打印机相关的知识,希望对你有一定的参考价值。

作者:iamlaosong

我用Excel做做了一个打印拣货单标签的工具,实际上是打印邮件标签兼做拣货单,由于仓库电脑需要连接多台打印机(不同标签用纸不同,换纸还不如换打印机),所以打印标签时,经常要改变默认打印机,一旦忘了修改,就会打印出一堆废纸来。那么,不改变默认打印机,能不能将标签打印到指定的打印机上面呢?

答案是肯定的。

打印时指定打印机只需要提供ActivePrinter参数内容就可以了,下面是打印一张单据的代码,其中变量ptName内容就是打印机名称,从单元格中读取:

    ptName = Cells(4, "M")  

打印代码如下:

'单行打印
Sub SinglePrint()
    Dim rr As Long, ptName As String
    
    stName = "规格"
    SizeNo = Sheets(stName).[A1].End(xlDown).Row
    arrSize = Sheets(stName).Range("A2:D" & SizeNo).Value
    SizeNo = SizeNo - 1
    
    rr = Cells(4, "K")
    ptName = Cells(4, "M")
    rr = GetRowData(rr)
    
    ActiveSheet.PrintOut ActivePrinter:=ptName
End Sub

下面是打印筛选内容的代码:

'选择打印
Sub SelectPrint()
    Dim md As Integer, pm As Integer, rr1, rr2, rr As Long, pn As Long, pdf As String, msg As String
    Dim ptName As String
    
    stName = "规格"
    SizeNo = Sheets(stName).[A1].End(xlDown).Row
    arrSize = Sheets(stName).Range("A2:D" & SizeNo).Value
    SizeNo = SizeNo - 1
    
    ptName = Cells(4, "M")
    stName = "清单"
    pm = Cells(7, "M")    '输出模式:0=到打印机;其它(n)=按n*100分组到文件
    rr1 = 3
    rr2 = Sheets(stName).[A1].End(xlDown).Row
    For rr = rr1 To rr2
        If Not Sheets(stName).Rows(rr).Hidden Then
            rr = GetRowData(rr)
            Application.StatusBar = "已完成:" & CStr(Round((rr - rr1) * 100 / (rr2 - rr1 + 1), 2)) & "%"
            DoEvents
            'Worksheets.("sheet1").PrintOut From:=2, To:=3, Copies:=3
            'ActiveSheet.PrintPreview
            If pm = 0 Then
                ActiveSheet.PrintOut ActivePrinter:=ptName
                'MsgBox "print line: " & rr
            Else
                pn = Int((rr - rr1) / (pm * 100))
                pdf = ThisWorkbook.Path & "\\pdf" & pn
                If pm <> 0 And Dir(pdf, vbDirectory) = vbNullString Then
                    MkDir pdf
                End If
    
                ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdf & "\\装箱单" & Format(rr, "000000") & ".pdf"
            End If
        End If
    Next rr
    Application.StatusBar = "就绪"
End Sub

这儿用到的参数打印机名称,可以用下面的代码获取并保存到工作表中。也可以用这个方法改变默认打印机(语句是ws.SetDefaultPrinter ptName),然后打印中就不需要指定打印机了,打印结束时再恢复原来默认的打印机。不过,我觉得直接指定更好。

'得到所有打印机名称
Sub AllPrinter()
    Dim i&, ws As Object, st$, ptn$, n&
    Set ws = CreateObject("wscript.network")
    'st = Application.ActivePrinter '保存系统默认打印机
    n = ws.EnumPrinterConnections.Count
    For i = 1 To n - 1 Step 2
        ptn = ws.EnumPrinterConnections.Item(i)  '打印机名称
        Cells((i + 5) / 2, "O") = (i + 1) / 2
        Cells((i + 5) / 2, "P") = ptn
    Next
End Sub

得到的名称和参数填写界面如下:

在VBA中,使用PrintOut方法来打印工作表。例如,语句:

ActiveSheet.PrintOut

将打印当前工作表。

PrintOut方法的语法如下:

SheetObj.PrintOut(From,To,Copies,Preview,ActivePrinter,PrintToFile,Collate,PrToFileName,IgnorePrintAreas)

说明:

  • 所有参数均可选。使用适当的参数指定打印机、份数、逐份打印以及是否需要打印预览。使用参数PrintToFile和参数PrToFileName将工作表打印到文件。参数From和参数To用于指定打印的页码范围。

  • 参数From指定开始打印的页码。如果忽略,则从头开始打印。

  • 参数To指定最后打印的页码。如果忽略,则打印到最后一页。

  • 参数Copies指定要打印的份数。如果忽略,则只打印1份。

  • 参数Preview指定打印前是否要预览打印效果。设置为True则打印预览;设置为False(默认值)则直接打印。

  • 参数ActivePrinter设置当前打印机的名称。

  • 参数PrintToFile设置为True,将打印到文件。如果没有指定参数PrToFileName,将提示用户输入要输出的文件名。

  • 参数Collate设置为True将逐份打印。

  • 参数PrToFileName在参数PrintToFile设置为True时指定想要打印到文件的名称。

  • 参数IgnorePrintAreas设置为True将忽略打印区域,打印整份文档。

例如:

ActiveSheet.PrintOut From:=1, to:=3

Worksheets. ("sheet1").PrintOut From:=2, To:=3, Copies:=3

以上是关于VBA研究打印表单时指定打印机的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBA 打印用户表单

问:如何以横向格式打印 EXCEL / VBA 用户表单? [关闭]

使用VBA打印用户表单

VBA 通过唯一标识符使用打印机

java项目中怎么实现单据的打印

请问如何实现单据的即打即停?