我有一个Excel工作簿,几乎所有内容都是自动化的。它打开其他工作簿,从中复制数据,关闭它们,然后多次循环数据以生成我们打印和使用的报告。几乎每次运行所有VBA然后尝试打印之后,打印预览都会卡住,无论是找到打印机还是加载页面大小,如图所示。关闭Excel并重新打开文档可将打印预览恢复为正常功能。 VBA唯一与打印相关的是改变打印区域。对于运行VBA的任何其他文档,我没有遇到此问题。这只是一个错误或代码中的某些内容吗?
这是导致打印预览无法以某种方式加载的代码。如果我跳过这一部分然后按预期工作......我希望以某种方式使用此代码函数,因为它仍然需要。
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"。打印预览仍然无法删除,只是从上一页进行复制和粘贴。
答案 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
我不确定这是否会改变你的任何内容,但我很想听听你的结果。