ВБА за Екцел 2016 је брз, али није увек довољно брз. (Компјутерски програми никада нису довољно брзи.) Наставите да читате да бисте открили неке примере програмирања које можете користити да бисте убрзали своје макрое.
Искључивање ажурирања екрана
Када извршавате макро, можете се завалити и гледати све радње на екрану које се дешавају у макроу. Иако ово може бити поучно, након што наставите да макро ради како треба, често је досадно и може значајно успорити перформансе вашег макроа. На срећу, можете да онемогућите ажурирање екрана које се обично дешава када извршите макро. Да бисте искључили ажурирање екрана, користите следећу изјаву:
Апплицатион.СцреенУпдатинг = Фалсе
Ако желите да корисник види шта се дешава у било ком тренутку током макроа, користите следећу изјаву да поново укључите ажурирање екрана:
Апплицатион.СцреенУпдатинг = Тачно
Да бисте демонстрирали разлику у брзини, извршите овај једноставан макро, који попуњава опсег бројевима:
Суб ФиллРанге()
Дим р као дуго, ц као дуго
Дим Нумбер као дугачак
Број = 0
За р = 1 до 50
За ц = 1 до 50
Број = Број + 1
Ћелије (р, ц). Изаберите
Ћелије(р, ц).Вредност = Број
Следећи ц
Следеће р
Енд Суб
Видите да је свака ћелија изабрана и да се вредност унесе у ћелије. Сада убаците следећу наредбу на почетак процедуре и извршите је поново:
Апплицатион.СцреенУпдатинг = Фалсе
Опсег се попуњава много брже и не видите резултат док се макро не заврши и ажурирање екрана се (аутоматски) постави на Тачно.
Када отклањате грешке у коду, извршавање програма се понекад завршава негде на средини а да нисте поново укључили ажурирање екрана. Ово понекад доводи до тога да прозор апликације Екцел потпуно не реагује. Излаз из овог замрзнутог стања је једноставан: вратите се на ВБЕ и извршите следећу наредбу у прозору Иммедиате:
Апплицатион.СцреенУпдатинг = Тачно
Искључивање аутоматског израчунавања
Ако имате радни лист са много сложених формула, можда ћете открити да ствари можете знатно убрзати постављањем режима израчунавања на ручни док се ваш макро извршава. Када се макро заврши, вратите режим израчунавања на аутоматски.
Следећа изјава поставља режим израчунавања програма Екцел на ручни:
Апплицатион.Цалцулатион = клЦалцулатионМануал
Извршите следећу наредбу да подесите режим израчунавања на аутоматски:
Апплицатион.Цалцулатион = клЦалцулатионАутоматиц
Ако ваш код користи ћелије са резултатима формуле, искључивање израчунавања значи да ћелије неће бити поново израчунате осим ако експлицитно не кажете Екцел-у да то уради!
Уклањање тих досадних порука упозорења
Као што знате, макро може аутоматски извршити низ радњи. У многим случајевима можете покренути макро, а затим отићи у собу за одмор док Екцел ради своје. Међутим, неке Екцел операције приказују поруке које захтевају људски одговор. Ове врсте порука значе да не можете оставити Екцел без надзора док извршава ваш макро — осим ако не знате тајни трик.
Можете да наложите Екцел-у да не приказује ове врсте упозорења док покреће макро.
Тајни трик за избегавање ових порука упозорења је уметање следеће ВБА изјаве у ваш макро:
Апплицатион.ДисплаиАлертс = Фалсе
Екцел извршава подразумевану операцију за ове врсте порука. У случају брисања листа, подразумевана операција је Избриши. Ако нисте сигурни која је подразумевана операција, извршите тест да видите шта се дешава.
Када се процедура заврши, Екцел аутоматски ресетује својство ДисплаиАлертс на Труе. Ако морате поново да укључите упозорења пре него што се процедура заврши, користите ову изјаву:
Апплицатион.ДисплаиАлертс = Тачно
Поједностављивање референци на објекте
Као што вероватно већ знате, референце на објекте могу постати веома дугачке. На пример, потпуно квалификована референца на објекат Ранге може изгледати овако:
Воркбоокс(“МиБоок.клск”).Ворксхеетс(“Схеет1”) _
.Распон(„Каматна стопа“)
Ако ваш макро често користи овај опсег, можда ћете желети да креирате променљиву објекта помоћу команде Сет. На пример, следећа изјава додељује овај објекат Ранге променљивој објекта под називом Рате:
Подеси стопу = Радне свеске(“МиБоок.клск”) _
.Радни листови(“Схеет1”).Распон(“ИнтерестРате”)
Након дефинисања ове променљиве објекта, можете користити променљиву Рате уместо дугачке референце. На пример, можете променити вредност ћелије под називом ИнтерестРате:
Стопа.Вредност = .085
Ово је много лакше откуцати од следеће изјаве:
Радне свеске(“МиБоок.клск”).Радни листови(“Схеет1”). _
Опсег(“Каматна стопа”) = .085
Поред поједностављивања вашег кодирања, коришћење објектних променљивих значајно убрзава ваше макрое.
Декларисање типова променљивих
Обично не морате да бринете о врсти података које додељујете променљивој. Екцел обрађује све детаље за вас иза сцене. На пример, ако имате променљиву под називом МиВар, тој променљивој можете доделити број било ког типа. Можете чак и да му доделите текстуални низ касније у процедури.
Ако желите да се ваше процедуре извршавају што је брже могуће, реците Екцел-у који тип података ће бити додељен свакој од ваших променљивих. Ово је познато као декларисање типа променљиве.
Уопштено говорећи, требало би да користите тип података који захтева најмањи број бајтова, али и даље може да обрађује све податке који су му додељени. Када ВБА ради са подацима, брзина извршавања зависи од броја бајтова које ВБА има на располагању. Другим речима, што мање бајтова података користи, то ВБА може брже да приступи подацима и манипулише њима. Изузетак од овога је тип података Интегер. Ако је брзина критична, користите тип података Лонг.
Ако користите променљиву објекта, можете је декларисати као одређени тип објекта. Ево примера:
Дим Рате као опсег
Подеси стопу = Радне свеске(“МиБоок.клск”) _
.Радни листови(“Схеет1”).Распон(“ИнтерестРате”)
Коришћење структуре Витх-Енд Витх
Да ли треба да подесите одређени број својстава за објекат? Ваш код ради брже ако користите структуру Витх-Енд Витх. Додатна предност је што ће ваш код бити лакши за читање.
Следећи код не користи Витх-Енд Витх:
Селецтион.ХоризонталАлигнмент = клЦентер
Селецтион.ВертицалАлигнмент = клЦентер
Селецтион.ВрапТект = Тачно
Селецтион.Ориентатион = 0
Селецтион.СхринкТоФит = Фалсе
Селецтион.МергеЦеллс = Фалсе
Ево истог кода, преписаног да користи Витх-Енд Витх:
Са селекцијом
.ХоризонталАлигнмент = клЦентер
.ВертицалАлигнмент = клЦентер
.ВрапТект = Тачно
.Оријентација = 0
.СхринкТоФит = Нетачно
.МергеЦеллс = Нетачно
Завршити
Када користите Витх-Енд Витх, уверите се да свака изјава почиње тачком.