VBA批量打印宏问题:满足If-then条件后打印再终止循环
解决VBA批量打印宏最后一页未打印的问题
原宏的核心问题是打印操作与条件判断的顺序颠倒:先执行打印/预览,再调整打印区域或退出循环,导致满足终止条件时,调整后的打印区域未生效,或直接退出导致最后一页未打印。
修改后的代码
'Membuat shortcut sheet untuk lebih pendek 'Make shortcut Set po = Sheets("Print Out") Dim awal, Akhir As Integer Dim j As Long 'mencantumkan N6 & O6 menjadi value acuan 'Make N6 & O6 as main value print awal = po.Range("N6").Value Akhir = po.Range("O6").Value j = 0 'menjalankan menu pilih printer 'Show up print dialog and set "normal" print area (w/o) condition Application.ScreenUpdating = False Application.Dialogs(xlDialogPrinterSetup).Show po.PageSetup.PrintArea = "$B$1:$L$57" 'perintah utama 'Main command to apply auto mass print For i = awal To Akhir With po .Range("M1").Value = i + 0 + j .Range("M2").Value = i + 1 + j .Range("M3").Value = i + 2 + j .Range("M4").Value = i + 3 + j End With '初始化退出标记 Dim shouldExit As Boolean shouldExit = False '检测错误并设置退出标记 If IsError(po.Range("C4")) Then shouldExit = True End If If IsError(po.Range("C18")) Then po.PageSetup.PrintArea = "$B$1:$L$15" shouldExit = True End If '检测终止条件,调整打印区域并标记退出 If po.Range("M4") + 2 > po.Range("O6") Then po.PageSetup.PrintArea = "$B$1:$L$43" shouldExit = True ElseIf po.Range("M3") + 3 > po.Range("O6") Then po.PageSetup.PrintArea = "$B$1:$L$29" shouldExit = True ElseIf po.Range("M2") + 4 > po.Range("O6") Then po.PageSetup.PrintArea = "$B$1:$L$15" shouldExit = True End If '执行打印/预览(测试用PrintPreview,实际打印替换为PrintOut) po.PrintPreview '完成打印后再退出循环 If shouldExit Then Exit For End If j = j + 3 Next i '恢复界面更新 Application.ScreenUpdating = True
关键修改说明
- 调整执行顺序:先设置M列值,再判断条件、调整打印区域,最后执行打印,确保打印使用最新的区域设置。
- 统一退出逻辑:用
shouldExit变量标记所有终止条件,避免分散的Exit For导致逻辑混乱,保证完成打印后再退出。 - 优化条件判断:将嵌套If改为ElseIf,避免多个条件同时触发导致打印区域被重复修改。
- 恢复界面状态:添加
Application.ScreenUpdating = True,避免执行完宏后界面锁定。
内容的提问来源于stack exchange,提问作者just runemaster
相关产品推荐
相关产品推荐

