从 Excel VBA 打印到 "ZPL Printer" Zebra 标签打印机 Chrome 插件模拟器时,如何将端口永久设置为 9100
How do I permanently set the port to 9100 when printing from Excel VBA to the "ZPL Printer" Zebra label printer Chrome plug-in emulator
我昨天安装了 ZPL 打印机模拟器 Chrome 插件,我可以从记事本向它发送作业。下面的 VBA 代码似乎也在向模拟器发送数据,同时 window 底部会弹出一条消息,表示已收到数据。但是,从消息中可以清楚地看出端口号是动态的。第一次通过时,消息显示“从客户端 127.0.0.1 端口 52616 接收到 686 个字节”。其他运行将端口列为 52635、52649 等等(它们确实在增加)。由于此模拟器正在侦听端口 9100,none 的作业正在屏幕上打印...它是空白的。
如何修改下面的代码来为所有作业设置端口 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 函数确定端口时,函数 returns 一个空字符串...
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"
也会产生 "bytes received" 消息,但同样不会打印任何内容。
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 文件。从 NotePad 打印时,此功能运行良好(制作的文件包含正确生成的标签)。由于程序报告已收到字节,我本以为目标文件夹中会出现一个空的 PDF。
另请注意,我简化了打印 "Sample 1" 的行,认为字符映射和字体规范可能会影响某些事情。原始代码(带有字体规范)在记事本上运行良好,但我想我会继续排除它。
我将 ZPLII 代码移回记事本以验证我是否仍然可以从该应用程序打印...我做不到。这是因为一直缺少 XA 和 XZ 命令。在这个过程中的某个时候,我被整个端口问题分散了注意力,忘记了在代码中包含这些关键行。
所以现在下面的代码打印到下一个可用端口,这并不是我真正想要做的(我想强制它每次都打印到 9100),但它可以满足我的需要.
此外,如果我注意到 MyPrinter = "\127.0.0.1\ZebraSim:9100"
行中不存在“:9100”,则不会生成 PDF 文件。我仍然在 ZPL 打印机 window 中得到模拟打印输出,但没有生成文件。感谢 Delphi Coder 的建议,如果我需要的话,手头有这些 PDF 是件好事。
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, "^XA"
Print #1, "^PQ" & NumLabels
Print #1, "^LT0"
Print #1, "^MD3"
Print #1, "^POI"
Print #1, "^FO100,100^A0,25,25^FDSample 1^FS"
Print #1, "^XZ"
Close #1
End Sub
我昨天安装了 ZPL 打印机模拟器 Chrome 插件,我可以从记事本向它发送作业。下面的 VBA 代码似乎也在向模拟器发送数据,同时 window 底部会弹出一条消息,表示已收到数据。但是,从消息中可以清楚地看出端口号是动态的。第一次通过时,消息显示“从客户端 127.0.0.1 端口 52616 接收到 686 个字节”。其他运行将端口列为 52635、52649 等等(它们确实在增加)。由于此模拟器正在侦听端口 9100,none 的作业正在屏幕上打印...它是空白的。
如何修改下面的代码来为所有作业设置端口 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 函数确定端口时,函数 returns 一个空字符串...
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"
也会产生 "bytes received" 消息,但同样不会打印任何内容。
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 文件。从 NotePad 打印时,此功能运行良好(制作的文件包含正确生成的标签)。由于程序报告已收到字节,我本以为目标文件夹中会出现一个空的 PDF。
另请注意,我简化了打印 "Sample 1" 的行,认为字符映射和字体规范可能会影响某些事情。原始代码(带有字体规范)在记事本上运行良好,但我想我会继续排除它。
我将 ZPLII 代码移回记事本以验证我是否仍然可以从该应用程序打印...我做不到。这是因为一直缺少 XA 和 XZ 命令。在这个过程中的某个时候,我被整个端口问题分散了注意力,忘记了在代码中包含这些关键行。
所以现在下面的代码打印到下一个可用端口,这并不是我真正想要做的(我想强制它每次都打印到 9100),但它可以满足我的需要.
此外,如果我注意到 MyPrinter = "\127.0.0.1\ZebraSim:9100"
行中不存在“:9100”,则不会生成 PDF 文件。我仍然在 ZPL 打印机 window 中得到模拟打印输出,但没有生成文件。感谢 Delphi Coder 的建议,如果我需要的话,手头有这些 PDF 是件好事。
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, "^XA"
Print #1, "^PQ" & NumLabels
Print #1, "^LT0"
Print #1, "^MD3"
Print #1, "^POI"
Print #1, "^FO100,100^A0,25,25^FDSample 1^FS"
Print #1, "^XZ"
Close #1
End Sub