新浪博客

在Excel VBA中指定不同的打印机进行打印

2016-05-09 20:22阅读:
在日常工作中,如果需要将一个工作薄中的两个工作表分别指定不同的打印机打印时,我们可以设定Application.ActivePrinter来指定不同的打印机打印。
如Application.ActivePrinter =“ \\252\EPSON LQ-680K II ESC/P2 on Ne01:”
或Application.ActivePrinter = 'TSC TTP-342 Pro on Ne00:'
正常情况下,我们的电脑中的打印机名称都是类似于TSC TTP-342 Pro或者网络打印机的EPSON LQ-630K ESC/P2 on 188.u.m.local,在我们代入Excel VBA中时不能直接填写其名称,如TSC TTP-342 Pro,必须要加上其对应的端口信息才可以正常打印,端口信息即类似Ne00:或Ne01:。
如果我们想知道一个打印机对应的端口信息可以在注册表中查看,运行“Regedit”后查找“PrinterPorts”,即可看到每个打印机对应的端口信息。
在Excel VBA中我们可以使用一个简单的方式来获得打印机的完整名称。首先在Excel工作表中设置好需要使用的打印机,然后在VBE编辑器中,按<Ctrl G>打印立即窗口,输入?application.ActivePrinter,回车后即可得到完整的打印机名称。
理论上来讲这个问题是比较简单的,但有时候会出现一些异常,比如程序在运行了一周左右后发现代码报错,通过查错得知是由于我们设置的打印机名称后的端口发生了变化,比如由TSC TTP-342 Pro on Ne00:变成了TSC TTP-342 Pro on Ne06:,这个时候只需要手动将代码中的00更换为06程序即可正常运行。但这终究不是好的办法。
我们暂且不去讨论这个端口为什么会变化,我们来看使用获取注册表信息的方法来处理这个问题,这里我们编写一个自定义函数,通过获取注册表中给定打印机的端口信息,从而达到打印机名与打印机端口完全匹配,确保程序不会出错。代码如下:
以下代码在Win7 64位 Excel2013 32位和Win10 64位 Excel2016 64位中测试通过。
Function SetPrinter(Myprinte
r As String) As String
Dim Registry As Object, arr, x, xx As String, ne, pa As String, k As Integer
On Error Resume Next
Set Registry = GetObject('winmgmts:\\.\root\default:StdRegProv')
Registry.EnumValues &H80000001, 'Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts', arr
For Each x In arr
Registry.GetStringValue &H80000001, 'Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts\', x, xx
ne = Split(xx, ',')(1)
pa = x & ' on ' & ne
k = InStr(pa, ' on') - 1
If Left(pa, k) = Myprinter Then Exit For
Next
SetPrinter = pa
End Function
有了这个自定义函数后,我们即可在程序中代入这个函数来取得打印名称了。
Sub test()
Application.ActivePrinter = SetPrinter('\\mz\SZ FG-Warehouse Printer')
Sheet1.PrintOut
Application.ActivePrinter = SetPrinter('TSC TTP-342 Pro ')
Sheet2.PrintOut
End Sub
这里有两点需要注意:
1、 如果是中文版本,需要将上述代码中的“on“更换为”在“;
2、 SetPrinter的参数设置务必注意:
a) 如果打印机是装在本机的,可直接填写打印机名;
b) 如果打印机是网络打印机,不管是使用打印服务器还是通过网络共享的,都必须做一个简单的转换。
如电脑中显示的打印机名称为EPSON LQ-630K ESC/P2 on MSZPS,或者EPSON LQ-630K ESC/P2 on SZ01.sz.m.local,这两种是分别使用了打印服务器和网络共享的打印机。
那么SetPrinter的参数则必须写成”\\ MSZPS\ EPSON LQ-630K ESC/P2”和“\\ SZ01.sz.m.local\ EPSON LQ-630K ESC/P2”,即将on以后的部分和on前面的部分互换,然后添加''\\''。

我的更多文章

下载客户端阅读体验更佳

APP专享