如何用VBA将Excel打印机恢复为系统默认打印机?
解决Excel VBA打印PDF后恢复默认打印机的问题
核心思路
在切换到Microsoft PDF打印机之前,先保存用户当前使用的打印机(或系统默认打印机),完成PDF打印后再将打印机设置回原值,避免影响后续的实体打印操作。
方案1:保存并恢复Excel当前活动打印机(简单直接)
这种方案适合大多数场景,因为用户在执行PDF打印前,Excel的活动打印机通常就是他们日常使用的实体打印机。
Sub PrintToPDF_WithRestore() ' 保存当前活动打印机 Dim originalPrinter As String originalPrinter = Application.ActivePrinter ' 确保即使出错也能恢复打印机 On Error GoTo RestorePrinter ' 切换到Microsoft PDF打印机 Application.ActivePrinter = FindPrinter("Microsoft Print to PDF") ' 执行PDF打印逻辑(根据需求修改,示例为打印当前工作表) ActiveSheet.PrintOut ' 若需打印整个工作簿,替换为:ThisWorkbook.PrintOut RestorePrinter: ' 恢复原打印机设置 Application.ActivePrinter = originalPrinter ' 若之前有错误,重新抛出以便排查 If Err.Number <> 0 Then Err.Raise Err.Number End Sub
方案2:获取并恢复系统默认打印机(更严谨)
如果需要确保恢复的是系统级别的默认打印机(而非Excel当前活动的打印机),可以通过Windows API实现:
首先在VBA模块的顶部添加API声明(兼容32位和64位Office):
#If VBA7 Then Declare PtrSafe Function GetDefaultPrinter Lib "winspool.drv" Alias "GetDefaultPrinterA" (ByVal pszBuffer As String, ByRef pcchBuffer As Long) As Long #Else Declare Function GetDefaultPrinter Lib "winspool.drv" Alias "GetDefaultPrinterA" (ByVal pszBuffer As String, ByRef pcchBuffer As Long) As Long #End If
然后添加获取系统默认打印机的函数:
Function GetSystemDefaultPrinter() As String Dim buffer As String Dim bufferSize As Long Dim result As Long ' 先获取存储打印机名称所需的缓冲区大小 result = GetDefaultPrinter(vbNullString, bufferSize) If result = 0 Then buffer = String(bufferSize, vbNullChar) result = GetDefaultPrinter(buffer, bufferSize) If result <> 0 Then ' 去除字符串末尾的空字符 GetSystemDefaultPrinter = Left(buffer, bufferSize - 1) End If End If End Function
最后在打印过程中使用:
Sub PrintToPDF_RestoreSystemDefault() ' 获取系统默认打印机 Dim systemDefaultPrinter As String systemDefaultPrinter = GetSystemDefaultPrinter() If systemDefaultPrinter = "" Then MsgBox "无法获取系统默认打印机", vbExclamation Exit Sub End If On Error GoTo RestorePrinter ' 切换到PDF打印机并执行打印 Application.ActivePrinter = FindPrinter("Microsoft Print to PDF") ActiveSheet.PrintOut ' 替换为你的打印逻辑 RestorePrinter: ' 恢复系统默认打印机 If systemDefaultPrinter <> "" Then Application.ActivePrinter = systemDefaultPrinter End If If Err.Number <> 0 Then Err.Raise Err.Number End Sub
注意事项
- 确保你的
FindPrinter函数能正确返回打印机的完整名称(例如Microsoft Print to PDF on Ne02:),不同系统的打印机端口后缀可能不同 - 必须使用
On Error GoTo分支,避免打印过程中出错导致打印机设置无法恢复,影响后续操作
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

