2008-10-23 3 views
3

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

Application.ScreenUpdating = False 

With ActiveSheet.PageSetup 

    -various setup statements which I've already minimized- 

End With 
ActiveSheet.PrintOut 

Application.ScreenUpdating = True 

ответ

8

Да, свойства 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 

Edit: Пару обновлений:

  1. Для Excel 2010 и выше вы можете использовать свойство Application.PrintCommunication, в то время как для Excel 2007 и ниже вы можете использовать «ExecuteExcel4Macro». Для получения дополнительной информации см. Migrating Excel 4 Macros to VBA.

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

Надеется, что это помогает ...

+0

Я проверю это и дам вам знать, как это сработало для меня. –

+0

Мне удалось получить значительное увеличение, большинство моих наборов были небулевыми значениями, знаете ли вы, что Print Setup - по листу или книге? –

+0

Эй, Лэнс, да, вы можете получить очень большое улучшение, следуя этому подходу - я рад, что это сработало для вас. :-) Настройка страницы предназначена для каждого листа отдельно, а не для книги в целом.(Класс Worksheeet имеет свойство PageSetup, но класс рабочей книги этого не делает.) –

0

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

2

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

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, этот код не предлагает самого чистого решения. Однако он выполняет свою работу. :)