Екцел ВБА догађаји - једноставан (и потпун) водич

Када креирате или снимате макро у програму Екцел, морате покренути макро да бисте извршили кораке у коду.

Неколико начина покретања макроа укључује коришћење дијалошког оквира макроа, додељивање макроа дугмету, коришћење пречице итд.

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

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

Дозволите ми прво да објасним шта је догађај у ВБА.

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

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

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

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

На пример, ако уметнете нови радни лист и желите да има префикс за годину, можете да напишете код за њега.

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

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

Слично, можете да креирате ВБА кодове за многе такве догађаје (као што ћемо видети касније у овом чланку).

Испод је кратак визуелни приказ догађаја двоструког клика на делу. Чим двапут кликнем на ћелију А1. Екцел тренутно отвара оквир за поруку који приказује адресу ћелије.

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

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

Различите врсте Екцел ВБА догађаја

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

За сваки од ових објеката могу бити повезани различити догађаји. На пример:

  • Ако креирате нову радну свеску, то је догађај на нивоу апликације.
  • Ако додате нови радни лист, то је догађај на нивоу радне свеске.
  • Ако промените вредност у ћелији на листу, то је догађај на нивоу радног листа.

Испод су различите врсте догађаја који постоје у Екцелу:

  1. Догађаји на нивоу радног листа: Ово су типови догађаја који би се покренули на основу радњи предузетих на радном листу. Примери ових догађаја укључују промену ћелије на радном листу, промену избора, двоструки клик на ћелију, десни клик на ћелију итд.
  2. Догађаји на нивоу радне свеске: Ови догађаји би се покренули на основу радњи на нивоу радне свеске. Примери ових догађаја укључују додавање новог радног листа, чување радне свеске, отварање радне свеске, штампање дела или целе радне свеске итд.
  3. Догађаји на нивоу апликације: Ово су догађаји који се дешавају у Екцел апликацији. Пример ових би укључивао затварање било које отворене радне свеске или отварање нове радне свеске.
  4. Догађаји на нивоу корисничког формулара: Ови догађаји би се покренули на основу радњи у „Корисничком обрасцу“. Примери за то укључују иницијализацију УсерФорм -а или клик на дугме у УсерФорм -у.
  5. Догађаји на графикону: Ово су догађаји повезани са листом графикона. Лист графикона је другачији од радног листа (ту се већина нас користи за рад у Екцелу). Сврха листова графикона је да држи графикон. Примери таквих догађаја би укључивали промену серије графикона или промену величине графикона.
  6. ОнТиме и ОнКеи догађаји: Ово су два догађаја која се не уклапају ни у једну од горе наведених категорија. Зато сам их посебно навео. Догађај „ОнТиме“ вам омогућава да извршите код у одређено време или након истека одређеног времена. Догађај „ОнКеи“ вам омогућава да извршите код када се користи одређени притисак на тастер (или комбинација тастера).

Где ставити код везан за догађај

У горњем одељку обрађивао сам различите врсте догађаја.

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

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

У ВБА различити објекти - као што су радни листови, радне свеске, графикони, кориснички обрасци итд., Имају своје прозоре са кодом. Морате да унесете код догађаја у прозор кода релевантног објекта. На пример - ако се ради о догађају на нивоу радне свеске, онда морате да имате код догађаја у прозору кода радне свеске.

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

У прозору кода радног листа

Када отворите ВБ Едитор (користећи пречицу на тастатури АЛТ + Ф11), приметили бисте објекат радних листова у Пројецт Екплореру. За сваки радни лист у радној свесци видећете један објекат.

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

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

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

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

Чим изаберете догађај, он ће аутоматски унети први и последњи ред кода за изабрани догађај. Сада можете додати свој код између два реда.

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

Имајте на уму да сваки радни лист има свој кодни прозор. Када поставите код за Схеет1, он ће радити само ако се догађај догоди у Схеет1.

У прозору кода ТхисВоркбоок

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

Када двапут кликнете на ТхисВоркбоок, отвориће се кодни прозор за њега.

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

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

Чим изаберете догађај, он ће аутоматски унети први и последњи ред кода за изабрани догађај. Сада можете додати свој код између два реда.

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

У прозору кода корисничког обрасца

