Писање ВБА макроа од нуле

Екцел -ов макро снимач има велику снагу, али има ограничења. Као што је описано у другом чланку, макро снимач често снима непотребан код и не може снимати ствари попут логике или интеракције са другим програмима. Такође може бити тешко користити за дуже макрое - можда ћете се претходно натерати да испричате своје акције само да не бисте направили скупе грешке.

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

Почетак

ВБА и уређивач Висуал Басиц

ВБА или Висуал Басиц фор Апплицатионс је језик на којем су написани макрои. Сви макрои се чувају као ВБА код, било да су ручно кодирани или створени помоћу макро рекордера.

Свему ВБА коду у радној свесци можете приступити помоћу уређивача Висуал Басиц. Ово је посебан уређивач текста и програм за отклањање грешака који је уграђен у све канцеларијске апликације, укључујући Екцел. Обично ћете отворити овај уређивач са АЛТ+Ф11 тастерску пречицу у Екцелу, али можете јој приступити и из програма Екцел Девелопер картицу ако је омогућена.

Пројецт Екплорер

Тхе Пројецт Екплорер је прозор унутар ВБ Едитор -а који вам приказује све ставке које могу имати ВБА код у себи. Ако не видите овај прозор, притисните Ф5 да се појави или изабере Пројецт Екплорер од Поглед мени.

Двоструким кликом на ставку у Пројецт Екплореру приказаће се код за ту ставку. У Истраживачу пројеката може се појавити неколико врста ставки:

  • Радне свеске
  • Радни листови
  • УсерФормс
  • Модули класе
  • Модули (макрои су смештени у овим ставкама)

Иако сви типови ставки могу укључивати ВБА код, најбоља пракса је кодирање макроа у Модулима.

Прављење вашег првог макроа

Коришћење макро листе

Листа макроа приказује све макрое у вашој радној свесци. Са ове листе можете уредити постојећи макро или креирати нови.

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

  • Изаберите картицу Девелопер и кликните Макрои (или притисните АЛТ+Ф8)

  • Унесите ново име за свој макро, а затим кликните на „Креирај“

Након што кликнете на „Креирај“, појавит ће се ВБ Едитор који приказује новонастали макро. Екцел ће по потреби креирати нови модул за макро.

Ручно у ВБ Едитор -у

Нови макро можете додати ручно без листе Макрои. Ово је боља опција ако желите да наведете модул у који је макро сачуван.

Да бисте ручно додали макро:

  • Отворите ВБ Едитор (АЛТ+Ф11)
  • Или:
    • Додајте нови модул кликом на Уметни> Модул на менију (модул ће се аутоматски отворити)

    • ИЛИ, двапут кликните на постојећи модул у Пројецт Екплореру да бисте га отворили

  • У модулу унесите код за свој нови макро
Суб МиМацро () Крај Суб

Ове две линије означавају почетак и крај макроа под називом „МиМацро“ (обратите пажњу на заграде које су потребне). Ово ће се појавити у дијалогу „Приказ макроа“ у Екцелу и може се доделити дугмету (иако то још не ради ништа).

Додајте неки код у макро

Сада, додајмо неки код између редова „Суб“ и „Енд Суб“ како би овај макро заиста учинио нешто:

Опсег Суб МиМацро () („А1“). Вредност = „Здраво свете!“ Енд Суб

Основне структуре кода

Објекат Ранге

Екцел ВБА користи објекат опсега за представљање ћелија на радном листу. У горњем примеру, Ранге објекат је креиран са кодом Домет („А1“) како би се приступило вредности ћелије А1.
Објекти опсега првенствено се користе за постављање вредности ћелија:

Опсег („А1“). Вредност = 1
Опсег („А1“). Вредност = „Прва ћелија“

Уочите да приликом дефинирања вриједности ћелије као бројева само уносите број, али при уносу текста морате окружити текст наводницима.

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

Опсег („А1“). Фонт.Болд = Тачно

Такође можете поставити формулу ћелије:

