как ускорить макросы VBA - PullRequest
       20

как ускорить макросы VBA

1 голос
/ 17 августа 2010

Я генерирую новые листы, используя макросы.Для создания нового листа данные извлекаются из более чем 4 БД MS Access.Каждая БД имела минимум 200 полей.Мой код макроса включает

  1. Cell locking
  2. Alignment and formatting
  3. One third of the cells in the sheet had a formulas
  4. Cell reference with other Workbooks

Моя проблема заключается в том, что для каждого поколения листов требуется минимум один час, чтобы завершить процесс сверления.Но мне кажется, что это занимает слишком много времени.

Я уже добавил Application.ScreenUpdating = True, чтобы ускорить код, но все же это занимает то же время.Как это сделать, чтобы ускорить код, если у вас есть идеи, пожалуйста, направьте меня.

     `For Ip = 5 To  150
     resp = Range("B" & Ip).Value
     With ActiveSheet.QueryTables.Add(Connection:= _
    "ODBC;DSN=henkel2;DBQ=C:\Hl-RF\RSF-Temp.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;" _
    , Destination:=Range("IV4"))
    .CommandText = "select Vles from " & Shtname & " where cint(PrductID)='" & resp & "' and cint(DepotID) = '" & cnt1 & "' and Mnth = '" & mnths & "' and Type='" & typs & "'"
    .Name = "tab product"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .PreserveColumnInfo = True
    .SourceConnectionFile = _
    "C:\Hl-RF\tabct.odc"
    .Refresh BackgroundQuery:=False
    End With`


    Is There Is any way to Reduce the loop iteration time

Заранее спасибо

Ответы [ 7 ]

3 голосов
/ 17 августа 2010

Конечно, вы имеете в виду

Application.ScreenUpdating = False

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

2 голосов
/ 17 августа 2010

Вы можете попробовать обычные методы оптимизации VBA, установив расчет вручную и отключив ScreenUpdating.

Dim calc As XlCalculation
calc = Application.Calculation
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Application.ScreenUpdating = True
Application.Calculation = calc

Поместите код или вызов функции между Application.Calculation = xlCalculationManual и Application.ScreenUpdating = True.

Это из моего предыдущего сообщения

Примечание: Я не могу найти информацию о погоде или вы не запускаете код из Access или Excel,Если вы создаете книгу Excel из Access, у вас, вероятно, будет такой код:

Dim xlApp As Excel.Application
Set xlApp = new Excel.Application

В этом случае вам придется изменить Application в приведенном выше коде на xlApp.Например:

xlApp.Calculation = xlCalculationManual
2 голосов
/ 17 августа 2010

Получите копию Professional Excel Development , которая включает в себя отличную утилиту для профилирования под названием PerfMon. Это позволит вам увидеть, какие части отчета занимают все время, чтобы вы могли проанализировать и переписать

1 голос
/ 01 марта 2011

Я бы попытался сделать БОЛЬШЕ работы на стороне базы данных.Создайте нужные отчеты на стороне базы данных, а затем экспортируйте результаты в Excel.

Доступ к автоматизации отчетов НАМНОГО лучше, чем в Excel.

0 голосов
/ 26 августа 2012

Да, создайте таблицу в Access для хранения идентификаторов ваших клиентов. Затем создайте запрос и подключитесь к нему с помощью внешнего коннектора данных. После этого обновите его вручную или используйте VBA для обновления соединения, когда вы будете готовы.

0 голосов
/ 28 февраля 2011

Посмотрите на комментарии Криса. Мы считаем, что ваше узкое место в производительности, скорее всего, связано с тем, как вы запрашиваете базу данных, а не с кодом VBA, который применяет данные в листе.

Простые вопросы о производительности Access: - У ваших таблиц есть индексы? - Используете ли вы какие-либо таблицы соединения? - Доступны ли базы данных Access на вашем компьютере или удаленный доступ?

Опять же, я только подкрепляю то, что Крис уже прокомментировал.

0 голосов
/ 17 августа 2010

Существует некоторая дискуссия по этой теме здесь .

Редактировать: Хорошо, тогда следующий шаг - определить, какие части вашего кода занимают больше всего времени.,Самый простой способ сделать это - сделать копию вашего кода и просто начать измерять различные части, как это:

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
Private mlngStrt As Long
Private mlngEnd As Long

Private Const u As Long = 10000000

Public Sub Example()
    Dim i As Long

    mlngStrt = GetTickCount
    For i = 0 To u
    Next
    mlngEnd = GetTickCount
    Debug.Print "Section1", mlngEnd - mlngStrt

    mlngStrt = GetTickCount
    ExampleSubCall
    mlngEnd = GetTickCount
    Debug.Print "ExampleSubCall", mlngEnd - mlngStrt

    mlngStrt = GetTickCount
    For i = 0 To (u * 1.5)
    Next
    mlngEnd = GetTickCount
    Debug.Print "Section2", mlngEnd - mlngStrt
    Debug.Print "Example Complete"
End Sub

Private Sub ExampleSubCall()
    Dim i As Long
    For i = 0 To (u * 0.75)
    Next
End Sub

Этот подход довольно прост.Недостаток здесь в том, что вам нужно вставить все операторы синхронизации, а затем развернуться и удалить их.Вот почему я работаю над копией.

Как только вы знаете, какие части занимают больше всего времени, вы знаете, на что нужно обратить внимание и на что обратиться за помощью.

...