Įvykiai vyksta nuolat, kai vartotojas atidaro „Excel“ darbaknygę ir pradeda daryti įvairius veiksmus, pvz., Įvesti duomenis į langelius arba pereiti iš vieno lapo į kitą.
„Visual Basic“ redaktoriuje (ALT+F11) jau yra nustatytos papildomos procedūros, kurios gali būti išjungtos, kai vartotojas kažką daro, pvz. duomenų įvedimas į langelį. Antrinė rutina nepateikia jokio veiksmo kodo, tik „sub“ ir „end sub“ teiginius, tarp kurių nėra kodo. Jie veiksmingai neveikia, todėl nieko neįvyks, kol neįvesite kodo.
Štai pavyzdys, pagrįstas darbalapio įvykiu „Keisti“:
Kaip VBA programuotojas, galite pridėti kodą, kad kai kurie dalykai įvyktų, kai vartotojas atlieka konkretų veiksmą. Tai suteikia jums galimybę kontroliuoti naudotoją ir neleisti jam atlikti veiksmų, kurių nenorite, kad jie darytų ir kurie galėtų sugadinti jūsų darbaknygę. Pavyzdžiui, galite norėti, kad jie išsaugotų savo individualią darbaknygės kopiją kitu pavadinimu, kad jie nepaveiktų originalo, kurį gali naudoti daugelis vartotojų.
Jei jie uždarys darbaknygę, jie bus automatiškai paraginti išsaugoti pakeitimus. Tačiau darbaknygėje yra įvykis „BeforeClose“ ir galite įvesti kodą, kad neleistumėte uždaryti darbo knygos ir neįjungti įvykio „Išsaugoti“. Tada galite pridėti mygtuką prie paties darbalapio ir į jį įtraukti savo „Išsaugoti“ tvarką. Taip pat galite išjungti „Išsaugoti“ tvarką naudodami įvykį „BeforeSave“
Supratimas apie tai, kaip vyksta renginiai, yra būtinas VBA programuotojui.
Įvykių tipai
Darbo knyga Įvykiai - šie įvykiai išjungiami atsižvelgiant į tai, ką vartotojas daro su pačia darbo knyga. Tai apima vartotojo veiksmus, tokius kaip darbaknygės atidarymas, darbo knygos uždarymas, darbaknygės išsaugojimas, lapo pridėjimas arba ištrynimas
Užduoties įvykiai - šiuos įvykius įjungia vartotojas, atlikdamas veiksmus konkrečiame darbalapyje. Kiekvienas darbaknygės darbalapis turi atskirą kodo modulį, kuriame yra įvairių įvykių, skirtų būtent šiam darbalapiui (ne visiems darbalapiams). Tai apima vartotojo veiksmus, tokius kaip langelio turinio keitimas, dukart spustelėjus langelį arba dešiniuoju pelės mygtuku spustelėjus langelį.
„Active X Control“ įvykiai - „Active X“ valdiklius galima pridėti prie darbalapio naudojant „Įterpti“ piktogramą „Excel“ juostos skirtuke „Kūrėjas“. Tai dažnai yra mygtukų valdikliai, leidžiantys vartotojui atlikti įvairius veiksmus kontroliuojant jūsų kodą, tačiau jie taip pat gali būti objektai, tokie kaip išskleidžiamasis meniu. Naudojant „Active X“ valdiklius, o ne formos valdiklius darbalapyje, galima plačiai programuoti. „Active X“ valdikliai suteikia daug daugiau lankstumo programavimo požiūriu, nei naudojant formos valdiklius darbalapyje.
Pavyzdžiui, jūsų darbalapyje gali būti du išskleidžiamieji valdikliai. Norite, kad antrame išskleidžiamajame meniu esantis sąrašas būtų pagrįstas tuo, ką vartotojas pasirinko pirmame išskleidžiamajame meniu. Naudodami įvykį „Keisti“ pirmame išskleidžiamajame meniu, galite sukurti kodą, kad galėtumėte perskaityti, ką vartotojas pasirinko, ir tada atnaujinti antrąjį išskleidžiamąjį meniu. Taip pat galite išjungti antrąjį išskleidžiamąjį meniu, kol vartotojas pasirinks pirmąjį išskleidžiamąjį meniu
„UserForm“ įvykiai - Galite įterpti ir sukurti profesionaliai atrodančią formą, kuri būtų naudojama kaip iššokantis langas. Visi valdikliai, kuriuos įdedate į formą, yra „Active X“ valdikliai ir turi tuos pačius įvykius kaip „Active X“ valdikliai, kuriuos galite įdėti į darbalapį
Įvykių diagrama - Šie įvykiai yra susiję tik su diagramos lapu, o ne su diagrama, rodoma kaip darbalapio dalis. Šie įvykiai apima diagramos dydžio keitimą arba diagramos pasirinkimą.
Taikymo įvykiai - Jie naudoja programos objektą VBA. Pavyzdžiai leistų kodą išjungti, kai paspaudžiamas tam tikras klavišas arba kai pasiekiamas tam tikras laikas. Galite užprogramuoti situaciją, kai darbaknygė paliekama atvira visą parą ir ji importuoja duomenis iš išorinio šaltinio per naktį iš anksto nustatytu laiku.
Pavojai naudojant kodą renginiuose
Kai vartotojas atlieka tam tikrą veiksmą, kai rašote kodą, kad galėtumėte ką nors padaryti, turite nepamiršti, kad jūsų kodas gali sukelti kitus įvykius, dėl kurių jūsų kodas gali būti įtrauktas į nepertraukiamą ciklą.
Pvz., Tarkime, kad darbalapyje naudojate įvykį „Keisti“, kad vartotojui įvedus reikšmę į langelį, tuo langeliu pagrįstas skaičiavimas būtų dedamas į langelį, esantį dešinėje jo pusėje.
Problema ta, kad apskaičiuotos vertės įdėjimas į langelį suaktyvina kitą įvykį „Keisti“, kuris savo ruožtu suaktyvina dar vieną įvykį „Keisti“ ir taip toliau, kol jūsų kode nebelieka naudojamų stulpelių ir klaidos pranešimas.
Rašydami įvykio kodą turite gerai pagalvoti, kad kiti įvykiai nebūtų netyčia suaktyvinti
Išjungti įvykius
Norėdami išspręsti šią problemą, galite naudoti kodą, kad išjungtumėte įvykius. Ką turėsite padaryti, tai įtraukti kodą, kad išjungtumėte įvykius, kol jūsų įvykio kodas veikia, ir tada iš naujo įgalinti įvykius kodo pabaigoje. Štai pavyzdys, kaip tai padaryti:
1234 | Sub DisableEvents ()Application.EnableEvents = NetiesaApplication.EnableEvents = TiesaPabaiga Sub |
Turėkite omenyje, kad tai išjungia visus „Excel“ programos įvykius, todėl tai taip pat paveiks kitas „Excel“ funkcijas. Jei tai naudojate dėl kokių nors priežasčių, įsitikinkite, kad vėliau įvykiai vėl įjungiami.
Parametrų svarba renginiuose
Įvykiai paprastai turi parametrus, kuriuos galite naudoti norėdami sužinoti daugiau apie tai, ką daro vartotojas, ir langelio vietą, kurioje jie yra.
Pavyzdžiui, darbalapio keitimo įvykis atrodo taip:
1 | Privatus antrinis darbalapio keitimas („ByVal Target“ kaip diapazonas) |
Naudodami diapazono objektą, galite sužinoti langelio eilutės/stulpelio koordinates, kuriose iš tikrųjų yra vartotojas.
1234 | Privatus antrinis darbalapio keitimas („ByVal Target“ kaip diapazonas)„MsgBox Target“. Stulpelis„MsgBox Target“. EilutėPabaiga Sub |
Jei norite, kad jūsų kodas veiktų tik su tam tikru stulpelio ar eilutės numeriu, pridėkite sąlygą, kuri išeina iš paprogramės, jei stulpelis nėra būtinas.
123 | Privatus antrinis darbalapio keitimas („ByVal Target“ kaip diapazonas)Jei taikinys. 2 stulpelis, tada išeikite iš antrinioPabaiga Sub |
Tai pašalina problemą, kai jūsų kodas suaktyvina kelis įvykius, nes tai veiks tik tuo atveju, jei vartotojas pakeis 2 stulpelio langelį (B stulpelis)
Darbaknygės įvykių pavyzdžiai (neišsamus)
Darbaknygės įvykius rasite „VBE Project Explorer“ objekte „ThisWorkbook“. Pirmame kodo lango išskleidžiamajame meniu turėsite pasirinkti „Darbaknygė“, o tada antrame išskleidžiamajame meniu bus rodomi visi galimi įvykiai
Atviras darbo knygos įvykis
Šis įvykis įjungiamas kiekvieną kartą, kai vartotojas atidaro darbaknygę. Galite jį naudoti norėdami pateikti pasveikinimo pranešimą vartotojui užfiksuodami jo vartotojo vardą
123 | Privati antrinė darbo knyga_Atidaryti ()„MsgBox“ „Sveiki atvykę“ ir „Application.UserName“Pabaiga Sub |
Taip pat galite patikrinti jų naudotojo vardą iš sąrašo, esančio paslėptame lape, kad sužinotumėte, ar jie turi prieigą prie darbo knygos. Jei jie nėra įgaliotas vartotojas, galite parodyti pranešimą ir uždaryti darbaknygę, kad jie negalėtų ja naudotis.
Darbaknygės naujo lapo įvykis
Šis įvykis suaktyvinamas, kai vartotojas prideda naują lapą prie darbaknygės
Galite naudoti šį kodą, kad leistumėte tik pridėti naują lapą, o ne skirtingi vartotojai, kurie pridėtų lapų ir sutvarkytų darbaknygę
1234567 | Privatus antrinis darbaknygės_naujas lapas („ByVal Sh“ kaip objektas)Application.DisplayAlerts = NetiesaJei Application.UserName "Richard" TadaSh.DeletePabaiga JeiApplication.DisplayAlerts = TiesaPabaiga Sub |
Atminkite, kad turite išjungti įspėjimus, nes ištrinus lapą pasirodys vartotojo įspėjimas, kuris leidžia vartotojui apeiti jūsų kodą. Įsitikinkite, kad po to vėl įjungėte įspėjimus!
Pavargote ieškoti VBA kodo pavyzdžių? Išbandykite „AutoMacro“!
Darbo knyga prieš įvykio išsaugojimą
Šis įvykis suaktyvinamas, kai naudotojas spustelėja „Išsaugoti“ piktogramą, bet prieš tai, kai „Išsaugoti“ iš tikrųjų įvyksta
Kaip aprašyta anksčiau, galbūt norėsite neleisti vartotojams išsaugoti pakeitimų pradinėje darbaknygėje ir priversti juos sukurti naują versiją naudojant darbalapio mygtuką. Viskas, ką jums reikia padaryti, tai pakeisti parametrą „Atšaukti“ į „True“, o darbaknygės niekada negalima išsaugoti įprastu metodu.
123 | Privatus antrinis darbaknygė_BeforeSave (ByVal SaveAsUI kaip loginis, atšaukti kaip loginis)Atšaukti = tiesaPabaiga Sub |
Darbo knyga prieš uždarą renginį
Šį įvykį galite naudoti norėdami neleisti vartotojams uždaryti darbaknygės ir vėl priversti juos išeiti per darbalapio mygtuką. Vėlgi, nustatykite parametrą „Atšaukti“ į „Tiesa“. Raudonas X viršutiniame dešiniajame „Excel“ lango kampe nebeveikia.
123 | Privati antrinė darbo knyga_BeforeClose (Atšaukti kaip loginis)Atšaukti = tiesaPabaiga Sub |
Darbo lapo įvykių pavyzdžiai (neišsamus)
Skaičiuoklės įvykiai randami po konkrečiu lapo pavadinimo objektu „VBE Project Explorer“. Pirmame kodo lango išskleidžiamajame meniu turėsite pasirinkti „Darbo lapas“, o tada antrasis išskleidžiamasis meniu parodys visus galimus įvykius
Darbo lapo keitimo įvykis
Šis įvykis suaktyvinamas, kai vartotojas pakeičia darbalapį, pvz., Įveda naują reikšmę į langelį
Šį įvykį galite naudoti norėdami pridėti papildomos vertės ar komentaro šalia pakeisto langelio, tačiau, kaip aptarta anksčiau, nenorite pradėti nustatyti įvykių ciklo.
12345 | Privatus antrinis darbalapio keitimas („ByVal Target“ kaip diapazonas)Jei taikinys. 2 stulpelis, tada išeikite iš antrinioActiveSheet.Cells (Target.Row, Target.Column + 1). Vertė = _ActiveSheet.Cells (Target.Row, Target.Column). Vertė * 1.1Pabaiga Sub |
Šiame pavyzdyje kodas veiks tik tada, jei reikšmė bus įvesta į B stulpelį (2 stulpelis). Jei tai tiesa, tai prie skaičiaus pridės 10% ir įdės į kitą turimą langelį
Darbo lapas prieš dvigubo paspaudimo įvykį
Šis įvykis suaktyvins kodą, jei vartotojas dukart spustelės langelį. Tai gali būti labai naudinga rengiant finansines ataskaitas, pvz., Balansą ar pelno (nuostolio) ataskaitą, kur vadovai gali užginčyti skaičius, ypač jei esmė neigiama!
Tai galite naudoti norėdami atlikti išsamią informaciją, kad, kai vadovas užginčytų tam tikrą skaičių, jiems tereikia dukart spustelėti numerį ir suskirstymas rodomas kaip ataskaitos dalis.
Tai labai įspūdinga naudotojo požiūriu ir leidžia jiems nuolatos klausti „kodėl šis skaičius toks didelis?“.
Turite parašyti kodą, kad sužinotumėte skaičiaus antraštę / kriterijus (naudodami tikslinio objekto ypatybes), tada filtruokite lentelės duomenis ir nukopijuokite juos į ataskaitą.
VBA programavimas | Kodo generatorius jums tinka!
Darbo lapas Aktyvinti įvykį
Šis įvykis įvyksta, kai vartotojas pereina iš vieno lapo į kitą. Tai taikoma naujam lapui, į kurį naudotojas pereina.
Jis galėtų būti naudojamas siekiant užtikrinti, kad naujas lapas būtų visiškai apskaičiuotas prieš vartotojui pradedant ką nors daryti. Jis taip pat gali būti naudojamas tik tam tikram lapui iš naujo apskaičiuoti, neperskaičiuojant visos darbo knygos. Jei darbaknygė yra didelė ir sudėtinga formulė, iš naujo apskaičiuojant vieną lapą sutaupoma daug laiko
123 | Privatus antrinis darbalapis_Aktyvuoti ()ActiveSheet.SkaičiuotiPabaiga Sub |
„Active X Control“ įvykiai (neišsamus)
Kaip aptarta anksčiau, „Active X“ valdiklius galite pridėti tiesiai į darbalapį. Tai gali būti komandų mygtukai, išskleidžiamieji meniu ir sąrašų langeliai
„Active X“ įvykiai randami po konkrečiu lapo pavadinimo objektu (kur pridėjote valdiklį) „VBE Project Explorer“. Pirmame kodo lango išskleidžiamajame meniu turėsite pasirinkti „Active X“ valdiklio pavadinimą, o tada antrasis išskleidžiamasis meniu parodys visus galimus įvykius
Komandos mygtukas Spustelėkite Įvykis
Įdėję komandos mygtuką į skaičiuoklę, norėsite, kad ji atliktų tam tikrus veiksmus. Tai galite padaryti įvesdami kodą „Paspaudimo“ įvykiui.
Galite lengvai įterpti „Ar esate tikras pranešimas?“, Kad prieš paleidžiant kodą būtų atliktas patikrinimas
12345 | Privati antrinė komandaButton1_Click ()„Dim ButtonRet As Variant“ButtonRet = MsgBox ("Ar tikrai norite tai padaryti?", VbQuestion Or vbYesNo)Jei ButtonRet = vbNo, tada išeikite iš antrinioPabaiga Sub |
Išskleidžiamojo (kombinuoto laukelio) pakeitimo įvykis
„Active X“ išskleidžiamajame meniu yra pakeitimo įvykis, todėl, jei vartotojas pasirenka tam tikrą elementą iš išskleidžiamojo sąrašo, galite užfiksuoti savo pasirinkimą naudodami šį įvykį ir tada parašyti kodą, kad atitinkamai pritaikytumėte kitas lapo ar darbaknygės dalis.
123 | Privatus antrinis ComboBox1_Change ()MsgBox "Jūs pasirinkote" & ComboBox1.TextPabaiga Sub |
VBA programavimas | Kodo generatorius jums tinka!
Pažymėkite langelį (žymės langelį) Spustelėkite Įvykis
Galite pridėti varnelę arba žymimąjį langelį prie darbalapio, kad vartotojas galėtų pasirinkti parinktis. Galite naudoti paspaudimo įvykį, kad pamatytumėte, ar vartotojas ką nors pakeitė. Grąžintos vertės yra teisingos arba klaidingos, atsižvelgiant į tai, ar jis buvo pažymėtas, ar ne.
123 | Privatus antrinis laukelis1_Click ()MsgBox CheckBox1.ValuePabaiga Sub |
„UserForm“ įvykiai (neišsamus)
„Excel“ suteikia galimybę kurti savo formas. Tai gali būti labai naudinga naudoti kaip iššokančiuosius langus informacijai rinkti arba vartotojui pateikti kelis pasirinkimus. Jie naudoja „Active X“ valdiklius, kaip aprašyta anksčiau, ir turi tuos pačius įvykius, nors įvykiai labai priklauso nuo valdymo tipo.
Štai paprastos formos pavyzdys:
Kai jis rodomas, tai atrodo ekrane
Naudodami formoje esančius įvykius atliktumėte tokius veiksmus kaip įveskite numatytąjį įmonės pavadinimą atidarę formą, kad patikrintumėte, ar įvestas įmonės pavadinimas sutinka su jau esančiu skaičiuoklėje ir ar jis nebuvo parašytas neteisingai, ir norėdami pridėti kodą prie paspaudimo įvykius mygtukais „Gerai“ ir „Atšaukti“
Formos kodą ir įvykius galima peržiūrėti dukart spustelėjus bet kurioje formos vietoje
Pirmasis išskleidžiamasis meniu suteikia prieigą prie visų formos valdiklių. Antrasis išskleidžiamasis meniu suteiks prieigą prie įvykių
„UserForm“ aktyvinimo įvykis
Šis įvykis suaktyvinamas suaktyvinus formą, paprastai kai ji rodoma. Šis įvykis gali būti naudojamas numatytosioms reikšmėms nustatyti, pvz. numatytasis įmonės pavadinimas įmonės pavadinimo teksto laukelyje
123 | Privatus antrinis naudotojasForm_Activate ()TextBox1.Text = "Mano įmonės pavadinimas"Pabaiga Sub |
VBA programavimas | Kodo generatorius jums tinka!
Keisti įvykį
Dauguma formos valdiklių turi pakeitimo įvykį, tačiau šiame pavyzdyje įmonės pavadinimo teksto laukelyje įvykis gali būti naudojamas norint apriboti įvedamos įmonės pavadinimo ilgį
123456 | Privatus antrinis teksto laukelis1_Keisti ()Jei Len (TextBox1.Text)> 20 Tada„MsgBox“ „Vardas apribotas iki 20 simbolių“, „vbCritical“TextBox1.Text = ""Pabaiga JeiPabaiga Sub |
Spustelėkite Įvykis
Šį įvykį galite naudoti norėdami imtis veiksmų, kai naudotojas spustelėja formos valdiklius ar net pačią formą
Šioje formoje yra mygtukas „Gerai“, o surinkę įmonės pavadinimą norėtume jį įdėti į skaičiuoklės langelį, kad vėliau būtų galima peržiūrėti
1234 | Privati antrinė komandaButton1_Click ()„ActiveSheet.Range“ („A1“). Reikšmė = TextBox1.TextAš.SlėpkPabaiga Sub |
Šis kodas veikia, kai vartotojas spustelėja mygtuką „Gerai“. Įmonės pavadinimo įvesties laukelyje esanti reikšmė įtraukiama į aktyvaus lapo langelį A1, o paslėpta forma, kad vartotojo valdymas būtų grąžintas į darbalapį.
Įvykių diagrama
Diagramos įvykiai veikia tik tose diagramose, kurios yra atskirame diagramos lape, o ne diagramoje, kuri yra įtraukta į standartinį darbalapį
Diagramos įvykiai yra šiek tiek riboti ir negali būti naudojami darbalapyje, kuriame gali būti daug diagramų. Be to, vartotojai nebūtinai nori pereiti iš darbalapio, kuriame yra skaičiai, į diagramos lapą - čia nėra tiesioginio vizualinio poveikio
Naudingiausias įvykis būtų išsiaiškinti diagramos komponentą, kurį naudotojas spustelėjo, pvz. skritulinės diagramos segmentas arba juostos diagramos juosta, tačiau tai nėra įvykis, pasiekiamas standartiniame įvykių diapazone.
Šią problemą galima išspręsti naudojant klasės modulį ir pridedant įvykį „Pelė žemyn“, kuris pateiks išsamią informaciją apie diagramos komponentą, kurį naudotojas spustelėjo. Tai naudojama diagramoje darbalapyje.
Tai apima labai sudėtingą kodavimą, tačiau rezultatai yra įspūdingi. Galite sukurti gręžtuvus, pvz. naudotojas spustelėja skritulinės diagramos segmentą ir akimirksniu ši diagrama paslėpta, o vietoje jos pasirodo antra diagrama, kurioje rodoma pradinio segmento detalių skritulinė diagrama, arba galite pateikti lentelės duomenis, patvirtinančius tą skritulinės diagramos segmentą.
Taikymo įvykiai
Galite naudoti programos objektą VBA, kad išjungtumėte kodą pagal tam tikrą įvykį
VBA programavimas | Kodo generatorius jums tinka!
Taikymas. Laiku
Tai leidžia jums reguliariai išjungti kodo fragmentą tol, kol darbaknygė įkeliama į „Excel“. Galbūt norėsite automatiškai įrašyti savo darbaknygę į kitą aplanką kas 10 minučių arba palikti darbalapį paleisti per naktį, kad gautumėte naujausius duomenis iš išorinio šaltinio.
Šiame pavyzdyje į modulį įvedama papildoma rutina. Tai rodo pranešimų laukelį kas 5 minutes, nors tai gali būti ir kita koduota procedūra. Tuo pačiu metu jis iš naujo nustato laikmatį pagal dabartinį laiką ir dar 5 minutes.
Kiekvieną kartą, kai jis veikia, laikmatis atstatomas, kad būtų paleista ta pati papildoma rutina per dar 5 minutes.
1234 | Antrasis „TestOnTime“ ()„MsgBox“ „Testing OnTime“Application.OnTime (Dabar () + TimeValue ("00:05:00")), "TestOnTime"Pabaiga Sub |
Taikymas. Gerai
Ši funkcija leidžia jums sukurti savo sparčiuosius klavišus. Galite priversti bet kurį klavišų derinį pavadinti savo kūrinio papildoma rutina.
Šiame pavyzdyje raidė „a“ yra peradresuojama taip, kad vietoj „a“ įdėjimo į langelį būtų rodomas pranešimų laukelis. Šį kodą reikia įdėti į įterptą modulį.
123456 | Antrasis testas „KeyPress“ ()Application.OnKey „a“, „TestKeyPress“Pabaiga SubAntrasis testas „KeyPress“ ()„MsgBox“ „Paspaudėte„ a ““Pabaiga Sub |
Pirmiausia vykdote papildomą „TestKeyPress“. Tai reikia paleisti tik vieną kartą. Programoje „Excel“ nurodoma, kad kiekvieną kartą paspaudus raidę „a“ antrinė rutina bus vadinama „TestKeyPress“. Antrinėje „TestKeyPress“ tiesiog rodomas pranešimų langas, kuriame nurodoma, kad paspaudėte klavišą „a“. Žinoma, tai gali įkelti formą arba atlikti įvairius kitus dalykus.
Galite naudoti bet kurį klavišų derinį, kurį galite naudoti su funkcija „SendKeys“
Norėdami atšaukti šią funkciją, paleiskite teiginį „OnKey“ be parametro „Procedūra“.
123 | Sub CancelOnKey ()Application.OnKey "a"Pabaiga Sub |
Dabar viskas vėl normaliai.