Опсег („А1“). Формула = „= Збир (А2: А10)“

У Екцелу можете да изаберете блок ћелија помоћу курсора (рецимо, од А1 до Д10) и све их поставите подебљаним. Објекти опсега могу приступити блоковима ћелија овако:

Опсег („А1: Д10“). Фонт.Болд = Тачно

Такође се можете позвати на неколико ћелија/блокова одједном:

Распон („А1: Д10, А12: Д12, Г1“). Фонт.Болд = Труе

Формат за ово је исти као формат који бисте користили при избору ћелија за формулу СУМ () у Екцелу. Сваки блок је одвојен зарезом, а блокови су означени горњим левим и доњим десним ћелијама одвојеним двотачком.

Коначно, објекти Ранге имају уграђене методе за обављање уобичајених операција на радном листу. На пример, можда ћете желети да копирате неке податке са једног места на друго. Ево примера:

Опсег („А1: Д10“). Распон копирања („Ф1“). ПастеСпециал клПастеВалуес Распон („Ф1“). ПастеСпециал клПастеФорматс

Ово копира ћелије А1: Д10 у међуспремник, а затим врши ПастеСпециал () почевши од ћелије Ц1 - баш као што бисте ручно урадили у Екцелу. Имајте на уму да овај пример показује како се користи ПастеСпециал () за лепљење само вредности и формата - постоје параметри за све опције које бисте видели у дијалогу Специјално лепљење.

Ево примера лепљења „Све“ на други радни лист:

Опсег („А1: Д10“). Копирај листове („Лист 2“). Распон („А1“). ПастеСпециал клПастеАлл

Ако Изјаве

Са Ако изјава, можете учинити да се део кода изводи само „ако“ је одређена изјава тачна.

На пример, можда желите да подебљате ћелију подебљано и обојите је црвеном бојом, али само „ако“ је вредност у ћелији мања од 100.

Ако опсег („А4“). Вредност <100 Затим опсег („А4“). Фонт.Болд = Тачан опсег („А4“). Интеријер.Боја = вбРед Крај Ако 

Правилна структура наредбе Иф је следећа (углате заграде означавају изборне компоненте):

Ако онда

[Остало Онда]

[Иначе]

Крај Ако

Можете укључити што више Остало блокира како желите да тестирате више услова. Такође можете додати Иначе блок који се покреће само ако није испуњен ниједан други услов у наредби Иф.

Ево још једног примера заснованог на претходном, где се ћелија форматира на неколико различитих начина у зависности од вредности:

Иф Ранге ("А4"). Валуе <100 тхен Ранге ("А4"). Фонт.Болд = Труе Ранге ("А4"). Интериор.Цолор = вбРед ЕлсеИф Ранге ("А4"). Валуе <200 тхен Ранге ("А4"). "А4"). Фонт.Болд = Фалсе Ранге ("А4"). Интериор.Цолор = вбЈуги опсег ("А4"). Фонт.Болд = Фалсе Ранге ("А4"). Интериор.Цолор = вбГреен Енд Иф

У горњем примеру, ћелија није подебљана у блоковима ЕлсеИф где вредност није испод 100. Можете гнездо Ако наредбе за избегавање дуплирања кода, овако:

Иф Ранге ("А4"). Валуе <100 тхен Ранге ("А4"). Фонт.Болд = Труе Ранге ("А4"). Интериор.Цолор = вбРед Елсе Ранге ("А4"). Фонт.Болд = Фалсе ' расклапање фонта само једном Ако опсег ("А4"). Вредност <200 Затим опсег ("А4"). Унутрашњост.Боја = вбЖути други распон ("А4").

Променљиве

А. Променљива је део меморије који се користи за складиштење привремених информација док је макро покренут. Често се користе у петљама као итератори или за држање резултата операције коју желите да користите неколико пута кроз макро.

Ево примера променљиве и како је можете користити:

