Показване на индикатор за текущо състояние с помощта на VBA

По-рано разгледах методи за създаване на персонализирани формуляри и основите на работата с тях (ако никога не сте работили с персонализирани формуляри, препоръчвам първо да прочетете горната бележка). Тази бележка показва използването на индикатора за текущо състояние - графичен „габарит“, който показва текущото състояние на изпълняваната задача, например дългодействащ макрос. [1]

състояние

Фигура: 1. Прозорецът UserForm показва напредъка на макроса

Изтеглете бележка във формат Word или pdf, примери в архива

Ще разгледаме три метода за създаване на индикатори за текущо състояние:

  • Макрос, който се изпълнява извън диалоговия прозорец UserForm (отделен индикатор за текущо състояние).
  • Макрос, който се изпълнява от диалоговия прозорец UserForm. Това използва контрола MultiPage в диалоговия прозорец UserForm за показване на индикатора за текущо състояние, докато се изпълнява друг макрос.
  • Макрос, който се изпълнява от диалоговия прозорец UserForm. Това увеличава височината на диалоговия прозорец UserForm и показва индикатора за текущо състояние в долната част на прозореца.

Когато използвате индикатора за текущо състояние, трябва да знаете колко завършена е текущата работа. Методите за получаване на тази информация се различават в зависимост от вида на изпълнявания макрос. Например, ако макрос записва данни в клетки (и броят на такива клетки е известен), остава да се създаде код, който ще изчисли процента от броя на клетките, съдържащи данни. Дори и да е невъзможно да се прецени точно докъде е отишъл макросът, потребителят ще се интересува да знае, че макросът все още работи и Excel не е замразен.

Покажете индикатора за текущо състояние в лентата на състоянието на прозореца

Лесен начин за показване на напредъка на макрос е използването на лентата на състоянието на Excel. Неговото предимство е лекотата на изпълнение. Недостатъкът е, че повечето потребители не са свикнали да следят информацията, която се показва в лентата на състоянието на прозореца, тъй като предпочитат да я преглеждат в отделен прозорец.

Следният израз се използва за показване на съобщение в лентата на състоянието:

Application.StatusBar = "Моля, изчакайте ..."

Можете да актуализирате лентата на състоянието, докато макросът работи. Например, ако вашият макрос използва променливата Pet, която представлява състоянието на задачата, можете да напишете код, който периодично изпълнява следния израз:

Application.StatusBar = "Изпълнение ..." & Домашен любимец & "% завършен"

След завършване на макроса, трябва да върнете лентата на състоянието в предишния си вид. За това се използва следният оператор:

Ако лентата на състоянието не бъде върната, крайното съобщение продължава да се показва. Не забравяйте, че индикаторът за текущо състояние забавя изпълнението на макроса, тъй като актуализирането на индикатора изисква допълнително използване на системните ресурси. Ако ефективността на макроса е над всичко, по-добре е да откажете да използвате индикатора за текущо състояние.

Създайте отделен индикатор за състоянието

Такъв индикатор не се инициализира чрез показване на UserForm. Следният макрос изчиства работния лист и записва 20 хиляди произволни числа в диапазона от клетки (вижте също файла за индикатор за напредъка l.xlsm).

След леко модифициране на макроса (описан в следващия раздел), диалоговият прозорец UserForm показва лента за напредъка на макроса (Фигура 1).

Създаване на диалогов прозорец UserForm, включващ индикатор за текущо състояние

Следвай тези стъпки:

  1. Вмъкнете нов диалогов прозорец UserForm и променете стойността на свойството Caption на Progress.
  2. Добавете контрола на Frame и го наречете FrameProgress.
  3. Добавете контрола Label към контролата Frame и го наречете LabelProgress. Премахнете заглавието на тази контрола и също така направете нейния фон червен (чрез свойството BackColor). В момента размерът и позицията на този контрол не са важни.
  4. Добавете друга контрола за етикет над контрола за рамка, която можете да използвате, за да опишете случващото се (по избор). В нашия пример, използвайки този контрол, добавяме надписа Progress.
  5. Персонализирайте диалоговия прозорец и контролите UserForm, така че да изглеждат като този, показан на Фигура 4. 2.

показване

Фигура: 2. Прозорецът UserForm може да действа като лента за напредъка

Можете да промените типа на форматиране на контролите. Например свойството SpecialEffect на елемента Frame, така че последният да стане „депресиран“.

Създаване на процедури за събития. Важно е процедурата да се изпълнява автоматично, когато се показва диалоговият прозорец UserForm. Единият вариант е да използвате събитието Initialize. Но това събитие се случва дори преди диалоговият прозорец да се покаже на екрана, така че тази опция не е подходяща. От друга страна, събитието Activate се активира, когато диалоговият прозорец UserForm се покаже на екрана, така че в този случай можете да спрете да го използвате.

Поставете следната процедура в кодовия модул на диалоговия прозорец UserForm. Тази процедура просто извиква процедурата GenerateRandomNumbers, когато се показва диалоговият прозорец UserForm. Процедурата GenerateRandomNumbers, която се съхранява в кодовия модул VBA, е действителният макрос, който ще се изпълни, докато индикаторът за текущо състояние се показва на екрана.

