Работа с макроси на Excel VBA
Макросите в Excel се съхраняват като VBA код и понякога ще искате да редактирате този код директно. Този урок ще обхване как да преглеждате и редактирате макроси, описва някои техники за отстраняване на грешки в макроси и ще дава някои общи примери за редактиране.
Преглед на макроси
Списък с макроси може да бъде показан в диалоговия прозорец Макроси. За да видите този диалогов прозорец, изберете раздела Developer на лентата и щракнете върху бутона Macros.
Ако са отворени няколко работни книги, макросите от всички работни книги ще бъдат показани в списъка. Макросите в активната работна книга ще се показват само по име, докато макросите в други работни книги ще бъдат представени от името на работната книга и удивителен знак (т.е. „Book2! OtherMacro“).
Отворете макрос за редактиране
Можете да използвате диалоговия прозорец Макрос, за да отворите кода за макрос, като изберете името на макроса и щракнете върху бутона Редактиране. Това ще отвори макроса във VB Editor.
Друга възможност е да отворите VB Editor директно, като щракнете върху бутона Visual Basic в раздела Developer или като натиснете клавишната комбинация ALT+F11.
Използвайки този метод, ще трябва да преминете към желания от вас макрос (наричан още „процедура“). Ще преминем през оформлението на VBA Editor:
Преглед на VB Editor
VB Editor има няколко прозореца; в този урок ще разгледаме прозореца Project, прозореца Properties и прозореца Code.
Прозорец на проекта
Прозорецът на проекта показва всеки Excel файл като свой собствен проект, като всички обекти в този проект са категоризирани по тип. Записаните макроси ще се появят в категорията „Модули“, обикновено в обекта „Модул1“. (Ако вашият проект има няколко модула и не сте сигурни къде се съхранява вашият макрос, просто го отворете от гореспоменатия диалог за макроси.)
Прозорец за свойства
Прозорецът със свойства показва свойствата и свързаните стойности на обект - например щракването върху обект от работен лист в прозореца на проекта ще покаже списък със свойства за работния лист. Имената на свойствата са вляво, а стойностите на имотите са вдясно.
Избирането на модул в прозореца на проекта ще покаже, че той има само едно свойство, „(Име)“. Можете да промените името на модул, като щракнете двукратно върху стойността на имота, въведете ново име и натиснете Enter. Промяната на името на модула ще го преименува в прозореца на проекта, което е полезно, ако имате много модули.
Кодови прозорци
Кодовите прозорци са специални текстови редактори, в които можете да редактирате VBA кода на вашия макрос. Ако искате да видите кода за макрос, разположен в Module1, щракнете двукратно върху „Module1“ в прозореца на проекта.
Стартиране на макроси в редактора на VB
Макросите могат да се изпълняват директно от VB Editor, което е полезно за тестване и отстраняване на грешки.
Изпълнение на макрос
- В прозореца на проекта щракнете двукратно върху модула, съдържащ макроса, който искате да тествате (за да отворите прозореца му с код)
- В прозореца Code поставете курсора навсякъде в кода на макроса между „Sub“ и „End Sub“
- Щракнете върху Бягай бутон в лентата с инструменти или натиснете клавишната комбинация F5
„Поетапно“ макрос
Вместо да стартирате макроса наведнъж, можете да стартирате макроса по един ред, като използвате клавишна комбинация, за да „преминете“ кода. Макросът ще спре на всеки ред, което ви позволява да гарантирате, че всеки ред код прави това, което очаквате в Excel. Можете също така да спрете макроса да продължи по всяко време, като използвате този метод.
За да „преминете през“ макрос:
- В прозореца на проекта щракнете двукратно върху модула, съдържащ макроса, който искате да тествате (за да отворите прозореца му с код)
- В прозореца Code поставете курсора навсякъде в кода на макроса
- Натиснете клавишната комбинация F8, за да започнете процеса „стъпка-през“
- Натиснете неколкократно F8, за да ускорите изпълнението на кода, обозначено с жълтото открояване в прозореца Code
- За да спрете продължаването на макроса, натиснете Нулиране бутон
Защо да редактирате VBA макроси?
Макрорекордерът - макар и ефективен - също е много ограничен. В някои случаи той произвежда бавни макроси, записва действия, които не сте възнамерявали да повтаряте, или записва неща, които не сте мислили, че правите. Научаването да редактирате вашите макроси ще им помогне да работят по -бързо, по -ефективно и по -предвидимо.
Освен че решавате тези проблеми, ще спечелите и значително увеличение на производителността, когато използвате пълната мощ на макросите. Макросите не трябва само да бъдат записи на задачи - макросите могат да включват логика, така че те изпълняват задачи само при определени условия. Само за няколко минути можете да кодирате цикли, които повтарят задача стотици или хиляди пъти наведнъж!
По -долу ще намерите някои полезни съвети, които ще ви помогнат да оптимизирате вашия макро код, както и инструменти, които да накарат макросите ви да работят по -усилено и по -умно.
Общи примери за редактиране на макроси
Ускорете макросите
Ако имате макрос, който се изпълнява дълго време, може да има няколко причини, поради които той работи бавно.
От една страна: когато макросът се изпълнява, Excel ще покаже всичко както се случва в реално време - докато може виж бързо за вас, всъщностпоказващи произведението е значителен хит за изпълнение. Един от начините да накарате Excel да работи значително по -бързо е като го кажете на спрете актуализирането на екрана:
'Disable Screen Updating Application.ScreenUpdating = False' Активиране на приложението за актуализиране на екрана.ScreenUpdating = True
Редът „Application.ScreenUpdating = False“ означава, че няма да видите макроса да работи, но ще работи много по -бързо. Имайте предвид, че винаги трябва да зададете ScreenUpddating на True в края на вашия макрос, в противен случай Excel може да не действа по начина, по който очаквате по -късно!
Друг начин за ускоряване на макросите:изключете автоматичното изчисление в макроса. Ако сте работили със сложни електронни таблици, ще знаете, че малките промени могат да предизвикат хиляди изчисления, които отнемат време за завършване, поради което много хора изключват автоматичното изчисление в опциите на Excel. Можете също да превключите това с VBA код, така че вашият макрос все още ще работи бързо на други компютри. Това помага в случаите, когато копирате и поставяте много клетки с формули или причинявате много изчисления да се задействат, докато поставяте данни в диапазон:
"Деактивиране на приложението за автоматично изчисляване. Изчисление = xlCalculationManual" Активиране на приложението за автоматично изчисляване. Изчисление = xl Изчисление Автоматично
Добавяне на цикли и логика (ако изявления)
Макрорекордерът записва всички ваши действия като код на език, наречен VBA. VBA е нещо повече от начин за записване на действия в Excel - това е език за програмиране, което означава, че може да съдържа код за вземане на решения за това какви действия да се извършват, или повтаряне на действия, докато не бъде изпълнено условие.
Циклично
Кажете, че искате да направите макрос, който да подготви доклад, и като част от този макрос трябваше да добавите деветнадесет листа към работната книга, общо двадесет. Можете да се запишете, като натискате бутона (+) отново и отново, или можете да напишете цикъл, който повтаря действието вместо вас, като този:
Sub ReportPrep () Dim i As Long For i = 1 до 19 листа. Добавете Next i End Sub
В този пример използваме a За цикъл, което е вид цикъл, който повтаря през набор от елементи. Тук нашият диапазон е числата от 1 до 19, използвайки променлива с име „i“, така че цикълът да може да следи. Вътре в нашия цикъл се повтаря само едно действие между за иследващия редове (добавянето на листа), но можете да добавите толкова код вътре в цикъла, колкото искате да правите неща като форматиране на листа или копиране и поставяне на данни във всеки лист - каквото искате да повторите.
Ако изявления
Ан Ако изявление се използва, за да се реши дали даден код работи или не, като се използва логически тест за вземане на решение. Ето един прост пример:
Sub ClearIfSmall () If Selection.Value <100 Тогава Selection.Clear End If End Sub
Този прост пример показва как работи операторът If - тествате някакво условие, което е True или False (стойността на избраната клетка е по -малка от 100?) и ако тестът връща True, кодът вътре се изпълнява.
Недостатък на този код е, че той тества само една клетка наведнъж (и би се провалил, ако сте избрали няколко клетки). Това би било по -полезно, ако можете … да преминете през всяка избрана клетка и да тествате всяка …
Sub ClearIfSmall () Dim c As Range for each c In Selection. Клетки If c.Value <100 Тогава c.Clear End If Next c End Sub
В този пример има малко по -различен цикъл For - този не преминава през диапазон от числа, а вместо това преминава през всички клетки в селекцията, като използва променлива с име „c“ за проследяване. Вътре в цикъла стойността на ‘c’ се използва, за да се определи дали клетката трябва да бъде изчистена или не.
Цикли и оператори If могат да бъдат комбинирани по какъвто ви е удобен начин - можете да поставите цикли вътре в цикли, или един If вътре в друг, или да използвате If, за да решите дали цикълът трябва да работи изобщо.
<<>>
Премахнете ефектите на превъртане
Честа причина да редактирате макрокода е да премахнете превъртането на екрана. Когато записвате макрос, може да се наложи да достигнете до други области на работния лист чрез превъртане, но макросите не трябва да се превъртат за достъп до данни.
Превъртането може да затрупа кода ви със стотици или дори хиляди редове ненужен код. Ето пример за кода, който се записва, когато щракнете и плъзнете върху лентата за превъртане:
Този вид код е напълно ненужен и може да бъде изтрит, без да се засяга друга функционалност. Дори и да искате да запазите превъртането, този код все още може да бъде кондензиран в цикъл.
Премахнете излишния код
Записаните макроси са склонни да добавят много излишен код, който не отразява непременно това, което искате да прави макросът. Вземете например следния записан код, който записва промяна на името на шрифта в клетка:
Въпреки че само името на шрифта е променено, единадесет (11) промени в шрифта са записани като размера на шрифта, текстовите ефекти и т.н. записаният макрос няма да работи!
Възможно е да промените този макрос, така че да променя само името на шрифта:
Този макрос не само ще работи по предназначение сега, но и е много по -лесен за четене.
Премахнете движенията на курсора
Друго нещо, което се записва в макроси, са избор на работен лист и клетки. Това е проблем, тъй като потребителят лесно може да загуби представа за това, върху което току -що е работил, ако курсорът се премести на друга позиция след стартиране на макрос.
Както при превъртането, Вие може да се наложи да преместите курсора и да изберете различни клетки за изпълнение на задача, но макросите не трябва да използват курсора за достъп до данни. Помислете за следния код, който копира диапазон и след това го поставя в три други листа:
Има няколко проблема с този код:
- Потребителят ще загуби предишното си място в работната книга
- Макросът не посочва кой лист копирамеот - това може да е проблем, ако макросът е изпълнен на грешен лист
Освен това кодът е труден за четене и е разточителен. Тези проблеми могат да бъдат разрешени достатъчно лесно:
В този код е ясно да виждаме, че копираме от Sheet1 и нито активният работен лист, нито избраният диапазон трябва да се променят, за да поставите данните. (Една съществена промяна е използването на „PasteSpecial“ вместо „Paste“ - обектите на Range, като „Range („ C4 ″) “) имат достъп само до командата PasteSpecial.)
Всеки път, когато кодът е пълен с препратки към „.Select“ и „Selection“, това е улика, че има място да се оптимизира този код и да се направи по -ефективен.