Суб ЕктрацтСериалНумбер () Дим стрСериал Ас Стринг 'ово је декларација променљиве' 'Ас Стринг' значи да ова променљива има за циљ да задржи текст 'постављајући претварачки серијски број: Опсег ("А4"). Вредност = "сериал# 804567-88 ”'Рашчланите серијски број из ћелије А4 и доделите га променљивој стрСериал = Мид (Ранге (“ А4 ”). Валуе, 9)“ сада користите променљиву два пута, уместо да двапут рашчлањујете серијски број Ранге (“ Б4 ”). Вредност = стрСериал МсгБок стрСериал Енд Суб 

У овом основном примеру, променљива „стрСериал“ се користи за издвајање серијског броја из ћелије А4 помоћу функције Мид (), а затим се користи на два друга места.

Стандардни начин да се изјавити променљива је следећа:

Замутити било које име [Као тип]

  • било које име је име које сте одлучили да дате променљивој
  • тип је тип података променљиве

Приказ „[Ас тип] ”Део се може изоставити - ако је тако, променљива се декларише као тип варијанте, која може да садржи било коју врсту података. Иако су потпуно валидне, типове варијанти треба избегавати јер могу довести до неочекиваних резултата ако нисте опрезни.

Постоје правила за називе променљивих. Морају почети са словом или знаком за подвлачење, не могу имати размаке, тачке, зарезе, наводнике или знакове “! @ & $ #”.

Ево неколико примера декларација променљивих:

Дим стрФиленаме Ас Стринг 'стил доброг имена - описан и користи префикс Дим и Ас Лонг' стил лошег имена - прихватљив само за неке итераторе Дим СалеПрице Ас Доубле 'у реду стил имена - описно, али не користи префикс Дим иЦоунтер' добро име - није превише описан, користи префикс, нема тип података

Сви ови примери користе незнатно различите шеме именовања, али сви су важећи. Није лоша идеја да имену променљиве дате префикс кратким обликом њеног типа података (према неким од ових примера), јер то чини ваш код читљивијим на први поглед.

ВБА укључује много основних типови података. Најпопуларнији су:

  • Низ (користи се за чување текстуалних података)
  • Лонг (користи се за држање целих бројева, тј. без децималних места)
  • Доубле (користи се за држање бројева са покретним зарезом, тј. децималних места)

Потпуни списак унутрашњих типова података ВБА може се пронаћи овде: хттпс://доцс.мицрософт.цом/ен-ус/оффице/вба/лангуаге/референце/усер-интерфаце-хелп/дата-типе-суммари

Објектне променљиве опсега

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

Када креирате променљиву објекта Ранге, морате је „поставити“ на инстанцу опсега. На пример:

Дим рМиРанге Ас Ранге Сет рМиРанге = Распон (“А1: А10; Д1: Ј10”)

Изостављање израза „Сет“ при додељивању променљиве опсега резултираће грешком.

Петље

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

За-Следеће

А. За-Следеће блок је петља која се понавља одређени број пута. Користи променљиву као итератор за бројање колико пута је покренута, а ова итераторска променљива се може користити унутар петље. Ово чини петље Фор-Нект веома корисним за понављање кроз ћелије или низове.

Ево примера који кружи кроз ћелије у редовима 1 до 100, колони 1 и поставља њихове вредности на вредност променљиве итератора:

Дим и Ас Лонг Фор и = 1 То 100 Целлс (и, 1) .Вредност = и Нект и

Ред „За и = 1 до 100“ значи да петља почиње од 1 и завршава се после 100. Можете поставити све почетне и завршне бројеве које желите; за ове бројеве можете користити и променљиве.

Подразумевано, петље Фор-Нект се броје за 1. Ако желите да бројите према другом броју, петљу можете написати са експлицитним Корак клаузула:

За и = 5 до 100 Корак 5

Ова петља ће започети у 5, а затим додати 5 на „и“ сваки пут када се петља понавља (тако да ће „и“ бити 10 на другом понављању, 15 на трећем итд.).

Користећи Корак, можете направити и бројање петљи уназад:

За и = 100 до 1 корак -1

