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研究打印表单时指定打印机的主要内容,如果未能解决你的问题,请参考以下文章