Када креирате УсерФормс у Екцелу, можете користити и УсерФорм догађаје за извршавање кодова на основу одређених радњи. На пример, можете одредити код који се извршава када се притисне дугме.

Док су објекти Схеет и објекти ТхисВоркбоок већ доступни када отворите ВБ Едитор, УсерФорм је нешто што морате прво да креирате.

Да бисте креирали УсерФорм, кликните десним тастером миша на било који од објеката, идите на Инсерт и кликните на УсерФорм.

Ово ће уметнути објект УсерФорм у радну свеску.

Када двапут кликнете на УсерФорм (или било који објект који додате у УсерФорм), отворит ће се прозор кода за УсерФорм.

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

У прозору кода графикона

У програму Екцел можете такође уметнути листове графикона (који се разликују од радних листова). Лист графикона треба да садржи само графиконе.

Када уметнете лист графикона, моћи ћете да видите објекат листа графикона у ВБ Едитор -у.

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

Двапут кликните на објекат листа графикона у Пројецт Екплореру. Ово ће отворити кодни прозор за графикон.

Сада морате да изаберете графикон са падајућег менија у горњем левом углу прозора кода.

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

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

У модулу класе

Модули класе морају бити уметнути баш као и кориснички обрасци.

Модул класе може да садржи код који се односи на апликацију - а то би био сам Екцел и уграђени графикони.

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

Имајте на уму да осим ОнТиме и ОнКеи догађаја, ниједан од горе наведених догађаја не може бити ускладиштен у редовном ВБА модулу.

Разумевање низа догађаја

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

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

  1. Додаје се нови радни лист
  2. Претходни радни лист се деактивира
  3. Нови радни лист се активира

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

Разумевање улоге аргумената у ВБА догађајима

Пре него што пређемо на примере догађаја и сјајне ствари које можете да урадите с њим, постоји један важан концепт који морам покрити.

У ВБА догађајима постојале би две врсте кодова:

  • Без икаквих аргумената
  • Са аргументима

И у овом одељку желим брзо да обухватим улогу аргумената.

Испод је код који нема аргумент (заграде су празне):

Привате Суб Воркбоок_Опен () МсгБок "Не заборавите да попуните временски лист" Енд Суб

Са горњим кодом, када отворите радну свеску, она једноставно приказује оквир за поруку са поруком - „Не заборавите да попуните временски лист“.

Хајде сада да погледамо код који има аргумент.

Привате Суб Воркбоок_НевСхеет (БиВал Сх Ас Објецт) Сх.Ранге ("А1") = Сх.Наме Енд Суб

Горњи код користи Сх аргумент који је дефинисан као тип објекта. Аргумент Сх може бити радни лист или лист графикона, јер се горњи догађај покреће када се дода нови лист.

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

Концепт аргумената биће користан када прођете кроз примере ВБА догађаја у следећим одељцима.

Догађаји на нивоу радне свеске (објашњено примерима)

Следе догађаји који се најчешће користе у радној свесци.

НАЗИВ ДОГАЂАЈА ШТА ТРИГИРА ДОГАЂАЈ
Активирати Када је радна свеска активирана
АфтерСаве Када је радна свеска инсталирана као додатак
БефореСаве Када се сачува радна свеска
БефореЦлосе Када је радна свеска затворена
БефореПринт Када се штампа радна свеска
Деактивирајте Када је радна свеска деактивирана
НевСхеет Када се дода нови лист
Отвори Када се отвори радна свеска
СхеетАцтивате Када се активира било који лист у радној свесци
СхеетБефореДелете Када се било који лист избрише
СхеетБефореДоублеЦлицк Када двапут кликнете на било који лист
СхеетБефореРигхтЦлицк Када се десни клик на било који лист
СхеетЦалцулате Када се било који лист израчуна или поново израчуна
СхеетДеацтивате Када је радна свеска деактивирана
СхеетПивотТаблеУпдате Када се радна свеска ажурира
СхеетСелецтионЦханге Када се промени радна свеска
ВиндовАцтивате Када је радна свеска активирана
ВиндовДеацтивате Када је радна свеска деактивирана

Имајте на уму да ово није потпуна листа. Комплетну листу можете пронаћи овде.