Можете такође гнездо Петље Фор-Нект. Сваки блок захтева сопствену променљиву за рачунање, али те променљиве можете користити где год желите. Ево примера како је то корисно у Екцел ВБА:

Дим и Ас Лонг, ј Ас Лонг Фор и = 1 То 100 Фор ј = 1 То 100 Целлс (и, ј) .Вредност = и * ј Нект ј Нект и

Ово вам омогућава да пролазите кроз редове и колоне.

УПОЗОРЕЊЕ: иако је дозвољено, НИКАДА не треба да мењате променљиву итератор унутар блока Фор-Нект, јер она користи тај итератор за праћење петље. Измена итератора може изазвати бесконачну петљу и обесити ваш макро. На пример:

За и = 1 За 100 и = 1 Следеће и

У овој петљи, „И“ никада неће прећи 2 пре него што се ресетује на 1, а петља ће се понављати заувек.

За сваки

За сваки блокови су врло слични блоковима Фор-Нект, само што не користе бројач за одређивање колико пута се петљају. Уместо тога, блок Фор-Еацх узима „збирку“ објеката (попут опсега ћелија) и покреће се онолико пута колико има објеката у тој збирци.

Ево примера:

Дим р као опсег за сваки р у опсегу ("А15: Ј54") Ако је р.Валуе> 0 Тада је р.Фонт.Болд = Труе Енд Иф Нект р

Уочите употребу променљиве Ранге објекта „р“. Ово је итераторска променљива која се користи у петљи Фор -Еацх - сваки пут кроз петљу „р“ добија референцу на следећу ћелију у опсегу.

Предност коришћења петљи „За сваки“ у програму Екцел ВБА је то што можете проћи кроз све ћелије у опсегу без петљи за угнежђење. Ово може бити згодно ако требате да прођете кроз све ћелије у сложеном опсегу, на пример Домет („А1: Д12, Ј13, М1: И12“).

Један недостатак петљи Фор-Еацх је то што немате контролу над редоследом којим се ћелије обрађују. Иако у пракси Екцел ће се кретати кроз ћелије редом, теоретски могао је да обрађује ћелије потпуно насумичним редоследом. Ако требате да обрадите ћелије одређеним редоследом, уместо тога треба да користите петље Фор-Нект.

До-Лооп

Док блокови Фор-Нект користе бројаче да знају када треба стати, До-Лооп блокови раде све док се не испуни услов. Да бисте то урадили, користите ан Све док клаузулу на почетку или на крају блока, која тестира стање и узрокује прекид петље када се тај услов испуни.

Пример:

Дим стр Ас Стринг стр = "Буффало" До До стр = "Буффало Буффало Буффало Буффало Буффало Буффало Буффало" стр = стр & "" & "Буффало" Лооп Ранге ("А1"). Валуе = стр

У овој петљи, „Буффало“ се сваки пут кроз петљу повезује са „стр“ Све док се не подудара са очекиваном реченицом. У овом случају, тест се изводи на почетку петље - ако је 'стр' већ била очекивана реченица (што није зато што нисмо тако започели, али ако) петља се не би ни покренула .

Петљу можете покренути бар једном померањем клаузуле Унтил до краја, на следећи начин:

До стр = стр & "" & "Буффало" Петља до стр = "Буффало Буффало Буффало Буффало Буффало Буффало Буффало"

Можете користити било коју верзију која има смисла у вашем макроу.

УПОЗОРЕЊЕ: можете изазвати бесконачну петљу са До-Лооп блоком ако услов До никада није испуњен. Увек пишите свој код тако да ће услов До дефинитивно бити испуњен када користите ову врсту петље.

Шта је следеће?

Када сте схватили основе, зашто не бисте покушали да научите неке напредније технике? Наш водич на хттпс://еасиекцел.нет/екцел/леарн-вба-туториал/ надограђиват ће све оно што сте овдје научили и проширити ваше вјештине помоћу Догађаја, корисничких образаца, оптимизације кода и још много тога!

wave wave wave wave wave