Показване на индикатор за текущо състояние с помощта на 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, включващ индикатор за текущо състояние
Следвай тези стъпки:
- Вмъкнете нов диалогов прозорец UserForm и променете стойността на свойството Caption на Progress.
- Добавете контрола на Frame и го наречете FrameProgress.
- Добавете контрола Label към контролата Frame и го наречете LabelProgress. Премахнете заглавието на тази контрола и също така направете нейния фон червен (чрез свойството BackColor). В момента размерът и позицията на този контрол не са важни.
- Добавете друга контрола за етикет над контрола за рамка, която можете да използвате, за да опишете случващото се (по избор). В нашия пример, използвайки този контрол, добавяме надписа Progress.
- Персонализирайте диалоговия прозорец и контролите UserForm, така че да изглеждат като този, показан на Фигура 4. 2.

Фигура: 2. Прозорецът UserForm може да действа като лента за напредъка
Можете да промените типа на форматиране на контролите. Например свойството SpecialEffect на елемента Frame, така че последният да стане „депресиран“.