A VBA DoEvents függvény ideiglenesen leállítja a futó makrót, így az Excel lehetőséget kap a billentyűk lenyomására, az egérkattintásokra és más operációs rendszer üzenetekre.
Hosszú ideig futó makrók esetén az Excel lefagyhat, és nem reagál, és a makrót lehetetlen megszakítani. Ha a DoEvents szerepel a kódban, a felhasználók biztosak lehetnek abban, hogy a makró továbbra is fut, és szükség esetén megszakíthatják a végrehajtást.
VBA DoEvents példa
Vegye figyelembe a következő kódot:
1234567891011 | Nyilvános alvizsgálat ()Dim i As LongI = 1 és 20000 közöttTartomány („A1”). Érték = iKövetkező iEnd Sub |
Amikor megpróbálja ezt a kódot, észre fogja venni, hogy az Excel ablak nem használható. Mivel azonban nem túl igényes a processzorra, a makrót továbbra is meg lehet szakítani az ESC vagy a CTRL+BREAK megnyomásával.
Ha sok bonyolult és igényes funkciót hajtanak végre ezen a cikluson belül, az Excelnek hosszabb ideig tartana egy kulcsnyomás esemény regisztrálása - akár néhány percig, vagy egyáltalán nem, különösen akkor, ha a számítógép más programokat is futtat egyszerre.
Most adjon hozzá egyetlen sort a DoEvents programmal a Tartomány hozzárendelés alatt:
123 | Tartomány ("A1"). Érték = iDoEvents |
Ha újra futtatja ezt a kódot, látni fogja, hogy az Excel most reszponzív - fókuszálható és előtérbe állítható. A DoEvents minden alkalommal meghívásra kerül a cikluson keresztül, amely biztosítja, hogy a makró mindig végrehajtást nyújtson, így az Excel képes feldolgozni a hozzá küldött üzeneteket. Mivel ez a makró gyorsan fut, szinte úgy tűnik, mintha a háttérben futna (bár nem) - a cikluson belüli további műveletek gyorsan felfednék ezt az illúziót.
DoEvents Veszélyek
Vessen azonban egy második pillantást. Több, mint az Excel fókuszálásának engedélyezése, valójában kattinthat a cellákon belül, és akár lapokat is válthat a makró futása közben (próbálja ki - vicces viselkedést fog látni). Ez megmutatja a DoEvents egyik veszélyét - nem kívánt következményeket okozhat, ha a makróját nem gondosan kódolják.
További veszély, hogy a DoEvents ablakként szolgálhat más makrók futtatásához. Próbálja ki ezt: tegyen egy ActiveX CommandButton gombot a munkalapra, kattintson rá duplán, és adja hozzá a következő kódot a CommandButton1_Click () eseményhez:
1234567 | Dim c Mint tartományMinden c tartományban ("B3: E8")c.Érték = c.Érték + 1Következő c |
Kapcsolja ki a Tervezési módot az Excelben, majd futtassa a korábban hozzáadott Teszt () makrót. Amíg a teszt makró fut, rákattinthat a CommandButton a munkalapon, és a hozzá tartozó makró futni fog, amint a DoEvents szünetet ad a Test () makrónak.
A veszély itt az, ha a CommandButton makró megváltoztatta a Test () makró adatait, vagy újra elindította a Test () makrót. Rendkívül rendetlen eredményeket érhet el, ha nem vigyáz.
Végezetül tisztában kell lennie azzal, hogy a DoEvents hatására a makró teljesítménye hatással lesz a hívásra. A cikluson belül ez a hatás gyorsan összeadódik, hacsak nem korlátozza a DoEvents hívási gyakoriságát. A Test () példánkra hivatkozva próbálja meg ezt:
1 | Ha i Mod 1000 = 0, akkor a DoEvents |
Ez láthatóan csökkenti az Excel reagálóképességét, de a teljesítményre gyakorolt hatás csökken.
Mikor kell használni a DoEvents alkalmazást
E veszélyek ellenére a DoEvents egy praktikus funkció, amely segíti a tesztelést és a hibakeresést. Fontolja meg a DoEvents hozzáadását a hosszú ideig futó hurkokhoz.
A DoEvents szerepeltetésének másik oka a felhasználói visszajelzések engedélyezése. Például egy makró frissítheti a UserForm címkéit a folyamatjelzőkkel. DoEvents nélkül előfordulhat, hogy az Excel nem fogadja a UserForm újrafestésére szolgáló üzeneteket, és azt a benyomást kelti a felhasználóban, hogy a makró leállt - különösen akkor, ha másik programra vált, majd megpróbál visszatérni az Excel programra. A DoEvents használatával azonban a UserForm továbbra is újrafestésre kerül, és a makró előrehaladásának frissítései továbbra is megjelennek.
A DoEvents többnyire nem olyan dolog, amelyet sokat szeretne belefoglalni a kódba, és gyakran kihagyható. Ha azonban a reagálásra szüksége van a makrójának, ne számítsa ki!