【问题标题】: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从 Excel VBA 打印到“ZPL 打印机”斑马标签打印机 Chrome 插件模拟器时如何将端口永久设置为 9100
【发布时间】: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 试试这个来自HereGetPrinterPort2函数看看你得到了什么端口?
  • 试试 myprinter="ZebraSim" 然后使用那个功能?
  • MyPrinter = "\\127.0.0.1\ZebraSim:9100" 工作吗?

标签: excel vba zebra-printers zpl-ii


【解决方案1】:

我将 ZPLII 代码移回记事本,以验证我仍然可以从该应用程序打印...我不能。这是因为 XA 和 XZ 命令一直丢失。在此过程中的某个地方,我被整个端口问题分心,忘记在代码中包含这些关键行。

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

另外,如果我注意到如果 MyPrinter = "\\127.0.0.1\ZebraSim:9100" 行中不存在“:9100”,则不会生成 PDF 文件。我仍然在 ZPL 打印机窗口中获得模拟打印输出,但没有生成文件。感谢 Delphi Coder 的建议,因为如果我需要这些 PDF,手头有这些 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2016-01-09
    • 2017-02-03
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多