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 під призначенням діапазону:

123 Діапазон ("A1"). Значення = iDoEvents

Якщо ви знову запустите цей код, то побачите, що Excel тепер чуйний - його можна зосередити та вивести на перший план. DoEvents викликається щоразу через цикл, що гарантує, що макрос завжди дає результат, щоб Excel міг обробляти будь -які надіслані йому повідомлення. Оскільки цей макрос працює швидко, здається, ніби він працює у фоновому режимі (хоча це не так) - більше операцій всередині циклу швидко розкриють цю ілюзію.

DoEvents Небезпека

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

Інша небезпека полягає в тому, що DoEvents може служити вікном для роботи інших макросів всередині. Спробуйте це: розмістіть CommandButton ActiveX на робочому аркуші, двічі клацніть його та додайте такий код у подію CommandButton1_Click ():

1234567 Dim c як діапазонДля кожного c в діапазоні ("B3: E8")c.Value = c.Value + 1Далі c

Вимкніть режим проектування в Excel, а потім запустіть макрос Test (), який ви додали раніше. Під час виконання макросу 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