Excel VBA打印冻结

时间:2015-01-22 20:34:21

标签: excel vba printing crash freeze

我已经尝试了大量的解决方案,现在浏览网页数小时。也许你们中的一个可以提供帮助。

我有一个宏,用于选择名称中包含特定字符串的所有工作表,然后打印它们。如果工作表太多,它会冻结,并且您无法将宏分解为调试,而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以允许系统时间处理
  • 添加"等待"计时器让它有时间处理
  • 首先循环并设置pagesetup属性,然后打印(完成循环以设置页面设​​置正常,但在打印循环中冻结,如"正常"
  • 移动到将所有工作表添加到数组中,然后将它们作为单个打印作业发送(它在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

知道为什么会这样,以及我没有尝试过的可能的解决方案吗?

1 个答案:

答案 0 :(得分:1)

确保已启用ScreenUpdating。 VBA代码是: Application.ScreenUpdating = True

如果它挂起,这是有效的。调整打印预览窗口的大小(抓住角落或边缘,然后再缩小,然后重新调整大小)。这似乎导致Excel进入ScreenUpdating并让你控制回来。以防万一,因此您始终可以访问窗口的边缘来执行此操作,您可以在printpreview之前自动调整Excel的大小:

Sub WindowState_850x1400()
  With Application
    .WindowState = xlNormal
    .Top = 1
    .Left = 1
    .Height = 850
    .Width = 1400
  End With
End Sub