Запамтите да је код за радну свеску ускладиштен у прозору кода објеката ТхисВоркбоок.

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

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

Рецимо да желите да покажете кориснику пријазан подсетник да попуни њихове временске листе кад год отворе одређену радну свеску.

Да бисте то урадили, можете користити доњи код:

Привате Суб Воркбоок_Опен () МсгБок "Не заборавите да попуните временски лист" Енд Суб

Чим отворите радну свеску са овим кодом, она ће вам приказати оквир за поруку са наведеном поруком.

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

  • Ако радна свеска има макро и желите да је сачувате, потребно је да је сачувате у .КСЛСМ формату. У супротном би се макро код изгубио.
  • У горњем примеру, код догађаја ће се извршити само када су омогућени макрои. Можда ћете видети жуту траку која тражи дозволу за омогућавање макроа. Док се то не омогући, код догађаја се не извршава.
  • Код догађаја радне свеске налази се у прозору кода објекта ТхисВоркбоок.

Можете додатно да прецизирате овај код и прикажете поруку само у петак.

Код испод би ово урадио:

Привате Суб Воркбоок_Опен () вкдаи = Радни дан (датум) Ако је вкдаи = 6 Тада ће МсгБок "Не заборавите да попуните временски лист" Енд Суб

Имајте на уму да је у функцији Недеља недељи додељена вредност 1, понедељку 2 и тако даље.

Стога сам за петак користио 6.

Догађај Отворена радна свеска може бити користан у многим ситуацијама, као што су:

  • Када желите да прикажете поруку добродошлице особи када се отвори радна свеска.
  • Када желите да прикажете подсетник када се радна свеска отвори.
  • Када желите да увек активирате један одређени радни лист у радној свесци када се отвори.
  • Када желите да отворите повезане датотеке заједно са радном свеском.
  • Када желите да забележите датум и временску ознаку сваки пут када се радна свеска отвори.

Догађај НевСхеет радне свеске

Догађај НевСхеет покреће се када уметнете нови лист у радну свеску.

Рецимо да желите да унесете вредност датума и времена у ћелију А1 ново уметнутог листа. Да бисте то урадили, можете користити доњи код:

Привате Суб Воркбоок_НевСхеет (БиВал Сх Ас Објецт) Он Еррор Ресуме Нект Сх.Ранге ("А1") = Формат (Нов, "дд-ммм-ииии хх: мм: сс") Крај Суб

Горњи код користи „Следећи наставак грешке“ за руковање случајевима када неко уметне лист графикона, а не радни лист. Пошто лист графикона нема ћелију А1, приказала би се грешка ако се не користи „Он Еррор Ресуме Нект“.

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

Привате Суб Воркбоок_НевСхеет (БиВал Сх Ас Објецт) Он Еррор Ресуме Нект Витх Сх.Ранге ("А1") .Валуе = "С. Но." .Интериор.Цолор = вбБлуе .Фонт.Цолор = вбВхите Енд Витх Фор и = 1 То 100 Сх.Ранге ("А1"). Оффсет (и, 0) .Варуе = и Нект и Сх.Ранге ("А1", Ранге ("А1"). Енд (клДовн)). Бордерс.ЛинеСтиле = клЦонтинуоус Енд Суб

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

Горњи код је пример како вам кратки ВБА код може помоћи да украдете неколико секунди сваки пут када убаците нови радни лист (у случају да је то нешто што морате да радите сваки пут).

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

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

Приликом чувања Екцел радне свеске, могућа су два сценарија:

  1. По први пут га чувате и приказаће се дијалошки оквир Сачувај као.
  2. Већ сте га сачували и он ће једноставно сачувати и преписати промене у већ сачуваној верзији.

Хајде сада да погледамо неколико примера где можете користити догађај БефореСаве.

Претпоставимо да имате нову радну свеску коју први пут чувате и желите да подсетите корисника да је сачува на К погону, а затим можете користити доњи код:

Привате Суб Воркбоок_БефореСаве (БиВал СавеАсУИ као Боолеан, Откажи као Боолеан) Ако СавеАсУИ Затим МсгБок "Сачувај ову датотеку на диску К" Енд Суб

