VBA DoEvents

Съдържание

VBA DoEvents функцията временно спира на работещ макрос, като дава възможност на Excel да обработва натискането на клавиши, щракванията на мишката и други съобщения на операционната система.

В дългосрочните макроси Excel може да изглежда да виси и да не реагира, а макросът може да бъде невъзможен за прекъсване. Ако DoEvents е включен във вашия код, потребителите могат да бъдат сигурни, че макросът все още работи и могат да прекъснат изпълнението, ако е необходимо.

Пример за VBA DoEvents

Помислете за следния код:

1234567891011 Публичен подтест ()Dim i As LongЗа i = 1 до 20000Обхват (“A1”). Стойност = iСледва iEnd Sub

Когато опитате този код, ще забележите, че с прозореца на Excel не може да се взаимодейства. Въпреки това, тъй като не е много взискателен към процесора, макросът все още може да бъде прекъснат чрез натискане на ESC или CTRL+BREAK.

Ако в този цикъл се изпълняват много сложни и взискателни функции, Excel ще отнеме повече време, за да регистрира събитие при натискане на клавиш - до няколко минути или евентуално изобщо не, особено ако компютърът изпълнява други програми едновременно.

Сега добавете един ред с DoEvents под заданието Range:

123 Диапазон ("A1"). Стойност = iDoEvents

Ако стартирате този код отново, ще видите, че Excel вече е отзивчив - той може да бъде фокусиран и изведен на преден план. DoEvents се извиква всеки път през цикъла, което гарантира, че макросът винаги дава резултат, така че Excel да може да обработва всички съобщения, изпратени до него. Тъй като този макрос работи бързо, почти изглежда, че работи във фонов режим (макар и да не е) - повече операции в цикъла бързо биха разкрили тази илюзия.

DoEvents Опасности

Погледнете обаче все пак. Повече от просто да позволите на Excel да бъде фокусиран, всъщност можете да щракате из клетките и дори да превключвате раздели, докато макросът работи (опитайте - ще видите забавно поведение). Това показва една от опасностите на DoEvents - може да бъде причина за непредвидени последици, ако вашият макрос не е кодиран внимателно.

Друга опасност е, че DoEvents може да служи като прозорец за изпълнението на други макроси. Опитайте това: поставете ActiveX CommandButton в работния лист, щракнете двукратно върху него и добавете следния код в събитието CommandButton1_Click ():

1234567 Dim c като диапазонЗа всеки c в обхвата ("B3: E8")в. стойност = в. стойност + 1Следващ c

Изключете режима на проектиране в Excel, след което стартирайте макроса Test (), който сте добавили по -рано. Докато тестовият макрос се изпълнява, можете да щракнете върху CommandButton на работния лист и свързаният с него макрос ще стартира веднага щом DoEvents даде на макроса Test () почивка.

Опасността тук е, ако макросът CommandButton промени данните, върху които работи макросът Test (), или задейства отново макроса Test (). Можете да получите крайно объркани резултати, ако не внимавате.

И накрая, трябва да сте наясно, че DoEvents ще накара вашия макрос да се отрази на производителността при извикване. Вътре в цикъла това въздействие ще се увеличи бързо, освен ако не ограничите колко често се извикват DoEvents. Позовавайки се на нашия пример Test (), опитайте това:

1 Ако i Mod 1000 = 0, тогава DoEvents

Това видимо намалява отзивчивостта на Excel, но въздействието върху производителността ще бъде намалено.

Кога да използвате DoEvents

Въпреки тези опасности, DoEvents е удобна функция, която помага при тестване и отстраняване на грешки. Помислете за добавяне на DoEvents към продължителни цикли.

Друга причина да включите DoEvents е да се даде възможност за обратна връзка от потребителите. Например макросът може да актуализира етикетите на UserForm с индикатори за напредъка. Без DoEvents Excel може да не получи съобщенията за пребоядисване на UserForm, създавайки на потребителя впечатлението, че макросът е спрял да работи - особено ако превключите към друга програма и след това опитате да превключите обратно към Excel. С DoEvents обаче UserForm ще продължи да се пребоядисва и ще продължават да се появяват актуализации за напредъка на макроса.

В по -голямата си част DoEvents не е нещо, което искате да включите много в кода си и често може да бъде пропуснато. Ако отзивчивостта е нещо, от което се нуждае вашият макрос, не го бройте!

Така ще помогнете за развитието на сайта, сподели с приятелите си

wave wave wave wave wave