Проблемы с предварительным просмотром печати после запуска большого количества VBA
У меня есть книга Excel, в котором практически все автоматизировано. Он открывает другие книги, копирует из них данные, закрывает их, а затем несколько раз просматривает данные для создания отчетов, которые мы печатаем и используем. Почти каждый раз после запуска всех VBA, а затем пытается распечатать, Print preview застревает либо найти принтер, либо загрузить размеры страниц, как показано на рисунке. Закрытие 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
Я пробовал комментируя "на возобновление ошибки рядом", "об ошибках Гото 0", "Если...", "End If" и "DoEvents". Предварительный просмотр печати по-прежнему не удается с удаленными и просто делает копию и вставку с предыдущего листа.
4 ответов
Кажется, что удаление всех экземпляров DoEvents
Исправлена ошибка...
предварительный просмотр печати работает правильно, и Excel больше не аварийно завершает работу при выходе из книги.
Я считаю, что вы ищете какой-то тип действия обновления, который может повторно синхронизировать предварительный просмотр с данными на листе. Возможно, вы захотите попробовать это в конце:
ActiveSheet.EnableCalculation = False
ActiveSheet.EnableCalculation = True
Если это не работает, посмотрите, устраняет ли проблему ручное сохранение. Вы можете попробовать позвонить Application.Save
в конце.
" предварительный просмотр печати происходит автоматически при выборе File --> Print. Другой вариант - использовать вид макета страницы (значок в правой части строки состояния). Чтобы получить предварительный просмотр в старом стиле, вам нужно использовать VBA. Следующая инструкция отображает предварительный просмотр печати активного листа:ActiveSheet.PrintPreview
"
цитата из Microsoft Excel 2013 Программирование питания с VBA Джон Walkenbach, страниц 956-957.
Это, как говорится, я проверял ваша проблема выше, записав относительно сложный макрос, который создает новый лист, выполняет 25 автоматических действий и показывает предварительный просмотр печати, а затем закрывает предварительный просмотр печати, когда я нажимаю OK на MsgBox. Я повторил программу, чтобы сделать это 1000 раз. У меня никогда не было проблем с PrintPreview.
это своего рода выстрел в темноте, но я попытался немного очистить ваш код. Посмотрим, повлияет ли это вообще.
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 () ссылаются на правильный лист (просто incase excel получает я предположил, что активный лист был правильным листом, но вы можете проверить это в коде, чтобы убедиться, что он делает правильную вещь на правильном листе.
теперь код копирования выполняется только если isWS = true
, и это всегда будет верно, если не будет выдан код ошибки 9. Единственное, что я не знал, было ли wb2 всегда будет иметь имя листа, равное ShtName
но я предполагаю, что это будет, так как это внутри вашего if err.number = 0
Я не уверен, что это что-то изменит для вас, но мне было бы любопытно услышать ваши результаты по-другому.