У горњем коду, ако датотека никада није сачувана, СавеАсУИ је Труе и приказује дијалог Саве Ас. Горњи код би приказао поруку пре него што се појави дијалог Саве Ас.

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

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

Привате Суб Воркбоок_БефореСаве (БиВал СавеАсУИ Као Боолеан, Откажи као Боолеан) Радни листови ("Схеет1"). Распон ("А1") = Формат (Сада, "дд-ммм-гггг хх: мм: сс") Крај Суб

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

Радна свеска БефореЦлосе Евент

Пре него што се затвори догађај непосредно пре затварања радне свеске.

Код испод штити све радне листове пре него што се радна свеска затвори.

Привате Суб Воркбоок_БефореЦлосе (Цанцел Ас Боолеан) Дим сх Ас Радни лист За свако сх у овој радној свесци.Радни листови сх.Заштитити Нект сх Енд Суб

Запамтите да се код догађаја активира чим затворите радну свеску.

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

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

Радна свеска БефореПринт Евент

Када дате команду за штампање (или команду Преглед пре штампања), активира се догађај Пре штампања.

Код испод би поново израчунао све радне листове пре штампања радне свеске.

Привате Суб Воркбоок_БефореПринт (Цанцел Ас Боолеан) За сваки вс у радним листовима вс.Израчунај следећи вс Енд Суб

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

Још један пример испод је код који би додао датум и време у подножје када се штампа радна свеска.

Привате Суб Воркбоок_БефореПринт (Цанцел Ас Боолеан) Затамни вс као радни лист за сваки вс у ТхисВоркбоок.Ворксхеетс вс.ПагеСетуп.ЛефтФоотер = "Штампано на-" & Форматирај (Сада, "дд-ммм-ииии хх: мм") Следеће вс Енд Суб

Догађаји на нивоу радног листа (објашњено са примерима)

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

Следе догађаји који се најчешће користе на радном листу.

Назив догађаја Шта покреће догађај
Активирати Када је радни лист активиран
БефореДелете Пре брисања радног листа
БефореДоублеЦлицк Пре него што двапут притиснете радни лист
БефореРигхтЦлицк Пре него што кликнете десним тастером миша на радни лист
Израчунај Пре него што се радни лист израчуна или поново израчуна
Цханге Када се промене ћелије на радном листу
Деактивирајте Када је радни лист деактивиран
ПивотТаблеУпдате Када се заокретна табела на радном листу ажурира
СелецтионЦханге Када се промени избор на радном листу

Имајте на уму да ово није потпуна листа. Комплетну листу можете пронаћи овде.

Запамтите да је код за догађај радног листа ускладиштен у прозору кода објекта радног листа (у оном у којем желите да се догађај покрене). У радној свесци може бити више радних листова, а ваш код би се покренуо само када се догађај одигра на радном листу у који је смештен.

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

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

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

Код испод уклања заштиту са листа чим се активира.

Привате Суб Ворксхеет_Ацтивате () АцтивеСхеет.Унпротецт Енд Суб

Овај догађај можете користити и да бисте били сигурни да је одабрана одређена ћелија или опсег ћелија (или именовани опсег) чим активирате радни лист. Код испод бирао би ћелију Д1 чим активирате лист.

Привате Суб Ворксхеет_Ацтивате () АцтивеСхеет.Ранге ("Д1"). Изабери Енд Суб

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

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

Па … не увек.

Постоје неке промене које покрећу догађај, а неке не. Ево листе неких промена које неће покренути догађај:

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

Следеће промене би покренуле догађај (иако мислите да не би требало):

  • Форматирање копирања и лепљења покренуло би догађај.
  • Брисање форматирања би покренуло догађај.
  • Покретање провере правописа покренуло би догађај.

Испод је код који би приказао оквир за поруку са адресом ћелије која је промењена.

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

Иако је ово бескористан макро, он вам показује како помоћу аргумента Таргет сазнати које су ћелије промењене.

Погледајмо сада још неколико корисних примера.

Претпоставимо да имате низ ћелија (рецимо А1: Д10) и желите да прикажете упит и питате корисника да ли заиста жели да промени ћелију у овом опсегу или не, можете користити доњи код.

