从Excel VBA打印到” ZPL打印机” 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插件,并且可以从NotePad向它发送作业。鉴于下面的VBA代码似乎正在向模拟器发送数据,并给出了在窗口底部短暂弹出的消息,提示已接收到数据。但是,从消息中可以清楚地看到端口号是动态的。第一次通过时,消息显示为"从客户端127.0.0.1端口52616接收到686字节"。其他运行将端口列出为52635、52649,以此类推(它们的确在增加)。由于此仿真器正在侦听端口9100,因此没有任何作业在屏幕上打印...空白。

如何修改以下代码为所有作业设置端口9100?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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函数确定端口时,该函数返回空字符串...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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}!\\\\.\
oot\\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不会引起任何错误,但是模拟器不会显示带有以下代码的"收到字节"消息,表明未建立与打印机的连接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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}!\\\\.\
oot\\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代码发送到打印机的方式,只是为了使此模拟器正常工作。换句话说,我想坚持使用"打开#1 /打印#1 /关闭#1"技术将命令发送到打印机。基本上,我只希望能够轻松地在模拟器和真实打印机之间切换。

使用MyPrinter ="\\\\127.0.0.1\\ZebraSim:9100"还会导致显示"收到字节数"消息,但同样不会打印出任何内容。

1
2
3
4
5
6
7
8
9
10
11
12
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。

还要注意,我简化了打印"示例1"的行,认为字符映射和字体规范可能会影响事物。原始代码(带有字体规范)在NotePad上运行良好,但我认为我应该将其排除在外。


我将ZPLII代码移回了记事本中,以验证我仍然可以从该应用程序中进行打印...我无法。这是因为XA和XZ命令始终缺失。在此过程中的某个地方,我对整个端口问题感到分心,却忘记在代码中包含这些关键行。

因此现在下面的代码将打印到下一个可用端口,这并不是我真正想做的(我想每次强制将其打印到9100),但是它可以满足我的需要。<铅>

此外,如果我发现如果MyPrinter ="\\\\127.0.0.1\\ZebraSim:9100"行中不存在":9100",则不会生成PDF文件。我仍然可以在" ZPL打印机"窗口中获得模拟的打印输出,但是没有生成文件。感谢Delphi Coder的建议,如果我需要这些PDF,那将是一件好事。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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