„VBA DoEvents“

Turinys

VBA „DoEvents“ funkcija laikinai pristabdo veikiančią makrokomandą, suteikdama „Excel“ galimybę apdoroti klavišų paspaudimus, pelės paspaudimus ir kitus operacinės sistemos pranešimus.

Ilgai veikiančiose makrokomandose „Excel“ gali pakabinti ir nereaguoti, o makrokomandos gali būti neįmanoma nutraukti. Jei „DoEvents“ yra įtrauktas į jūsų kodą, vartotojai gali būti tikri, kad makrokomanda vis dar veikia, ir prireikus vis tiek gali nutraukti vykdymą.

VBA DoEvents pavyzdys

Apsvarstykite šį kodą:

1234567891011 Viešas papildomas testas ()Tamsiai ilgasJei i = nuo 1 iki 20 000Diapazonas („A1“). Vertė = iKitas I.Pabaiga Sub

Išbandę šį kodą pastebėsite, kad su „Excel“ langu negalima sąveikauti. Tačiau, kadangi tai nėra labai reiklus procesoriui, makrokomandą vis tiek galima nutraukti paspaudus ESC arba CTRL+BREAK.

Jei šioje ciklo dalyje būtų atliekama daug sudėtingų ir sudėtingų funkcijų, „Excel“ užregistruotų pagrindinį paspaudimo įvykį ilgiau - iki kelių minučių arba galbūt visai ne, ypač jei kompiuteris vienu metu vykdo kitas programas.

Dabar pridėkite vieną eilutę su „DoEvents“ po diapazono priskyrimu:

123 Diapazonas („A1“). Vertė = i„DoEvents“

Jei paleisite šį kodą dar kartą, pamatysite, kad „Excel“ dabar reaguoja - jį galima sutelkti ir iškelti į pirmąjį planą. „DoEvents“ iškviečiamas kiekvieną kartą per ciklą, kuris užtikrina, kad makrokomanda visada vykdoma, kad „Excel“ galėtų apdoroti visus jai siunčiamus pranešimus. Kadangi ši makrokomanda veikia greitai, atrodo, kad ji veikia fone (nors taip nėra) - daugiau operacijų ciklo viduje greitai atskleistų tą iliuziją.

„DoEvents“ pavojai

Tačiau pažvelk antrą kartą. Daugiau nei tiesiog leisti „Excel“ sutelkti dėmesį, iš tikrųjų galite spustelėti langelius ir net perjungti skirtukus, kol veikia makrokomanda (pabandykite - pamatysite juokingą elgesį). Tai rodo vieną iš „DoEvents“ pavojų - tai gali būti nenumatytų pasekmių priežastis, jei jūsų makrokomanda nebus kruopščiai užkoduota.

Kitas pavojus yra tas, kad „DoEvents“ gali būti langas kitoms makrokomandoms paleisti. Pabandykite tai: įdėkite „ActiveX CommandButton“ į darbalapį, dukart spustelėkite jį ir įveskite šį kodą „CommandButton1_Click ()“ įvykio viduje:

1234567 Dim c As DiapazonasKiekvienam diapazono c diapazonui („B3: E8“)c. vertė = c. vertė + 1Kitas c

Išjunkite „Excel“ dizaino režimą, tada paleiskite anksčiau pridėtą bandymo () makrokomandą. Kol veikia bandomoji makrokomanda, galite spustelėti darbalapio mygtuką „CommandButton“, o su ja susijusi makrokomanda bus paleista, kai tik „DoEvents“ suteiks „Testo“ () makrokomandai pertrauką.

Pavojus kyla tada, jei „CommandButton“ makrokomanda pakeitė duomenis, su kuriais makrokomanda „Test“ () dirbo, arba vėl suaktyvino makrokomandą „Test ()“. Jei nesate atsargus, galite gauti labai nepatogių rezultatų.

Galiausiai turėtumėte žinoti, kad „DoEvents“ iškviečiant jūsų makrokomandą bus paveiktas našumas. Ciklo viduje šis poveikis greitai padidės, nebent apribosite „DoEvents“ iškvietimo dažnumą. Remdamiesi mūsų „Test“ () pavyzdžiu, pabandykite tai:

1 Jei i Mod 1000 = 0, tada „DoEvents“

Tai akivaizdžiai sumažina „Excel“ reakciją, tačiau poveikis našumui bus sumažintas.

Kada naudoti „DoEvents“

Nepaisant šių pavojų, „DoEvents“ yra patogi funkcija, padedanti išbandyti ir derinti. Apsvarstykite galimybę pridėti „DoEvents“ prie ilgai veikiančių kilpų.

Kita priežastis įtraukti „DoEvents“ yra leisti naudotojų atsiliepimus. Pavyzdžiui, makrokomanda gali atnaujinti „UserForm“ etiketes su pažangos rodikliais. Be „DoEvents“ „Excel“ gali nesulaukti pranešimų, skirtų „UserForm“ perdažyti, todėl vartotojui susidaro įspūdis, kad makrokomanda nustojo veikti - ypač jei perjungiate į kitą programą ir bandote grįžti prie „Excel“. Tačiau naudojant „DoEvents“ „UserForm“ ir toliau bus perdažytas, o makrokomandos eigos atnaujinimai ir toliau bus rodomi.

Daugeliu atvejų „DoEvents“ nėra kažkas, ko norėtumėte įtraukti į savo kodą, ir dažnai gali būti praleistas. Jei jūsų makrokomandai reikia reagavimo, neskaičiuokite!

Padėsite svetainės plėtrą, dalintis puslapį su draugais

wave wave wave wave wave