Приказује упит са два дугмета - Да и Не. Ако корисник одабере „Да“, промена је извршена, у супротном се обрће.

Привате Суб Ворксхеет_Цханге (БиВал Таргет Ас Ранге) Иф Таргет.Ров <= 10 Анд Таргет.Цолумн <= 4 Затим Анс = МсгБок ("Уносите промене у ћелије у А1: Д10. Јесте ли сигурни да то желите?", вбИесНо) Енд Иф Иф Иф Анс = вбНо Тхен Апплицатион.ЕнаблеЕвентс = Фалсе Апплицатион.Ундо Апплицатион.ЕнаблеЕвентс = Труе Енд Иф Енд Суб

У горњем коду проверавамо да ли се циљна ћелија налази у прве 4 колоне и првих 10 редова. У том случају приказује се оквир за поруку. Такође, ако је корисник у оквиру за поруку изабрао Не, промена се поништава (наредбом Апплицатион.Ундо).

Имајте на уму да сам користио Апплицатион.ЕнаблеЕвентс = Фалсе пре линије Апплицатион.Ундо. И онда сам га обрнуо користећи Апплицатион.ЕнаблеЕвент = Труе у следећем реду.

Ово је потребно, јер када се поништавање догоди, такође покреће догађај промене. Ако не подесим ЕнаблеЕвент на Фалсе, он ће наставити да покреће догађај промене.

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

Привате Суб Ворксхеет_Цханге (БиВал Таргет Ас Ранге) Дим ДРанге Ас Ранге Сет ДРанге = Ранге ("ДатаРанге") Иф Нот Интерсецт (Таргет, ДРанге) Ис Нотхинг тхен МсгБок "Управо сте променили опсег података" Енд Иф Енд Суб

Горњи код проверава да ли ћелија/опсег у коме сте унели промене има неке ћелије заједничке за опсег података. Ако јесте, приказује оквир за поруку.

Избор радне свеске Измени догађај

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

Код испод би поново израчунао лист чим промените избор.

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

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

Нешто као што је приказано испод:

Следећи код то може учинити:

Привате Суб Ворксхеет_СелецтионЦханге (БиВал Таргет Ас Ранге) Целлс.Интериор.ЦолорИндек = клНоне Витх АцтивеЦелл .ЕнтиреРов.Интериор.Цолор = РГБ (248, 203, 173) .ЕнтиреЦолумн.Интериор.Цолор = РГБ (180, 198, 231) Заврши са Енд Суб

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

И то је проблем са овим кодом. Да уклања боју са свих ћелија.

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

ДоублеЦлицк догађај радне свеске

Ово је један од мојих омиљених догађаја на радном листу и видећете много водича у којима сам ово користио (попут овог или овог).

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

Дозволите ми да вам покажем како је ово сјајно.

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

Привате Суб Ворксхеет_БефореДоублеЦлицк (БиВал Таргет Ас Ранге, Цанцел Ас Боолеан) Цанцел = Труе Витх Таргет .Интериор.Цолор = вбБлуе .Фонт.Цолор = вбВхите .Фонт.Болд = Труе Енд Витх Енд Суб

Ово може бити корисно када пролазите кроз листу ћелија и желите да истакнете неколико одабраних. Иако можете да употребите тастер Ф4 да поновите последњи корак, он ће моћи да примени само једну врсту обликовања. Са овим догађајем двоструког клика, можете применити сва три само двоструким кликом.

Имајте на уму да сам у горњем коду направио вредност Цанцел = Труе.

Ово се ради тако да је подразумевана радња двоструког клика онемогућена - а то је да уђете у режим уређивања. Са Цанцел = Труе, Екцел вас неће довести у режим за уређивање када двапут кликнете на ћелију.

Ево још једног примера.

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

Нешто као што је приказано испод:

Ево кода који ће то учинити:

Привате Суб Ворксхеет_БефореДоублеЦлицк (БиВал Таргет Ас Ранге, Цанцел Ас Боолеан) Цанцел = Труе ЦуррФормат = Таргет.Фонт.Стрикетхроугх Иф ЦуррФормат Тхен Таргет.Фонт.Стрикетхроугх = Фалсе Елсе Таргет.Фонт.Стрикетхроугх = Труе Енд Иф Енд Суб

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

