如何将活动打印机设置为 microsoft print to pdf 而无需“on XXXX:”

VKi*_*Kid 2 vba

我需要将打印机设置为“Microsoft Print to PDF”,但我如何知道它将位于哪个端口?在另一台机器上可能会有所不同。我需要它能够在不知道端口“on XXXX:”部分的情况下进行设置,如下所示:

Application.activeprinter = "Microsoft Print to PDF"
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。谢谢

?ActivePrinter 'show active printer "XXXXXX on XXXX:" 
Run Code Online (Sandbox Code Playgroud)

Fan*_*uru 5

  1. 最简单的方法:

尝试在上述打印机上从 Excel 手动打印(任何内容)。

然后使用下一个代码行:Debug.Print Application.ActivePrinter。它将返回Immediate Window打印机名称字符串(包括端口),以便在将其设置为“活动”时使用。

  1. 下一个代码返回打印机及其端口,并使用打印机名称作为参数进行调用:
Function FindPrinter(ByVal PrinterName As String) As String
  Dim arrH, Pr, Printers, Printer As String
  Dim RegObj As Object, RegValue As String
  Const HKEY_CURRENT_USER = &H80000001
       
    Set RegObj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    RegObj.Enumvalues HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Printers, arrH
    
      For Each Pr In Printers
        RegObj.getstringvalue HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Pr, RegValue
        Printer = Pr & " on " & Split(RegValue, ",")(1)
        If InStr(1, Printer, PrinterName, vbTextCompare) > 0 Then
           FindPrinter = Printer
           Exit Function
        End If
      Next
End Function
Run Code Online (Sandbox Code Playgroud)

可以通过以下方式调用它:

Sub testFindPrinter()
    Debug.Print Application.ActivePrinter
    Debug.Print FindPrinter("Microsoft Print to PDF")
End Sub
Run Code Online (Sandbox Code Playgroud)

或者,简单地通过以下方式设置活动打印机:

Application.ActivePrinter = FindPrinter("Microsoft Print to PDF")
Run Code Online (Sandbox Code Playgroud)

编辑

我不知道打印机端口之前的后缀应该/可以区域化。感谢@TM,我现在知道了。在这种情况下,可以使用后缀字符串提取的下一个方法来更新该函数:

   Dim suff As String, arrSuff
   arrSuff = Split(Application.ActivePrinter, " ")
   suff = arrSuff(UBound(arrSuff) - 1)
Run Code Online (Sandbox Code Playgroud)