【发布时间】:2019-12-17 14:45:45
【问题描述】:
我昨天安装了 ZPL 打印机模拟器 Chrome 插件,我可以从记事本向它发送作业。下面的 VBA 代码似乎也在向仿真器发送数据,因为窗口底部会立即弹出一条消息,说明已收到数据。但是,从消息中可以清楚地看出端口号是动态的。第一次传递时,消息说“从客户端 127.0.0.1 端口 52616 收到 686 个字节”。其他运行将端口列为 52635、52649 等等(它们似乎确实在增加)。由于此模拟器正在侦听端口 9100,因此屏幕上没有打印任何作业……它是空白的。
如何修改以下代码为所有作业设置端口 9100?
Sub FourByTwo()
Dim MyPrinter, NumLabels As Integer
MyPrinter = "\\127.0.0.1\ZebraSim"
NumLabels = 1
Open MyPrinter For Output As #1
Print #1, "^PQ" & NumLabels
Print #1, "^LT0"
Print #1, "^MD3"
Print #1, "^POI"
Print #1, "^CI34^FO0,730^A0,20,18,E:ARIALNB.FNT^FH^FDSample 1^FS"
Print #1, "^CI34^FO0,670^A0,20,18,E:ARIALNB.FNT^FH^FDSample 2^FS"
Print #1, "^CI34^FO0,610^A0,20,18,E:ARIALNB.FNT^FH^FDSample 3^FS"
Print #1, "^CI34^FO0,550^A0,20,18,E:ARIALNB.FNT^FH^FDSample 4^FS"
Print #1, "^CI34^FO0,490^A0,20,18,E:ARIALNB.FNT^FH^FDSample 5^FS"
Print #1, "^CI34^FO0,430^A0,20,18,E:ARIALNB.FNT^FH^FDSample 6^FS"
Print #1, "^CI34^FO0,370^A0,20,18,E:ARIALNB.FNT^FH^FDSample 7^FS"
Print #1, "^CI34^FO0,310^A0,20,18,E:ARIALNB.FNT^FH^FDSample 8^FS"
Print #1, "^CI34^FO0,250^A0,20,18,E:ARIALNB.FNT^FH^FDSample 9^FS"
Print #1, "^CI34^FO0,190^A0,20,18,E:ARIALNB.FNT^FH^FDSample 10^FS"
Print #1, "^CI34^FO0,130^A0,20,18,E:ARIALNB.FNT^FH^FDSample 11^FS"
Print #1, "^CI34^FO0,70^A0,20,18,E:ARIALNB.FNT^FH^FDSample 12^FS"
Close #1
End Sub
请注意,当我尝试使用 GetPrinterPort2 函数确定端口时,该函数返回一个空字符串...
Public Function GetPrinterPort2(strPrinterName As String) As String
Dim objReg As Object, strRegVal As String, strValue As String
Const HKEY_CURRENT_USER = &H80000001
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
strRegVal = "Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts\"
objReg.GetStringValue HKEY_CURRENT_USER, strRegVal, strPrinterName, strValue
GetPrinterPort2 = Mid$(strValue, 10, 5)
End Function
Sub FourByTwo()
Dim MyPrinter As String, NumLabels As Integer, ZebraSimPort
MyPrinter = "\\127.0.0.1\ZebraSim"
ZebraSimPort = GetPrinterPort2(MyPrinter)
'...
End Sub
使用GetPrinterPort2函数将ActivePrinter设置为ZebraSim on 9100不会导致任何错误,但模拟器不显示“bytes received”消息,代码如下,提示未建立与打印机的连接:
Public Function GetPrinterPort2(strPrinterName As String) As String
Dim objReg As Object, strRegVal As String, strValue As String
Const HKEY_CURRENT_USER = &H80000001
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
strRegVal = "Software\Microsoft\Windows NT\CurrentVersion\PrinterPorts\"
objReg.GetStringValue HKEY_CURRENT_USER, strRegVal, strPrinterName, strValue
GetPrinterPort2 = Replace(Mid$(strValue, 10, 5), ",", "")
End Function
Sub FourByTwo()
Dim strPrinter As String, actPrinter As String, numLabels As Integer
numLabels = 1
With Application
actPrinter = .ActivePrinter
strPrinter = "ZebraSim"
.ActivePrinter = strPrinter & " on " & GetPrinterPort2(strPrinter)
Open .ActivePrinter For Output As #1
Print #1, "^PQ" & numLabels
Print #1, "^LT0"
Print #1, "^MD3"
Print #1, "^POI"
Print #1, "^CI34^FO0,730^A0,20,18,E:ARIALNB.FNT^FH^FDSample 1^FS"
Close #1
.ActivePrinter = actPrinter
End With
End Sub
请注意,由于我最终会回到使用真正的 Zebra 打印机进行打印,因此我不想修改 ZPLII 代码发送到打印机的方式只是为了让这个模拟器工作。换句话说,我想坚持使用 Open #1/Print #1/Close #1 技术向打印机发送命令。基本上,我只是希望能够在模拟器和真实打印机之间轻松切换。
使用MyPrinter = "\\127.0.0.1\ZebraSim:9100" 也会导致“接收到的字节数”消息,但同样没有打印出来。
Sub FourByTwo()
Dim MyPrinter As String, NumLabels As Integer
MyPrinter = "\\127.0.0.1\ZebraSim:9100"
NumLabels = 1
Open MyPrinter For Output As #1
Print #1, "^PQ" & NumLabels
Print #1, "^LT0"
Print #1, "^MD3"
Print #1, "^POI"
Print #1, "^FO100,100^A0,25,25^FDSample 1^FS"
Close #1
End Sub
我在测试时还发现,在 ZPL 打印机界面的“设置”对话框中选中 Save labels 复选框时,不会在目标文件夹中生成 PDF 文件。从记事本打印时,此功能运行良好(生成的文件包含正确生成的标签)。由于程序报告已收到字节,因此我预计目标文件夹中会出现一个空 PDF。
还请注意,我简化了打印“Sample 1”的那一行,认为字符映射和字体规范可能会影响事物。原始代码(带有字体规范)在记事本上运行良好,但我想我会继续排除它。
【问题讨论】:
-
试试
MyPrinter = "\\127.0.0.1\ZebraSim On 9100:"或MyPrinter = "\\127.0.0.1\ZebraSim On 9100" -
我尝试了所有这些,它们都导致 RTE 75 路径/文件访问错误。
-
ok 试试这个来自Here的
GetPrinterPort2函数看看你得到了什么端口? -
试试 myprinter="ZebraSim" 然后使用那个功能?
-
MyPrinter = "\\127.0.0.1\ZebraSim:9100"工作吗?
标签: excel vba zebra-printers zpl-ii