Екцел ВБА догађаји

Догађаји се стално дешавају када корисник отвори Екцел радну свеску и почне да обавља различите радње, попут уноса података у ћелије или кретања између листова

Унутар Висуал Басиц Едитор -а (АЛТ+Ф11) већ су подешене подрутине које се могу отпустити када корисник уради нешто, нпр. уношење података у ћелију. Потпрограм не даје никакав код радње, само наредбу „Суб“ и „Енд Суб“ наредбу без кода између њих. Они су ефективно успавани, па се ништа не дешава док не унесете неки код.

Ево примера заснованог на догађају „Промени“ на радном листу:

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

Ако затворе радну свеску, од њих ће се аутоматски затражити да сачувају промене. Међутим, радна свеска има догађај „БефореЦлосе“ и можете унети код да бисте спречили затварање радне свеске и покретање догађаја „Сачувај“. Затим можете додати дугме на сам радни лист и на њега ставити своју рутину „Сачувај“. Такође можете онемогућити рутину „Сачувај“ помоћу догађаја „Пре чувања“

Разумевање начина на који догађаји функционишу је апсолутно неопходно за ВБА програмера.

Врсте догађаја

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

Догађаји на радном листу - ове догађаје покреће корисник који предузима радње на одређеном радном листу. Сваки радни лист у радној свесци има засебни кодни модул који садржи различите догађаје посебно за тај радни лист (не за све радне листове). То укључује корисничке радње као што су промена садржаја ћелије, двоструки клик на ћелију или десни клик на ћелију.

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

На пример, на радном листу можете имати две падајуће контроле. Желите да се доступна листа у другом падајућем менију заснива на ономе што је корисник изабрао у првом падајућем менију. Користећи догађај „Промени“ на првом падајућем менију, можете креирати код за читање онога што је корисник изабрао, а затим ажурирати други падајући мени. Други падајући мени можете деактивирати све док корисник не направи избор у првом падајућем менију

Догађаји УсерФорм -а - Можете уметнути и дизајнирати образац професионалног изгледа који ће се користити као скочни прозор. Све контроле које постављате у образац су Ацтиве Кс контроле и имају исте догађаје као контроле Ацтиве Кс које можете поставити на радни лист

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

Догађаји апликације - Они користе објекат Апплицатион у ВБА. Примери би омогућили да се код отпусти када се притисне одређени тастер или када се достигне одређено време. Могли бисте програмирати ситуацију у којој радна свеска остаје отворена 24 сата дневно и увози податке из спољног извора преко ноћи у унапред одређено време.

Опасности употребе кода у догађајима

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

На пример, претпоставимо да користите догађај „Промени“ на радном листу тако да када корисник унесе вредност у ћелију, прорачун на основу те ћелије се смести у ћелију одмах десно од ње.

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

Морате добро размислити приликом писања кода за догађај како бисте били сигурни да се други догађаји неће случајно покренути

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

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

1234 Суб ДисаблеЕвентс ()Апплицатион.ЕнаблеЕвентс = НетачноАпплицатион.ЕнаблеЕвентс = ТачноЕнд Суб

Имајте на уму да ово онемогућава све догађаје у целој Екцел апликацији, па би то такође утицало на друге функције у Екцелу. Ако ово користите из било ког разлога, уверите се да се догађаји касније поново укључују.

Важност параметара у догађајима

Догађаји обично имају параметре помоћу којих можете сазнати више о томе шта корисник ради и локацији ћелије у којој се налазе.

На пример, догађај Промена радног листа изгледа овако:

1 Приватни подрадни лист_Промени (БиВал циљ као опсег)

Коришћењем објекта ранге можете сазнати координате реда/колоне ћелије у којима се корисник заправо налази.

1234 Приватни под -радни лист_Промени (БиВал циљ као опсег)МсгБок Таргет.ЦолумнМсгБок Таргет.РовЕнд Суб

Ако желите да ваш код ради само на одређеном броју колоне или реда, додајте услов који излази из потпрограма ако колона није потребна.

123 Приватни подрадни лист_Промени (БиВал циљ као опсег)Иф Таргет.Цолумн 2 Затим изађите из СубЕнд Суб

Ово заобилази проблем вашег кода који покреће више догађаја, јер ће радити само ако је корисник променио ћелију у колони 2 (колона Б)

Примери догађаја у радној свесци (нису исцрпни)

Догађаји радне свеске налазе се под објектом „ТхисВоркбоок“ у ВБЕ Пројецт Екплореру. Мораћете да изаберете „Радна свеска“ у првом падајућем менију у прозору кода, а затим ће вам други падајући мени приказати све доступне догађаје