Екцел ВБА временски догађај

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

Догађај ОнТиме се разликује од других догађаја јер се може сачувати у обичном ВБА модулу (док су остали требали бити смештени у кодни прозор објеката као што су ТхисВоркбоок или Ворксхеетс или УсерФормс).

У оквиру редовног ВБА модула користи се као метода апликационог објекта.

Разлог зашто се ово сматра догађајем је тај што се може покренути на основу времена које наведете. На пример, ако желим да се лист поново израчунава сваких 5 минута, за то могу да употребим догађај ОнТиме.

Или, ако желим да прикажем поруку/подсетник у одређено доба дана, могу да користим догађај ОнТиме.

Испод је код који ће сваког дана у 14 сати приказивати поруку.

Суб МессагеТиме () Апплицатион.ОнТиме ТимеВалуе ("14:00:00"), "СховМессаге" Заврши суб Суб СховМессаге () МсгБок "Време је за ручак" Енд Суб

Запамтите да морате да поставите овај код у обичан ВБА модул,

Такође, иако би се догађај ОнТиме покренуо у одређено време, морате да покренете макро ручно у било ком тренутку. Када покренете макро, он ће сачекати 14:00, а затим позвати макро „СховМессаге“.

Макро СховМессаге би тада приказао поруку.

Догађај ОнТиме има четири аргумента:

Апплицатион.ОнТиме (ЕарлиестТиме, Процедура, ЛатестТиме, Распоред)

  • Најраније време: Време када желите да покренете процедуру.
  • Процедура: Назив процедуре коју треба покренути.
  • ЛатестТиме (опционално): У случају да је покренут други код, а наведени код не може да се покрене у наведено време, можете навести Најновије време на које би требало да чека. На пример, то може бити ЕарлиестТиме + 45 (што значи да ће чекати 45 секунди да се друга процедура заврши). Ако ни након 45 секунди процедура не може да се покрене, напушта се. Ако ово не наведете, Екцел би сачекао да се код може покренути, а затим га покренуо.
  • Распоред (опционално): Ако је постављено на Тачно, заказује нову временску процедуру. Ако је Фалсе, тада се поништава претходно подешена процедура. Подразумевано, ово је Тачно.

У горњем примеру смо користили само прва два аргумента.

Погледајмо још један пример.

Код испод би освежавао радни лист сваких 5 минута.

Затамни НектРефресх као датум Суб РефресхСхеет () ТхисВоркбоок.Ворксхеетс ("Схеет1"). Цалцулате НектРефресх = Нов + ТимеВалуе ("00:05:00") Апплицатион.ОнТиме НектРефресх, "РефресхСхеет" Енд Суб Суб СтопРефресх () Он Еррор Ресуме Нект Апплицатион.ОнТиме НектРефресх, "РефресхСхеет",, Фалсе Енд Суб

Горњи код би освежавао радни лист сваких 5 минута.

Он користи функцију Нов за одређивање тренутног времена, а затим додаје 5 минута тренутном времену.

Догађај ОнТиме би се наставио изводити све док га не зауставите. Ако затворите радну свеску и Екцел апликација још увек ради (друге радне свеске су отворене), радна свеска у којој је покренут догађај ОнТиме би се поново отворила.

Ово се боље решава тако што ћете посебно зауставити догађај ОнТиме.

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

Привате Суб Воркбоок_БефореЦлосе (Цанцел Ас Боолеан) Цалл СтопРефресх Енд Суб

Горњи код догађаја „БефореЦлосе“ иде у прозор кода ТхисВоркбоок.

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

Када радите са програмом Екцел, он непрестано прати притиске тастера које користите. Ово нам омогућава да притиснемо тастере као окидач за догађај.

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

Баш као и ОнТиме догађај, морате имати начин да откажете ОнКеи догађај. Такође, када поставите догађај ОнКеи за одређени притисак на тастер, он постаје доступан у свим отвореним радним свескама.

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

