ВБА: Побољшајте брзину и друге најбоље праксе

Овај водич ће расправљати о томе како убрзати ВБА макрое и друге ВБА најбоље праксе.

Подешавања за убрзање ВБА кода

Испод ћете пронаћи неколико савета за убрзање вашег ВБА кода. Савети су слабо организовани по важности.

Најједноставнији начин да побољшате брзину свог ВБА кода је онемогућавање ажурирања екрана и онемогућавање аутоматских прорачуна. Ове поставке би требало онемогућити у свим великим процедурама.

Онемогућите ажурирање екрана

Подразумевано, Екцел ће приказивати промене у радним свескама у реалном времену док се извршава ВБА код. Ово узрокује велико успоравање брзине обраде јер Екцел већина тумачи и приказује промене за сваки ред кода.

Да бисте искључили ажурирање екрана:

1 Апплицатион.СцреенУпдатинг = Нетачно

На крају макроа, требало би да поново укључите ажурирање екрана:

1 Апплицатион.СцреенУпдатинг = Тачно

Док је код покренут, можда ћете морати да „освежите“ екран. Нема команде „освежи“. Уместо тога, мораћете да поново укључите ажурирање екрана и поново га онемогућите.

Поставите прорачуне на Ручно

Кад год се промени вредност ћелије, Екцел мора следити „стабло израчунавања“ да би поново израчунао све зависне ћелије. Осим тога, кад год се промени формула, Екцел ће морати да ажурира „стабло израчунавања“ поред поновног израчунавања свих зависних ћелија. У зависности од величине ваше радне свеске, ова поновна израчунавања могу узроковати да се ваши макрони раде неразумно споро.

Да бисте прорачуне поставили на Ручно:

1 Апплицатион.Цалцулатион = клМануал

Да бисте ручно поново израчунали целу радну свеску:

1 Израчунај

Имајте на уму да можете израчунати и само лист, распон или појединачну ћелију, ако је потребно за побољшану брзину.

Да бисте вратили аутоматско израчунавање (на крају поступка):

1 Апплицатион.Цалцулатион = клАутоматиц

Важно! Ово је подешавање програма Екцел. Ако прорачуне не поставите поново на аутоматско, радна свеска се неће поново израчунати све док јој то не кажете.

Видећете највећа побољшања из горњих подешавања, али постоји неколико других подешавања која могу да промене:

Онемогући догађаје

Догађаји су „окидачи“ који изазивају посебне процедуре догађаја трчати. Примери укључују: када се промени било која ћелија на радном листу, када се радни лист активира, када се радна свеска отвори, пре него што се сачува радна свеска итд.

Онемогућавање догађаја може изазвати мања побољшања брзине када се покрену било који макрои, али побољшање брзине може бити много веће ако ваша радна свеска користи догађаје. У неким случајевима онемогућавање догађаја је неопходно како би се избегло стварање бесконачних петљи.

Да бисте онемогућили догађаје:

1 Апплицатион.ЕнаблеЕвентс = Нетачно

Да бисте поново укључили догађаје:

1 Апплицатион.ЕнаблеЕвентс = Тачно

Онемогућите преломе страница

Онемогућавање прелома страница може помоћи у одређеним ситуацијама:

  • Претходно сте подесили својство ПагеСетуп за одговарајући радни лист и ваша ВБА процедура мења својства многих редова или колона
  • ИЛИ Ваша ВБА процедура приморава Екцел да израчуна преломе страница (приказивање прегледа штампе или мењање било којих својстава ПагеСетуп -а).

Да бисте онемогућили преломе страница:

1 АцтивеСхеет.ДисплаиПагеБреакс = Нетачно

Да бисте поново омогућили преломе страница:

1 АцтивеСхеет.ДисплаиПагеБреакс = Тачно

Најбоље праксе за побољшање ВБА брзине

Избегавајте активирање и одабир

Када снимите макро, видећете многе методе активирања и одабира:

12345678 Под Слов_Екампле ()Табеле („Лист 2“). ИзаберитеРаспон ("Д9"). ИзаберитеАцтивеЦелл.ФормулаР1Ц1 = "пример"Распон ("Д12"). ИзаберитеАцтивеЦелл.ФормулаР1Ц1 = "демо"Распон ("Д13"). ИзаберитеЕнд Суб

Активирање и одабир објеката обично није потребно, додају неред вашем коду и одузимају много времена. Треба избегавати ове методе кад год је то могуће.

Побољшани пример:

1234 Суб Фаст_Екампле ()Табеле ("Лист2"). Опсег ("Д9"). ФормулаР1Ц1 = "пример"Табеле ("Лист2"). Опсег ("Д12"). ФормулаР1Ц1 = "демо"Енд Суб

Избегавајте копирање и лепљење

Копирање захтева значајну меморију. Нажалост, не можете рећи ВБА да очисти унутрашњу меморију. Уместо тога, Екцел ће очистити своју интерну меморију у (наизглед) одређеним интервалима. Дакле, ако изводите много операција копирања и лепљења, ризикујете да задржите превише меморије, што може драстично успорити ваш код или чак срушити Екцел.

Уместо копирања и лепљења, размислите о постављању својстава вредности ћелија.

123456789 Суб ЦопиПасте ()'СпоријиОпсег ("а1: а1000"). Копирај опсег ("б1: б1000")'БржеОпсег ("б1: б1000"). Вредност = Опсег ("а1: а1000"). ВредностЕнд Суб

Користите петље за сваки уместо за петље

Приликом проласка кроз објекте, петља Фор Евери је бржа од Фор Лооп -а. Пример:

Ово за петљу:

123456 Под петља1 ()дим и као РангеЗа и = 1 до 100Ћелије (и, 1). Вредност = 1Затим самЕнд Суб
За сваку петљу је спорији од овог:
123456 Суб Лооп2 ()Дим целл Ас РангеЗа сваку ћелију у домету ("а1: а100")ћелија.Вредност = 1Следећа ћелијаЕнд Суб

Декларишите променљиве / Користите опцију експлицитно

ВБА не захтева да декларишете своје променљиве, осим ако не додате Оптион Екплицит на врх вашег модула:
1 Опција Експлицитно
Додавање опције Екплицит је најбоља пракса кодирања јер смањује вероватноћу грешака. Такође вас приморава да декларишете своје променљиве, што мало повећава брзину вашег кода (предности су уочљивије што се више варијабла користи).Како опција Екплицит спречава грешке?Највећа предност Опције Екплицит је што ће вам помоћи да ухватите правописне грешке у називу променљивих. На пример, у следећем примеру смо поставили променљиву под називом „вар1“, али смо касније референцирали променљиву под називом „варл“. Променљива „варл“ није дефинисана, па је празна, што изазива неочекиване резултате.
1234 Под ОптионЕкплицит ()вар1 = 10МсгБок варлЕнд Суб

Користи са - заврши са изјавама

Ако се више пута позивате на исте објекте (нпр. Распони, Радни листови, Радне свеске), размислите о употреби Изјаве Витх. Брже се обрађује, може олакшати читање кода и поједностављује га.Са примером изјаве:
12345678 Подбржи_пример ()Са табелама („Лист 2“).Ранге ("Д9"). ФормулаР1Ц1 = "пример".Ранге ("Д12"). ФормулаР1Ц1 = "демо".Ранге ("Д9"). Фонт.Болд = Тачно.Ранге ("Д12"). Фонт.Болд = ТачноЗавршитиЕнд Суб
Брже је од:
123456 Под Слов_Екампле ()Табеле ("Лист2"). Опсег ("Д9"). ФормулаР1Ц1 = "пример"Табеле ("Лист2"). Опсег ("Д12"). ФормулаР1Ц1 = "демо"Табеле ("Лист2"). Распон ("Д9"). Фонт.Болд = ТачноТабеле ("Лист2"). Распон ("Д12"). Фонт.Болд = ТачноЕнд Суб

Напредни савети за најбољу праксу

Заштитите само кориснички интерфејс

Добра је пракса да заштитите своје радне листове од уређивања незаштићених ћелија како бисте спречили крајњег корисника (или вас!) Од случајног оштећења радне свеске. Међутим, ово ће такође заштитити радне листове од дозвољавања ВБА да врши промене. Дакле, морате уклонити заштиту и поново заштитити радне листове, што је веома дуготрајно када се ради на многим листовима.

12345 Суб УнПротецтСхеет ()Табеле („лист 1“). Уклони заштиту „лозинка“'Уредите лист1Табеле („лист1“). Заштитите „лозинку“Енд Суб

Уместо тога, можете заштитити листове постављањем УсерИнтерфацеОнли: = Труе. Ово омогућава ВБА да врши измене на листовима, док их и даље штити од корисника.

1 Табеле („лист1“). Заштитите лозинку: = "лозинка", УсерИнтерФацеОнли: = Тачно

Важно! УсерИнтерФацеОнли се ресетује на Фалсе сваки пут када се радна свеска отвори. Дакле, да бисте користили ову сјајну функцију, мораћете да користите догађаје Воркбоок_Опен или Ауто_Опен да поставите подешавање сваки пут када се радна свеска отвори.

Овај код поставите у модул ове радне свеске:

123456 Привате Суб Воркбоок_Опен ()Дим вс Ас ВорксхеетЗа сваки вс у радним листовимавс.Протецт Пассворд: = "лозинка", УсерИнтерФацеОнли: = ТачноНект всЕнд Суб

или овај код у било ком редовном модулу:

123456 Привате Суб Ауто_Опен ()Дим вс Ас ВорксхеетЗа сваки вс у радним листовимавс.Протецт Пассворд: = "лозинка", УсерИнтерФацеОнли: = ТачноНект всЕнд Суб

Користите низове за уређивање великих распона

Манипулација великим опсегом ћелија може потрајати много времена (нпр. 100.000+). Уместо да пролазите кроз опсеге ћелија, манипулишући сваком ћелијом, можете учитати ћелије у низ, обрадити сваку ставку у низу, а затим низ послати назад у њихове оригиналне ћелије. Учитавање ћелија у низове за манипулацију може бити много брже.

1234567891011121314151617181920212223242526272829303132 Суб ЛоопРанге ()Дим целл Ас РангеДим тСтарт Ас ДоублетСтарт = ТајмерЗа сваку ћелију у опсегу ("А1: А100000")ћелија.Вредност = ћелија.Вредност * 100Следећа ћелијаДебуг.Принт (Тајмер - тСтарт) & "секунде"Енд СубСуб ЛоопАрраи ()Дим арр Ас ВариантПригуши ставку као варијантуДим тСтарт Ас ДоублетСтарт = Тајмерарр = Опсег ("А1: А100000"). ВредностЗа сваку ставку У долитем = итем * 100Следећа ставкаОпсег ("А1: А100000"). Вредност = аррДебуг.Принт (Тајмер - тСтарт) & "секунде"Енд Суб

Ви ће помоћи развој сајта, дељење страницу са пријатељима

wave wave wave wave wave