You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 15:23:14