КЕИ ЦОДЕ
Бацкспаце {БАЦКСПАЦЕ} или {БС}
Пауза {ПАУЗА}
Тастер за велика слова {ТАСТЕР ЗА ВЕЛИКА СЛОВА}
Избриши {ДЕЛЕТЕ} или {ДЕЛ}
Стрелица надоле {ДОВН}
Крај {КРАЈ}
Ентер ~
Ентер (на нумеричкој тастатури) {ЕНТЕР}
Есцапе {ЕСЦАПЕ} или {ЕСЦ}
Кућа {КУЋА}
Инс {ИНСЕРТ}
Лева стрелица {ЛЕФТ}
Тастер за закључавање бројчане тастатуре {ТАСТЕР ЗА ЗАКЉУЧАВАЊЕ БРОЈЧАНЕ ТАСТАТУРЕ}
Страна доле {ПГДН}
Страна горе {ПГУП}
Стрелица удесно {ЈЕЛ ТАКО}
Сцролл Лоцк {СЦРОЛЛОЦК}
Таб {ТАБ}
Горе стрелица {УП}
Ф1 до Ф15 {Ф1} до {Ф15}

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

Горња табела садржи кодове за појединачне притиске тастера.

Такође их можете комбиновати са следећим кодовима:

  • Смена: + (Знак плус)
  • Контрола: ^ (Царет)
  • Алт: % (Проценат)

На пример, за Алт Ф4 морате да користите код: „%{Ф4}” - где је % за тастер АЛТ и {Ф4} је за тастер Ф4.

Хајде сада да погледамо пример (запамтите да се код за ОнКеи догађаје налази у редовном ВБА модулу).

Када притиснете тастер ПагеУп или ПагеДовн, он прескаче 29 редова изнад/испод активне ћелије (барем то ради на мом лаптопу).

Ако желите да прескочи само 5 редова одједном, можете користити доњи код:

Под ПагеУпДОвнКеис () Апплицатион.ОнКеи "{ПгУп}", "ПагеУпМод" Апплицатион.ОнКеи "{ПгДн}", "ПагеДовнМод" Заврши помоћну подстраницу ПагеУпМод () Укључено Грешка Настави Следећи АцтивеЦелл.Оффсет (-5, 0). Активирај крај Суб Суб ПагеДовнМод () Он Еррор Ресуме Нект АцтивеЦелл.Оффсет (5, 0) .Активирајте Енд Суб

Када покренете први део кода, он ће покренути ОнКеи догађаје. Када се ово изврши, коришћење ПагеУп -а и ПагеДовн тастера учиниће да курсор скочи само по 5 редова одједном.

Имајте на уму да смо користили „Следећи наставак грешке“ како бисмо били сигурни да се грешке занемарују. До ових грешака може доћи ако притиснете тастер ПагеУп чак и када сте на врху радног листа. Пошто нема више редова за прескакање, код би показао грешку. Али пошто смо користили „Следећи наставак грешке“, то ће се занемарити.

Да бисте били сигурни да су ови догађаји ОнКеи доступни, морате покренути први део кода. У случају да желите да ово буде доступно чим отворите радну свеску, можете је поставити у прозор кода ТхисВоркбоок.

Привате Суб Воркбоок_Опен () Апплицатион.ОнКеи "{ПгУп}", "ПагеУпМод" Апплицатион.ОнКеи "{ПгДн}", "ПагеДовнМод" Енд Суб

Код испод враћа кључеве на њихову нормалну функционалност.

Суб Цанцел_ПагеУпДовнКеисМод () Апплицатион.ОнКеи "{ПгУп}" Апплицатион.ОнКеи "{ПгДн}" Енд Суб

Када не наведете други аргумент у методи ОнКеи, притисак на тастер ће се вратити у редовну функционалност.

У случају да желите отказати функционалност притиска на тастер, тако да Екцел не ради ништа када се тај притисак притисне, морате да користите празан низ као други аргумент.

У доњем коду Екцел не би учинио ништа када користимо тастере ПагеУп или ПагеДовн.

Суб Игноре_ПагеУпДовнКеис () Апплицатион.ОнКеи "{ПгУп}", "" Апплицатион.ОнКеи "{ПгДн}", "" Заврши под

Онемогућавање догађаја у ВБА

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

На пример, претпоставимо да имам опсег (А1: Д10) и желим да прикажем поруку кад год се ћелија промени у овом опсегу. Зато показујем оквир за поруку и питам корисника да ли је сигуран да жели да промени. Ако је одговор да, промена се врши, а ако је одговор не, ВБА би то поништио.

