Excel VBA打印出现卡顿

4

我尝试了很多解决方案,并在网络上浏览了几个小时。也许你们中的某个人可以帮忙。

我有一个宏,它选择所有名称中包含特定字符串的工作表,然后打印它们。如果工作表太多,它会冻结,你将无法中断宏以进行调试,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
目前,我相信我正在遇到32位应用程序的2GB内存限制。如果有足够多的页面,打印预览实际上可能会冻结它,但是对于较小的作业,整个宏运行得很好。由于这是我不是管理员的网络工作计算机,我将不得不处理2GB限制。我想知道如果我在每5页放置一个10秒的等待,是否会起作用... - dboatman_z
谢谢您的评论。然而,我有宏来将单个工作表打印为PDF,但当有多达30个工作表时,这远非理想。至于手动计算,如果我理解正确,那只涉及工作表内的计算。我的工作表几乎没有计算...所以这不会真正减少太多负担。[续...] - dboatman_z
@dboatman_z 我刚遇到了同样的问题,虽然我没有要打印的很多工作表。如果我删除CustomUI - xml文件,它会从Excel功能区中移除所有菜单,这个问题就解决了。 - Siyon DP
@TSion.D.P 这是一个相当老的帖子了。我最终发现问题与工作表上有很多按钮有关,每次都会被复制。我最终改用模态用户窗体,在每次切换工作表时调用它,并在未处于活动状态时取消加载。这使整个工作簿更快(特别是打开工作簿),并解决了许多问题。 - dboatman_z
显示剩余3条评论
1个回答

1

确保屏幕更新开启。 VBA 代码是: Application.ScreenUpdating = True

如果卡住了,可以这样做。调整打印预览窗口大小(抓住角落或边缘,然后将其缩小再放大)。这似乎会导致 Excel 进入 ScreenUpdating 并使您重新获得控制。以防万一,始终可以在打印预览之前自动调整 Excel 的大小,以便始终可以访问窗口的边缘:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接