运行大量VBA后打印预览问题

时间:2016-05-18 13:53:37

标签: excel excel-vba vba

我有一个Excel工作簿,几乎所有内容都是自动化的。它打开其他工作簿,从中复制数据,关闭它们,然后多次循环数据以生成我们打印和使用的报告。几乎每次运行所有VBA然后尝试打印之后,打印预览都会卡住,无论是找到打印机还是加载页面大小,如图所示。关闭Excel并重新打开文档可将打印预览恢复为正常功能。 VBA唯一与打印相关的是改变打印区域。对于运行VBA的任何其他文档,我没有遇到此问题。这只是一个错误或代码中的某些内容吗?

Issue

这是导致打印预览无法以某种方式加载的代码。如果我跳过这一部分然后按预期工作......我希望以某种方式使用此代码函数,因为它仍然需要。

    Set wb1 = Workbooks.Open(FileName)
    Set wb2 = ThisWorkbook

    For i = LBound(sArray) To UBound(sArray) 'Loops through array, copies available data from last report
        ShtName = sArray(i, 0)
        On Error Resume Next
            wb1.Sheets(ShtName).Activate
            If Err.Number = 0 Then
                wb1.Sheets(ShtName).Activate
                Columns("A:U").Copy
                wb2.Sheets(ShtName).Activate
                Columns("BE:BV").Select
                Selection.PasteSpecial xlPasteValues
                Application.CutCopyMode = False
                lastrow = Cells(Rows.Count, "BE").End(xlUp).Row
                Range("BA2:BC2").Select
                Selection.AutoFill Destination:=Range(Cells(2, "BA"), Cells(lastrow, "BC")), Type:=xlFillDefault
            End If
        On Error GoTo 0

        DoEvents

    Next i

    wb1.Close False

    Sheet2.Activate

我已尝试评论" On Error Resume Next"," On Error Goto 0"," If ...",&# 34;结束如果"和" DoEvents"。打印预览仍然无法删除,只是从上一页进行复制和粘贴。

4 个答案:

答案 0 :(得分:3)

似乎删除ionic start todo blank的所有实例已解决了问题...

打印预览正常工作,退出工作簿时Excel不会崩溃。

答案 1 :(得分:0)

我相信您正在寻找某种类型的刷新操作,可以将预览显示与工作表上的数据重新同步。你可能想在最后尝试这个:

ActiveSheet.EnableCalculation = False  
ActiveSheet.EnableCalculation = True

如果这不起作用,请参阅手动保存是否解决了问题。您可以尝试在最后调用Application.Save

答案 2 :(得分:0)

“当您选择文件 - >打印时,会自动进行打印预览。另一个选项是使用页面布局视图(状态栏右侧的图标)。要获得旧式打印预览,需要使用VBA。以下语句显示活动工作表的打印预览:ActiveSheet.PrintPreview

引自John Strongenbach的 Microsoft Excel 2013 Power Programming with VBA ,第956-957页。

话虽如此,我通过录制相对复杂的宏来创建新工作表,执行25个自动操作并显示打印预览,然后在MsgBox上单击“确定”时关闭打印预览,从而测试了上述问题。我重复了这个程序1000次。我从未遇到过PrintPreview的问题。

答案 3 :(得分:0)

它在黑暗中拍摄,但我尝试清理你的代码。看看是否有任何影响。

Sub Test()

Dim wb1 As Workbook, wb2 As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet
Dim isWS As Boolean

On Error GoTo sub_err

Set wb1 = Workbooks.Open(Filename)
Set wb2 = ThisWorkbook

For i = LBound(sArray) To UBound(sArray) 'Loops through array, copies available data from last report
    ShtName = sArray(i, 0)
    isWS = True
    Set ws1 = wb1.Sheets(ShtName)

    If isWS Then
        Set ws2 = wb2.Sheets(ShtName)

        ws1.Columns("A:U").Copy
        ws2.Columns("BE:BV").PasteSpecial xlPasteValues
        Application.CutCopyMode = False
        lastrow = ws2.Cells(ws2.Rows.Count, "BE").End(xlUp).Row
        ws2.Range("BA2:BC2").AutoFill Destination:=ws2.Range(ws2.Cells(2, "BA"), ws2.Cells(lastrow, "BC")), Type:=xlFillDefault
    End If
    DoEvents
Next i

wb1.Close False

ws2.Activate

sub_exit:
Exit Sub

sub_err:
If Err.Number = 9 Then
    isWS = False
    Resume Next
Else
    MsgBox "Error: " & Err.Number & vbNewLine & Err.Description
    Resume sub_exit
End If

End Sub

我做的最重要的事情就是分离你的错误处理,这样它只会在你没有找到wb1中的工作表时恢复,所有其他错误(无错误9错误)仍会显示你的错误信息。

我还确保你所有的Range(),Cells()和Columns()都引用了正确的工作表(只是因为excel变得困惑)我认为活动工作表是正确的工作表,但你可能想要在代码中验证这一点,以确保它在正确的表格中做正确的事情。

现在复制代码仅在isWS = true时运行,并且除非引发错误9代码,否则它将始终为true。我唯一不知道的是,如果wb2总是有一个等于ShtName的工作表名称,但我猜它会因为它在你的if err.number = 0

里面

我不确定这是否会改变你的任何内容,但我很想听听你的结果。