我需要将打印机设置为“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)
尝试在上述打印机上从 Excel 手动打印(任何内容)。
然后使用下一个代码行:Debug.Print Application.ActivePrinter
。它将返回Immediate Window
打印机名称字符串(包括端口),以便在将其设置为“活动”时使用。
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)