Before Print与After Print事件失效:Sheet2打印需清空有色单元格
解决Workbook_BeforePrint/AfterPrint事件失效及单元格颜色恢复问题
原代码存在的问题
- 语法错误:
AfterPrint过程中用双引号"No colour"作为注释,VBA注释必须使用单引号',会直接导致编译失败 - 硬编码颜色恢复:直接指定固定RGB值,无法还原单元格原有的个性化颜色(比如单元格原本颜色不统一的场景)
- 未处理打印取消场景:即使用户取消打印,
Application.OnTime仍会触发颜色恢复逻辑,导致颜色错误变更 - 过程作用域问题:若
AfterPrint放在ThisWorkbook模块中,Application.OnTime可能无法正确调用该过程
修正后的完整实现
1. 标准模块中定义公共变量(如Module1)
用于临时存储单元格原有颜色,避免事件结束后数据丢失:
' 存储需要恢复的单元格区域原有颜色 Public rngOriginalColors As Variant
2. 修改ThisWorkbook中的BeforePrint事件
Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim ws As Worksheet Dim targetRanges As Variant Dim i As Integer Set ws = ThisWorkbook.Sheets(2) ' 定义需要处理的所有单元格区域,可按需新增 targetRanges = Array(ws.Range("B4:H17"), ws.Range("B23:H25")) ' 保存原有颜色并设置打印用白色背景 ReDim rngOriginalColors(UBound(targetRanges)) For i = LBound(targetRanges) To UBound(targetRanges) rngOriginalColors(i) = targetRanges(i).Interior.Color targetRanges(i).Interior.Color = RGB(255, 255, 255) Next i ' 仅当打印未被取消时,安排执行颜色恢复 If Not Cancel Then ' 延迟1秒确保打印任务完成,可根据实际打印速度调整 Application.OnTime Now + TimeValue("00:00:01"), "RestoreCellColors" End If End Sub
3. 标准模块中添加颜色恢复过程
Sub RestoreCellColors() Dim ws As Worksheet Dim targetRanges As Variant Dim i As Integer Set ws = ThisWorkbook.Sheets(2) targetRanges = Array(ws.Range("B4:H17"), ws.Range("B23:H25")) ' 恢复每个区域的原有颜色 For i = LBound(targetRanges) To UBound(targetRanges) targetRanges(i).Interior.Color = rngOriginalColors(i) Next i ' 清空变量释放内存 Erase rngOriginalColors End Sub
关键注意事项
- 颜色恢复过程
RestoreCellColors必须放在标准模块中,不能放在ThisWorkbook或工作表模块内,否则Application.OnTime无法找到该过程 - 延迟执行时间可根据实际打印速度调整,确保打印完成后再恢复颜色
- 若需新增处理区域,只需在
targetRanges数组中添加对应的Range对象即可
内容的提问来源于stack exchange,提问作者Hyun Jeong Lee
相关产品推荐
相关产品推荐

