VBA DoEvents

Sisällysluettelo

VBA DoEvents toiminto keskeyttää väliaikaisesti käynnissä olevan makron, jolloin Excel voi käsitellä näppäinten painalluksia, hiiren napsautuksia ja muita käyttöjärjestelmän viestejä.

Pitkäkestoisissa makroissa Excel voi näyttää jumittuvan ja reagoivan, eikä makroa voi olla mahdotonta keskeyttää. Jos DoEvents sisältyy koodiin, käyttäjät voivat olla varmoja, että makro on edelleen käynnissä, ja voivat silti keskeyttää suorituksen tarvittaessa.

VBA DoEvents Esimerkki

Harkitse seuraavaa koodia:

1234567891011 Julkinen alitesti ()Dim niin kauanI = 1 - 20 000Alue ("A1"). Arvo = iSeuraavaksi minäEnd Sub

Kun yrität tätä koodia, huomaat, että Excel -ikkunaa ei voi käyttää. Koska makro ei kuitenkaan ole kovin vaativa prosessorille, makro voidaan silti keskeyttää painamalla ESC- tai CTRL+BREAK -näppäintä.

Jos tämän silmukan sisällä suoritettaisiin kuitenkin paljon monimutkaisia ​​ja vaativia toimintoja, Excelin näppäilytapahtuman rekisteröinti kestää kauemmin - jopa useita minuutteja tai mahdollisesti ei ollenkaan, varsinkin jos tietokoneessa on muita ohjelmia samanaikaisesti.

Lisää nyt yksi rivi DoEventsin kanssa aluealue -tehtävän alle:

123 Alue ("A1"). Arvo = iDoEvents

Jos suoritat tämän koodin uudelleen, huomaat, että Excel on nyt responsiivinen - se voidaan keskittyä ja tuoda etualalle. DoEvents kutsutaan joka kerta silmukan läpi, mikä varmistaa, että makro suorittaa aina suorituksen, jotta Excel voi käsitellä sille lähetetyt viestit. Koska tämä makro toimii nopeasti, näyttää melkein siltä, ​​että se toimii taustalla (vaikka ei olekaan) - silmukan sisällä tapahtuvat toiminnot paljastavat tämän illuusion nopeasti.

DoEvents vaarat

Katsokaa kuitenkin toinen kerta. Enemmän kuin vain Excelin keskittämisen salliminen, voit itse napsauttaa solujen sisällä ja jopa vaihtaa välilehtiä, kun makro on käynnissä (kokeile sitä - näet hauskan käyttäytymisen). Tämä osoittaa yhden DoEventsin vaaroista - se voi aiheuttaa tahattomia seurauksia, jos makroasi ei koodata huolellisesti.

Toinen vaara on, että DoEvents voi toimia ikkunana muille makroille. Kokeile tätä: aseta ActiveX-komentopainike laskentataulukkoon, kaksoisnapsauta sitä ja lisää seuraava koodi CommandButton1_Click () -tapahtumaan:

1234567 Dim c Kuten alueJokaista c alueella ("B3: E8")c. arvo = c. arvo + 1Seuraava c

Poista suunnittelutila käytöstä Excelissä ja suorita aiemmin lisäämäsi Test () -makro. Kun testimakro on käynnissä, voit napsauttaa laskentataulukon Komento -painiketta, ja siihen liittyvä makro suoritetaan heti, kun DoEvents antaa Test () -makrolle tauon.

Vaara on tässä, jos CommandButton -makro muutti tietoja, joilla Test () -makro työskenteli, tai laukaisi Test () -makron uudelleen. Voit saada erittäin sotkuisia tuloksia, jos et ole varovainen.

Lopuksi sinun tulee olla tietoinen siitä, että DoEvents saa makron kärsimään suorituskyvystä, kun sitä kutsutaan. Silmukan sisällä tämä vaikutus kasvaa nopeasti, ellet rajoita DoEvents -kutsumistiheyttä. Viitaten esimerkkiimme Test (), kokeile tätä:

1 Jos i Mod 1000 = 0 niin DoEvents

Tämä vähentää näkyvästi Excelin reagointikykyä, mutta suorituskykyvaikutus pienenee.

Milloin DoEventsiä käytetään?

Näistä vaaroista huolimatta DoEvents on kätevä toiminto, joka auttaa testauksessa ja virheenkorjauksessa. Harkitse DoEventsin lisäämistä pitkäkestoisiin silmukoihin.

Toinen syy sisällyttää DoEvents on sallia käyttäjien palaute. Esimerkiksi makro saattaa päivittää UserFormin tarrat edistymisilmaisimilla. Ilman DoEvents -ohjelmaa Excel ei ehkä vastaanota viestejä UserFormin maalaamiseksi uudelleen, jolloin käyttäjä saa vaikutelman, että makro on lakannut toimimasta - varsinkin jos vaihdat toiseen ohjelmaan ja yrität sitten vaihtaa takaisin Exceliin. DoEventsin avulla UserFormia maalataan kuitenkin edelleen ja päivitykset makron edistymiseen näkyvät edelleen.

Useimmiten DoEvents ei ole asia, jonka haluat sisällyttää paljon koodiin, ja se voidaan usein jättää pois. Jos makro tarvitsee kuitenkin reagointikykyä, älä laske sitä!

Tulet auttaa kehittämään sivuston jakaminen sivu ystävillesi

wave wave wave wave wave