Можете користити доњи код:

Привате Суб Ворксхеет_Цханге (БиВал Таргет Ас Ранге) Иф Таргет.Ров <= 10 Анд Таргет.Цолумн <= 4 Затим Анс = МсгБок ("Уносите промене у ћелије у А1: Д10. Јесте ли сигурни да то желите?", вбДаНе) Енд Иф Иф Иф Анс = вбНо Тхен Апплицатион.Ондо Енд Енд Енд Енд Суб

Проблем са овим кодом је то што када корисник изабере Не у оквиру за поруку, радња се обрће (као што сам користио Апплицатион.Ундо).

Када се поништи и вредност се врати на оригиналну, поново се покреће ВБА догађај промене, а кориснику се поново приказује исти оквир за поруку.

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

Да бисте избегли такве случајеве, морате онемогућити догађаје тако да се догађај промене (или било који други догађај) не покрене.

Следећи код би добро функционисао у овом случају:

Привате Суб Ворксхеет_Цханге (БиВал Таргет Ас Ранге) Иф Таргет.Ров <= 10 Анд Таргет.Цолумн <= 4 Затим Анс = МсгБок ("Уносите промене у ћелије у А1: Д10. Јесте ли сигурни да то желите?", вбИесНо) Енд Иф Иф Иф Анс = вбНо Тхен Апплицатион.ЕнаблеЕвентс = Фалсе Апплицатион.Ундо Апплицатион.ЕнаблеЕвентс = Труе Енд Иф Енд Суб

У горњем коду, тачно изнад линије Апплицатион.Ундо, користили смо - Апплицатион.ЕнаблеЕвентс = Фалсе.

Постављање ЕнаблеЕвентс на Фалсе не би покренуло ниједан догађај (у тренутној или било којој отвореној радној свесци).

Када завршимо операцију поништавања, можемо вратити својство ЕнаблеЕвентс на Труе.

Имајте на уму да онемогућавање догађаја утиче на све радне свеске које су тренутно отворене (или отворене док је ЕнаблеЕвентс постављено на Нетачно). На пример, као део кода, ако отворите нову радну свеску, догађај Отворена радна свеска неће радити.

Утицај догађаја Ундо Стацк

Прво ћу вам рећи шта је Ундо Стацк.

Када радите у програму Екцел, он непрестано прати ваше радње. Када направите грешку, увек можете да користите комбинацију тастера Цонтрол + З да бисте се вратили на претходни корак (тј. Поништили тренутну радњу).

Ако двапут притиснете Цонтрол + З, вратићете се два корака уназад. Ови кораци које сте извршили се чувају као део стека за поништавање.

Сваки догађај који промени радни лист уништава овај стог за поништавање.То значи да ако сам урадио 5 ствари пре него што сам покренуо догађај, нећу моћи да користим Цонтрол + З за повратак на претходне кораке. Покретање догађаја уништило је тај хрпу за мене.

У доњем коду користим ВБА за унос временске ознаке у ћелију А1 кад год дође до промене на радном листу.

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

Пошто уносим измене у радни лист, ово ће уништити стопу за поништавање.

Такође имајте на уму да ово није ограничено само на догађаје.

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

На пример, доњи код једноставно унесите текст „Здраво“ у ћелију А1, али чак и покретање овога уништило би стенд за поништавање.

ПодтипХелло () Опсег ("А1"). Вредност = "Здраво" Крај подв

Можда ће вам се допасти и следећи Екцел ВБА водичи:

  • Рад са ћелијама и опсезима у Екцел ВБА.
  • Рад са радним листовима у програму Екцел ВБА.
  • Рад са радним свескама у Екцел ВБА.
  • Екцел ВБА петље - Ултимативни водич.
  • Коришћење ИФ Затим Елсе Статмент у Екцел ВБА.
  • За следећу петљу у програму Екцел.
  • Креирање кориснички дефинисаних функција у програму Екцел ВБА.
  • Како креирати и користити додатке у програму Екцел.
  • Креирајте и поново користите макрое чувањем у радној свесци личних макроа.

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

wave wave wave wave wave