Оптимизация VBA
|
|
koralek | Дата: Пятница, 13.01.2012, 14:08 | Сообщение # 1 |
Подполковник
Группа: Администраторы
Сообщений: 147
Статус: Offline
| На этой странице перечислены некоторые советы и стратегии по оптимизации Visual Basic For Applications (VBA) кода. Есть несколько абсолютных правил для оптимизации VBA, вы увидите увеличение производительности за счет оптимизации базовой логики.
Доступ ячеек в диапазоне
Вам не нужно использовать. Клетки метод для доступа к определенным ячеек в диапазоне. Например, вы можете использовать
Range("MyRange")(1,2) а не Range("MyRange").Cells(1,2)
Смотрите Алан Beban в объяснение этого метода для более подробной информации. С этим связана ускоренный метод ссылкой на клетки. VBA позволит вам ссылаться на ячейки с [A1], а не Range ("A1"). В то время как [A1] синтаксис легче ввести, это медленнее, чем выполнить Range ("A1") синтаксис.
Расчет режима
Как правило, Excel пересчитает ячейки или диапазона ячеек при том, что ячейки или диапазона на прецеденты были изменены. Это может привести к книге пересчитать слишком часто, что приведет к замедлению работы. Вы можете предотвратить Excel от переоценки книгу с помощью заявлением:
Application.Calculation = xlCalculationManual В конце вашего кода, вы можете установить режим расчета обратно в автоматический с заявлением:
Application.Calculation = xlCalculationAutomatic Помните, однако, что при расчете режима xlCalculationManual, Excel не обновляются значения в ячейках. Если ваш макрос основывается на обновлении ячейки значение, вы должны заставить события Calculate, с. Рассчитайте метод, который может быть применен либо определенного диапазона (Range ("Мой_диапазон"). Вычислить) или всей книги (Вычислить) .
Коллекция индексы
Отдельного элемента из коллекции объект может быть доступна либо его имя или его индекс в коллекции. Например, если у вас есть три листа ("Лист1", "Лист2" и "Sheet3") в книге ("MyWorkbook»), вы можете ссылаться на "Лист2" или с
Worksheets("Sheet2") or Worksheets(2)
В общем, метод индексов (Worksheets(2)) значительно быстрее, чем метод имя индекса (Worksheets ("Лист2")). Тем не менее, количество и порядок элементов в коллекции может меняться, поэтому, как правило, безопаснее и проще ссылаться на элементы в коллекции по имени, а не их порядковый номер.[b]
|
|
| |
koralek | Дата: Пятница, 13.01.2012, 14:08 | Сообщение # 2 |
Подполковник
Группа: Администраторы
Сообщений: 147
Статус: Offline
| Константы
Всякий раз, когда вы можете заявить, значения констант, а не переменные. Так как их значения не меняются, они вычисляются только один раз, когда ваш код компилируется, а не каждый раз, когда они используются во время выполнения.
Раннее связывание
Это тесно связано с конкретными декларации Тип объекта. Если вы собираетесь работать с другими приложениями, такими как Word, объявить OLE объект непосредственно, а не как переменную типа Object. Поступая таким образом, много накладных расходов производится во время компиляции ("Раннее связывание"), а не во время выполнения ("позднее связывание"). Например, можно использовать Dim WordObj As Word.Application а не Dim WordObj As Object
ДЛЯ КАЖДОГО Цикла
Когда цикл по коллекции, как правило, быстрее, чем Для каждого утверждения, а не использовать индекс. Например, первый цикл код быстрее, чем второй: Dim WS as Worksheet For Each WS In Worksheets MsgBox WS.Name Next WS
Dim i as Integer For i = 1 To Worksheets.Count MsgBox Worksheets(i).Name Next i
Диапазон объектов Не Выбор объекта
Как правило, это не является необходимым, чтобы выбрать диапазон до работы с ним. Например, это более эффективно использовать
Range("A1").Font.Bold = True
А не
Range("A1").Select Selection.Font.Bold = True
|
|
| |
koralek | Дата: Пятница, 13.01.2012, 14:09 | Сообщение # 3 |
Подполковник
Группа: Администраторы
Сообщений: 147
Статус: Offline
| Обновление экрана
Вы можете отключить обновление экрана так, чтобы Excel не выполняет обновление изображения на экране, как ваш код выполняется. Это может значительно ускорить ваш код.
В начале: Application.ScreenUpdating=false
в конце Application.ScreenUpdating=true
Будьте уверены, чтобы восстановить настройки для Правда в конце макроса. Старая версия Excel будет автоматически восстанавливать настройки; Excel97 нет.
Простые объекты, а не составные объекты
Если у вас есть, чтобы сделать неоднократные ссылки на объект, например диапазон, объявить объект этого типа, установите его на целевой объект, а затем использовать ваш объект для обозначения цели. Например,
Dim MyCell As Range Set MyCell = Workbooks("Book2").Worksheets("Sheet3").Range("C3") '.... MyCell.Value = 123
По прямой ссылки на MyCell, VBA может получить доступ к объекту напрямую, а не решения полный путь к объекту каждый раз. Этот метод полезен только тогда, когда вы обращаетесь к объекту несколько раз в течение выполнения кода.
Конкретные декларации Тип объекта
По возможности избегайте использования объекта или вариант типов данных. Эти типы данных требуют значительных накладных расходов для определения их типов. Вместо этого, используйте явные типы данных, такие как
Dim MySheet As Worksheet rather than Dim MySheet As Object Or Dim NumRows As Long rather than Dim NumRows As Variant
Это особенно верно с индексом переменных For Next петли, так как вариант типа должна быть пересмотрена каждой итерации цикла.
С заявлениями
Если вы используете несколько заявлением, в строку, которая распространяется на тот же объект, используйте с заявлением, а не полностью определенного объекта каждый раз. Например,
With Worksheets("Sheet1").Range("A1") .Font.Bold = True .Value = 123 End With
Функции рабочего листа
Вы можете использовать в Excel стандартные функции листа в код VBA, а не писать функции в VBA. Так как они полностью исполняемые инструкции в машинный код, а не интерпретировать VBA код, они работают намного быстрее. Например, можно использовать
MySum = Application.WorksheetFunction.Sum(Range("A1:A100"))
а не
For Each C In Range("A1:A100") MySum = MySum + C.Value Next C
|
|
| |
msexcel | Дата: Пятница, 09.01.2015, 14:08 | Сообщение # 4 |
Рядовой
Группа: Пользователи
Сообщений: 1
Статус: Offline
| Вы уверены, что хорошо знаете эксель? Пройдите курс MS Excel Профессионал от специалистов ведущей международной консалтинговой компании. Вы научитесь работать в экселе в 2 раза быстрее и будете уверены, что решаете каждую задачу наиболее эффективным способом. Внимание! Осталось 3 места, до пятницы скидка 20%. Оставьте заявку по ссылке: http://msexcel.pro?ch=frm
|
|
| |
Natali_ASD | Дата: Пятница, 09.01.2015, 15:55 | Сообщение # 5 |
Рядовой
Группа: Пользователи
Сообщений: 1
Статус: Offline
| Вы уверены, что хорошознаете эксель? Пройдите курс MS Excel Профессионал от специалистов ведущей международной консалтинговой компании. Вы научитесь работать в экселе в 2 раза быстрее и будете уверены, что решаете каждую задачу наиболее эффективным способом. Внимание! Осталось 3 места, до пятницы скидка 20%. Оставьте заявку по ссылке: http://msexcel.pro?ch=frm
|
|
| |