我尝试了很多解决方案,并在网络上浏览了几个小时。也许你们中的某个人可以帮忙。
我有一个宏,它选择所有名称中包含特定字符串的工作表,然后打印它们。如果工作表太多,它会冻结,你将无法中断宏以进行调试,Ctrl+Alt+Del是唯一的退出方式。每次它都会在不同的位置冻结...
我的原始代码:
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim x As Integer
For x = 1 To Worksheets.count
If VBA.InStr(Worksheets(x).Name, "Lateral Assessment") > 0 Then
With Worksheets(x).PageSetup
.Orientation = xlPortrait
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
Worksheets(x).PrintOut
End If
Next x
Application.ScreenUpdating = True
Application.EnableEvents = True
根据其他论坛帖子的建议,我已经尝试了以下方法:
- 在循环中添加 DoEvents 以允许系统有时间处理
- 添加“等待”定时器以给予处理时间
- 首先循环设置页面属性,然后打印(它可以完成循环以正确设置页面设置,但在打印循环中像“正常”一样冻结)
- 将所有工作表添加到数组中,然后作为单个打印作业发送它们(在14-16页后仍会冻结)
我曾经在一个较大的过程中添加了一个进度条,您可以看到它在计数时进行了进展,然后在不一致的工作表编号上冻结。另外,请注意,即使我从 VBA 代码窗口逐个运行它,问题也会发生,因此,似乎与处理时间无关(虽然不能确定)。
我的当前代码:
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim x As Long, iTotal As Long, sSheets() As String
iTotal = -1
For x = 1 To Worksheets.count
If VBA.InStr(Worksheets(x).Name, "Lateral Assessment") > 0 Then
With Worksheets(x).PageSetup
.Orientation = xlPortrait
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
iTotal = iTotal + 1
ReDim Preserve sSheets(iTotal)
sSheets(iTotal) = Worksheets(x).Name
End If
Next x
If iTotal <> -1 Then
Sheets(sSheets).PrintOut Copies:=1, Collate:=True
End If
Application.ScreenUpdating = True
Application.EnableEvents = True
有什么想法是为什么会发生这种情况,有没有可能的解决方案我还没有尝试过?
Worksheets(x).PrintOut
命令会导致打印预览冻结,那么这可能是打印机/驱动程序的问题。 - PatricK