Проблемы с предварительным просмотром печати после запуска большого количества VBA

У меня есть книга Excel, в котором практически все автоматизировано. Он открывает другие книги, копирует из них данные, закрывает их, а затем несколько раз просматривает данные для создания отчетов, которые мы печатаем и используем. Почти каждый раз после запуска всех VBA, а затем пытается распечатать, Print preview застревает либо найти принтер, либо загрузить размеры страниц, как показано на рисунке. Закрытие 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

Я пробовал комментируя "на возобновление ошибки рядом", "об ошибках Гото 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

Я не уверен, что это что-то изменит для вас, но мне было бы любопытно услышать ваши результаты по-другому.