Печать быстрее в Excel - PullRequest
       13

Печать быстрее в Excel

3 голосов
/ 23 октября 2008

Функциональность печати в Excel (с использованием VBA) чрезвычайно медленная. Я надеюсь, что у кого-то есть способ ускорить печать (без использования трюка с макросом Excel 4). Вот как я это делаю сейчас:

Application.ScreenUpdating = False

With ActiveSheet.PageSetup

  -various setup statements which I've already minimized-

End With   
ActiveSheet.PrintOut

Application.ScreenUpdating = True

Ответы [ 3 ]

8 голосов
/ 23 октября 2008

Да, свойства PageSetup очень медленные, когда вы их устанавливаете.

Вы уже установили Application.ScreenUpdating = False, что хорошо, но не менее (или более) важным шагом в этом случае является установка Application.Calculation = xlCalculationManual. (Лучше всего, если вы сохраните эти настройки, а затем в конце восстановите их до исходного.)

Кроме того, свойство get для каждого свойства PageSetup очень быстрое, в то время как только набор свойств является настолько медленным. Поэтому вам следует протестировать новый параметр свойства, чтобы убедиться, что он уже не совпадает с существующим значением свойства, чтобы предотвратить ненужный (и дорогой) вызов.

Имея все это в виду, вы сможете использовать код, который выглядит примерно так:

Dim origScreenUpdating As Boolean
origScreenUpdating = Application.ScreenUpdating
Application.ScreenUpdating = False

Dim origCalcMode As xlCalculation
origCalcMode =  Application.Calculation
Application.Calculation = xlCalculationManual

With ActiveSheet.PageSetup
    If .PrintHeadings <> False Then .PrintHeadings = False
    If .PrintGridlines <> False Then .PrintGridlines = False
    If .PrintComments <> xlPrintNoComments Then .PrintComments = xlPrintNoComments
    ' Etc...
End With

Application.ScreenUpdating = origScreenUpdating
Application.Calculation = origCalcMode

Редактировать: Пара обновлений:

  1. Для Excel 2010 и выше вы можете использовать свойство «Application.PrintCommunication», а для Excel 2007 и ниже вы можете использовать «ExecuteExcel4Macro». Подробнее см. Перенос макросов Excel 4 в VBA .

  2. Для Excel 2007 и ниже другой интересный трюк - временно назначить драйвер принтера «Microsoft XPS Document Writer» и затем установить его обратно. Скорость печати может увеличиться в 3 раза. См .: Методы медленной установки страницы Excel .

Надеюсь, это поможет ...

2 голосов
/ 15 мая 2009

В дальнейшем сообщении Майкла и ответе на вопрос @ rhc, следующий код также может помочь вам, если вам нужно скопировать настройки Page Setup из одного листа в несколько листов в книге:

Public Sub CopyPageSetupToAll(ByRef SourceSheet As Worksheet)
    ' Raise error if invalid source sheet is passed to procedure
    '
    If (SourceSheet Is Nothing) Then
        Err.Raise _
            Number:=vbErrorObjectVariableNotSet, _
            Source:="CopyPageSetupToAll", _
            Description:="Unable to copy Page Setup settings: " _
                 & "invalid reference to source sheet."
        Exit Sub
    End If

    SourceSheet.Activate

    With SourceSheet.PageSetup
        ' ...
        ' place PageSetup customizations here
        ' ...
    End With

    SourceSheet.Parent.Worksheets.Select
    Application.SendKeys "{ENTER}", True
    Application.Dialogs(xlDialogPageSetup).Show
End Sub

В качестве альтернативы, вы также можете изменить процедуру, чтобы создать временный рабочий лист для размещения изменений в настройках страницы, а затем распространить эти изменения на другие рабочие листы вашей рабочей книги:

Public Sub CopyPageSetupToAll(ByRef SourceBook As Workbook)
    Dim tempSheet As Worksheet

    ' Raise error if invalid workbook is passed to procedure
    '
    If (SourceBook Is Nothing) Then
        Err.Raise _
            Number:=vbErrorObjectVariableNotSet, _
            Source:="CopyPageSetupToAll", _
            Description:="Unable to copy Page Setup settings: " _
                 & "invalid reference to source workbook."
        Exit Sub
    End If

    Set tempSheet = SourceBook.Worksheets.Add

    tempSheet.Activate

    With tempSheet.PageSetup
        ' ...
        ' place PageSetup customizations here
        ' ...
    End With

    SourceBook.Worksheets.Select
    Application.SendKeys "{ENTER}", True
    Application.Dialogs(xlDialogPageSetup).Show
    tempSheet.Delete

    Set tempSheet = Nothing
End Sub

Из-за использования функции SendKeys() и Application.Dialogs этот код не предлагает самое чистое возможное решение. Тем не менее, он выполняет свою работу. :)

0 голосов
/ 12 ноября 2008

Если вы хотите иметь одинаковые настройки страницы для каждой вкладки в рабочей книге, можете ли вы ускорить процесс, настроив один рабочий лист, а затем каким-то образом скопировав параметры этого рабочего листа в другие листы? Возможно ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...