请求协助将现有VBA打印代码与单作业打印代码合并
合并打印任务解决网络打印机错误问题
我有一个工作簿,每次循环会插入不同数据并打印单个工作表。但受总部网络打印机队列驱动限制,再加上网络连接缓慢,打印时频繁出现错误。我找到一段能把多个单页打印任务合并成一个多页打印任务的VBA代码,应该能解决这个问题,但不知道怎么和自己的现有代码合并,也不确定是否有效。
我的现有代码:
Sub PrintFormsNBC() Dim StartRow As Integer Dim EndRow As Integer Dim msg As String Dim i As Integer StartRow = Range("NBC!StartRow") EndRow = Range("NBC!EndRow") If StartRow > EndRow Then msg = "ERROR" & vbCrLf & "The starting row must be less than the ending row!" MsgBox msg, vbCritical, APPNAME End If For i = StartRow To EndRow Range("NBC!RowIndex") = i If Range("NBC!Preview") Then ActiveSheet.PrintPreview Else ActiveSheet.PrintOut End If Next i Worksheets("NBC").Activate End Sub
整合方案及修改后代码
核心思路是利用Application.PrintCommunication暂停打印通信,将所有打印请求缓存后一次性发送,从而合并成单个打印任务。修改后的代码如下:
Sub PrintFormsNBC() Dim StartRow As Integer Dim EndRow As Integer Dim msg As String Dim i As Integer StartRow = Range("NBC!StartRow") EndRow = Range("NBC!EndRow") ' 校验行号逻辑,添加退出避免后续错误执行 If StartRow > EndRow Then msg = "ERROR" & vbCrLf & "起始行必须小于结束行!" MsgBox msg, vbCritical, APPNAME Exit Sub End If ' 关闭打印通信,临时缓存打印请求 Application.PrintCommunication = False ' 循环更新数据并添加到打印队列 For i = StartRow To EndRow Range("NBC!RowIndex") = i ActiveSheet.PrintOut Copies:=1, Preview:=False, ActivePrinter:=ActivePrinter Next i ' 恢复打印通信,一次性发送所有缓存的打印任务 Application.PrintCommunication = True ' 预览功能无法合并,需单独循环处理 If Range("NBC!Preview") Then For i = StartRow To EndRow Range("NBC!RowIndex") = i ActiveSheet.PrintPreview Next i End If Worksheets("NBC").Activate End Sub
关键说明
- 合并打印的核心是
Application.PrintCommunication = False:这会阻止Excel每次循环都向打印机发送单独任务,而是将所有打印请求暂存,直到开启通信后一次性发送,最终生成一个包含所有页面的打印任务。 - 预览功能无法合并:因为预览是实时渲染单个页面,所以如果勾选了预览选项,仍需逐个循环预览;只有实际打印时才会合并任务。
- 测试建议:先选择少量行测试,确认打印机队列中仅生成单个打印任务后,再进行批量打印。
内容的提问来源于stack exchange,提问作者Skeeter56
相关产品推荐
相关产品推荐