Отворени догађај радне свеске

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

123 Привате Суб Воркбоок_Опен ()МсгБок "Добродошли" & Апплицатион.УсерНамеЕнд Суб

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

Догађај Нови лист радне свеске

Овај догађај се покреће када корисник дода нови лист радној свесци

Овај код бисте могли да користите само да бисте себи дозволили додавање новог листа, уместо да имате различите кориснике који додају листове и праве неред у радној свесци

1234567 Привате Суб Воркбоок_НевСхеет (БиВал Сх Ас Објецт)Апплицатион.ДисплаиАлертс = НетачноАко Апплицатион.УсерНаме "Рицхард" ТадаСх.ДелетеКрај АкоАпплицатион.ДисплаиАлертс = ТачноЕнд Суб

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

Уморни сте од тражења примера ВБА кода? Испробајте АутоМацро!

Радна свеска пре чувања догађаја

Овај догађај се покреће када корисник кликне на икону „Сачувај“, али пре него што се „Сачувај“ заиста догоди

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

123 Привате Суб Воркбоок_БефореСаве (БиВал СавеАсУИ као Боолеан, Цанцел Ас Боолеан)Откажи = ТачноЕнд Суб

Радна свеска пре затварања догађаја

Овај догађај можете користити да спречите кориснике да затворе радну свеску и поново их натерати да изађу кроз дугме радног листа. Поново постављате параметар „Откажи“ на „Тачно“. Црвени Кс у горњем десном углу прозора програма Екцел више не ради.

123 Привате Суб Воркбоок_БефореЦлосе (Откажи као логичко)Откажи = ТачноЕнд Суб

Примери догађаја на радном листу (нису исцрпни)

Догађаји радног листа налазе се под објектом одређеног назива листа у ВБЕ Пројецт Екплореру. Мораћете да изаберете „Радни лист“ на првом падајућем менију у прозору кода, а затим ће вам други падајући мени приказати све доступне догађаје

Догађај промене радног листа

Овај догађај се активира када корисник изврши промену радног листа, на пример уношење нове вредности у ћелију

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

12345 Приватни под -радни лист_Промени (БиВал циљ као опсег)Иф Таргет.Цолумн 2 Затим изађите из СубАцтивеСхеет.Целлс (Таргет.Ров, Таргет.Цолумн + 1). Вредност = _АцтивеСхеет.Целлс (Таргет.Ров, Таргет.Цолумн). Вредност * 1.1Енд Суб

У овом примеру, код ће радити само ако је вредност унета у колону Б (колона 2). Ако је ово тачно, додаће 10% броју и сместиће га у следећу доступну ћелију

Радни лист пре догађаја двоструког клика

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

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

Ово је веома импресивно са становишта корисника и спасава их од сталног питања „зашто је овај број тако висок?“

Морали бисте написати код да бисте сазнали наслов / критеријуме за број (користећи својства објекта Таргет), а затим филтрирати табеларне податке, а затим их копирати у извештај.

ВБА програмирање | Генератор кода ради за вас!

Радни лист Активирај догађај

До овог догађаја долази када корисник пређе са једног листа на други. Односи се на нови лист на који се корисник премешта.

Може се користити за осигурање да се нови лист потпуно израчуна пре него што корисник почне да ради било шта на њему. Такође се може користити само за поновно израчунавање тог одређеног листа без поновног израчунавања целе радне свеске. Ако је радна свеска велика и има компликовану формулу, поновно израчунавање једног листа штеди много времена

123 Приватни под -радни лист_Ацтивате ()АцтивеСхеет.ЦалцулатеЕнд Суб

Догађаји активне контроле Кс (нису исцрпни)

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

Догађаји Ацтиве Кс се налазе под одређеним објектом имена листа (где сте додали контролу) у ВБЕ Пројецт Екплореру. Мораћете да изаберете назив контроле Ацтиве Кс у првом падајућем менију у прозору кода, а затим ће вам други падајући мени показати све доступне догађаје

Тастер за команду Кликните на догађај

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

На ово можете лако ставити поруку „Јесте ли сигурни?“ Тако да се провери пре него што се код покрене

12345 Приватна под -командаБуттон1_Цлицк ()Дим БуттонРет као варијантаБуттонРет = МсгБок ("Јесте ли сигурни да то желите да урадите?", ВбКуестион Или вбИесНо)Ако је БуттонРет = вбНо Затим изађите из СубЕнд Суб

Падајући мени (Цомбо Бок) Промените догађај

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

123 Привате Суб ЦомбоБок1_Цханге ()МсгБок "Изабрали сте" & ЦомбоБок1.ТектЕнд Суб