Процедурата GenerateRandomNumber има допълнителен модул, който следи текущото състояние чрез съхраняване на съответната информация в променливата PctDone.

Процедурата GenerateRandomNumbers включва два цикъла. Във вътрешния цикъл се извиква процедурата UpdateProgress, която взема само един аргумент (променливата PctDone, която е "отговорна" за показване на напредъка на макроса). Тази променлива може да приема стойности от 0 до 100.

Създаване на стартираща рутина. За да се покаже диалоговият прозорец UserForm, въведете следния код в модула VBA.

Можете да направите лентата на състоянието да съответства на текущата тема на работната книга. За да направите това, добавете следния израз към процедурата ShowUserForm.

.LabelProgress.BackColor = ActiveWorkbook.Theme. _
ThemeColorScheme.Colors (msoThemeAccentl)

Когато се изпълни процедурата ShowUserForm, ширината на обекта Label се задава на 0. След това се извиква методът Show на обекта UserForm1, което води до показване на диалоговия прозорец UserForm (който действа като индикатор за текущото състояние ). Когато се покаже диалоговият прозорец UserForm, се активира събитието Activate, което води до изпълнение на процедурата GenerateRandomNurabers. Процедурата GenerateRandomNumbers включва код, който извиква процедурата UpdateProgress при промяна на променливата r на брояча на цикъла. Обърнете внимание, че процедурата UpdateProgress използва метода Repaint на обекта UserForm. Ако този оператор не съществуваше, изображението на екрана нямаше да се актуализира. Преди процедурата GenerateRandomNumbers да приключи, последният й оператор разтоварва диалоговия прозорец UserForm от паметта.

За да се модифицира тази техника, е необходимо да се разбере как се определя процентът на завършеност на изпълнената задача. След това стойността на състоянието на задачата може да бъде присвоена на променливата PctDone. Определянето на тази стойност се извършва по различни начини, в зависимост от приложението. Ако кодът се изпълнява в цикъл (както в този пример), изчисляването на процента на завършеност е сравнително лесно. Ако кодът не се изпълнява в цикъл, състоянието на изпълнение се определя в различни точки на кода.

Показване на информация за текущото състояние с многостранична контрола

В предишния пример макросът не е стартиран от диалоговия прозорец UserForm. В много случаи дългодействащият макрос може да бъде принуден извън сцената, като щракнете върху бутона OK в диалоговия прозорец UserForm. В същия раздел ще бъде описан най-добрият метод, чието използване е възможно при следните предположения:

  • проектът е завършен и отстранен;
  • Проектът използва диалоговия прозорец UserForm (без контрола MultiPage), за да изпълнява дългодействащ макрос.
  • има метод за оценка на степента на завършеност на изпълняваната задача.

Както в предишния пример, случайните числа се въвеждат в работния лист. Разликата е, че приложението съдържа диалогов прозорец UserForm, в който потребителят определя броя на редовете и колоните за въвеждане на произволни числа (Фиг. 3; вижте също файла за индикатора за напредък2.xlsm).

състояние

Фигура: 3. Потребителят определя броя на редовете и колоните, в които се въвеждат произволни числа

Промяна на диалоговия прозорец. Тази стъпка предполага, че диалоговият прозорец UserForm вече е конфигуриран. Просто трябва да добавим контрола MultiPage. Първата страница на контрола MultiPage ще съдържа всички оригинални контроли. Втората страница съдържа контроли, които се използват за показване на индикатора за текущо състояние. Когато макросът започне да се изпълнява, кодът на VBA променя стойността на свойството Value на контролата MultiPage. Това ще скрие оригиналните контроли и ще покаже контролите, които се използват за създаване на индикатора за текущо състояние.

Първата стъпка е да добавите контрола MultiPage към диалоговия прозорец UserForm. След това трябва да преместите всички съществуващи контроли в диалоговия прозорец UserForm на първата страница на контролата MultiPage. След това активирате втората страница на контрола MultiPage и я персонализирате така, че да изглежда като показаната на Фигура 4. 4. В този случай се използва същата комбинация от контроли, както в предишния пример.

  1. Добавете контрола на Frame и го наречете FrameProgress.
  2. Добавете контрола Label към контролата Frame и го наречете LabelProgress. Премахнете заглавието на тази контрола и направете цвета на фона й червен.
  3. Добавете друга контрола за етикет, за да опишете какво се случва (по избор).
  4. Активирайте целия контрол на MultiPage (не отделен раздел) и задайте свойството Style на 2 - fmTabStyleNone. (Това ще скрие всички раздели.) Може да се наложи да преоразмерите контролата MultiPage, за да поберете скритите раздели.

показване

Фигура: 4. Вторият раздел на контролата MultiPage, който се използва за показване на индикатора за текущо състояние

Най-лесният начин да маркирате контрола MultiPage, когато разделите са скрити, е да я изберете от падащия списък в прозореца Properties (подчертан в червено на фигура 4). За да изберете конкретна страница, посочете стойността на свойството Value за елемента MultiPage: 0 - за Page1, 1 - за Page2 и т.н.

Поставяне на процедурата UpdateProgress. Вмъкнете следната процедура в кодовия модул на диалоговия прозорец UserForm.