ВБА програмирање | Генератор кода ради за вас!

Означите поље за потврду (поље за потврду) Кликните на Догађај

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

123 Привате Суб ЦхецкБок1_Цлицк ()МсгБок ЦхецкБок1.ВалуеЕнд Суб

Догађаји на корисничком обрасцу (нису исцрпни)

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

Ево примера једноставног облика:

Када се прикаже, овако изгледа на екрану

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

Код и догађаји иза обрасца могу се видети двоструким кликом било где на обрасцу

Први падајући мени омогућава приступ свим контролама на обрасцу. Други падајући мени ће омогућити приступ догађајима

УсерФорм Ацтивате Евент

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

123 Привате Суб УсерФорм_Ацтивате ()ТектБок1.Тект = "Назив моје компаније"Енд Суб

ВБА програмирање | Генератор кода ради за вас!

Цханге Евент

Већина контрола на обрасцу има догађај промене, али у овом примеру оквир за текст назива предузећа може да искористи догађај за постављање ограничења на дужину назива компаније који се уноси

123456 Привате Суб ТектБок1_Цханге ()Ако је Лен (ТектБок1.Тект)> 20 ЗатимМсгБок "Име је ограничено на 20 знакова", вбЦритицалТектБок1.Тект = ""Крај АкоЕнд Суб

Кликните на Догађај

Овај догађај можете користити за предузимање радњи од корисника који кликне на контроле на обрасцу или чак на самом обрасцу

На овом обрасцу постоји дугме „У реду“ и пошто смо прикупили назив компаније, желели бисмо да га ставимо у ћелију у табели ради будуће референце

1234 Приватна под -командаБуттон1_Цлицк ()АцтивеСхеет.Ранге ("А1"). Вредност = ТектБок1.ТектМе.ХидеЕнд Суб

Овај код делује када корисник кликне на дугме „У реду“. Она ставља вредност у оквир за унос назива предузећа у ћелију А1 на активном листу, а затим сакрива образац тако да се корисничка контрола враћа на радни лист.

Догађаји на графикону

Догађаји графикона функционишу само на графиконима који се налазе на посебном листу графикона, а не на графикону који је уграђен у стандардни радни лист

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

Најкориснији догађај би био да сазнате компоненту графикона на коју је корисник кликнуо, нпр. сегмент у тортном графикону или трака на тракастом графикону, али ово није догађај доступан у стандардном распону догађаја.

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

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

Догађаји апликације

Објекат Апплицатион у ВБА можете користити за отпуштање кода према одређеном догађају

ВБА програмирање | Генератор кода ради за вас!

Апплицатион.ОнТиме

Ово вам може омогућити да отпуштате део кода у редовним интервалима све док је радна свеска учитана у Екцел. Можда ћете желети да аутоматски сачувате своју радну свеску у другу фасциклу сваких 10 минута или да оставите радни лист да ради преко ноћи како бисте унели најновије податке из спољног извора.

У овом примеру, потпрограм се уноси у модул. Приказује оквир за поруке на сваких 5 минута, иако би то лако могао бити још један кодирани поступак. У исто време, тајмер се ресетује на тренутно време плус још 5 минута.

Сваки пут када се покрене, тајмер се ресетује да би покренуо исту подрутину у наредних 5 минута.

1234 Суб ТестОнТиме ()МсгБок "Тестирање на времену"Апплицатион.ОнТиме (Нов () + ТимеВалуе ("00:05:00")), "ТестОнТиме"Енд Суб

Апплицатион.ОнКеи

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

У овом примеру слово „а“ се преусмерава тако да уместо „а“ у ћелију приказује оквир за поруку. Овај код треба ставити у уметнути модул.

123456 Под ТестКеиПресс ()Апплицатион.ОнКеи "а", "ТестКеиПресс"Енд СубПод ТестКеиПресс ()МсгБок "Притиснули сте 'а'"Енд Суб

Покрећете подрутину „ТестКеиПресс“ пре свега. Ово морате покренути само једном. Екцел говори да ће сваки пут када се притисне слово „а“ позвати потпрограм „ТестКеиПресс“. Потпрограм „ТестКеиПресс“ само приказује оквир за поруку који вам говори да сте притиснули тастер „а“. Наравно, могао би учитати образац или учинити разне друге ствари.

Можете користити било коју комбинацију тастера коју можете користити са функцијом „СендКеис“

Да бисте отказали ову функцију, покрећете наредбу „ОнКеи“ без параметра „Процедура“.

123 ПодкажитеОнКеи ()Апплицатион.ОнКеи "а"Енд Суб

Сада се све вратило у нормалу.

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

wave wave wave wave wave