Elettracompany.com

Компьютерный справочник
23 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba excel progressbar

ProgressBar – создание полосы загрузки на VBA

Во время выполнения кода программ в Excel, в случае длительного исполнения какого-либо процесса, возникает необходимость сообщить пользователю, что приложение стабильно работает, а вовсе не зависло, как это может показаться на первый взгляд.

Способ вывода таких сообщений предусмотрен приложением. Называется он Статус бар и вызывается он прямо из кода в редакторе Visual Basic следующей записью:
Application.StatusBar = “сообщение для пользователя”.

Во многих случаях, этого вполне достаточно, чтобы успокоить пользователей Ваших программ. Если Вы хотите сообщать больше информации, сообщить оставшееся время обработки, процент выполнения, позволить остановить процедуру, то одним статус баром не обойтись.

В данной статье описано, как создать окно загрузки (или по-другому прогресс бар) для Ваших процедур без загромождения их кодом.

Скачать файл с классом можно в конце статьи.

Состав прогресс бара

Строится окно загрузки на основе простой пользовательской формы UserForm, которая содержит следующие элементы:

  1. Два элемента Label. Используются в совокупности для отображения полосы загрузки. Первый применяется как контейнер и имеет отличный от фона формы фон. Второй вкладывается в первый и имеет динамическую ширину, которая меняется вместе с процентом выполнения процесса. Ее фон отличный от фона формы и фона родительского элемента. Эти элементы можно заменить на один дополнительный, который так и называется — ProgressBar, но с его использованием могут быть связаны некоторые проблемы, речь о которых пойдет ниже.
  2. Три элемента Label. Каждый из них не зависит от остальных и предназначается для вывода конкретной информации: продолжительность процесса, оставшееся время, количество пройденных этапов процесса.
  3. ТехBox для вывода специальных сообщений пользователю.

Если вывести все элементы на форму, то она будет иметь такой вид:

В случае ненадобности тех или иных элементов, их можно не выводить. Контроль за выводом элементов осуществляет класс «ProgressBar», экземпляр которого для начала необходимо создать (Set var = New ProgressBar). Затем, используя созданный класс, можно программным образом заполнить форму элементами и задавать им конкретные значения.

Описание класса и способов создания окна загрузки

Для начала рассмотрим доступные методы данного класса, не концентрируясь на коде, а только на его функциональности:

  • Метод createLoadingBar – создает полосу загрузки на форме;
  • createString – создает сроку «Обработано: … %»;
  • createtimeDuration – создает сроку «Продолжительность обработки: …»;
  • createtimeFinish – создает строку «Оставшееся время обработки: …»;
  • createTextBox – создает элемент TextBox;
  • setParameters – задает параметры окна загрузки для предстоящего процесса. Принимает 3 аргумента:
    • expProcess_INT – обязательный аргумент. Принимает целое число, сообщающее, из какого количества этапов состоит последующий процесс;
    • UpdateInterval_INT – необязательный аргумент. С его помощью можно задать интервал обновления формы, т.е. через какое количество этапов все элементы окна загрузки необходимо обновить;
    • UpdTimeInterval_INT_SEC – необязательный аргумент. Задает интервал обновления формы в секундах. Аргумент имеет смысл только в том случае, если не задан аргумент UpdateInterval_INT.
  • В том случае, если оба аргумента, задающие интервал, не указаны или принимают значение 0, то по умолчанию интервал обновления будет равняться одной секунде.
  • Метод Start – запускает окно загрузки. Данный метод важен потому, что он отображает саму форму и запоминает время запуска, которое в дальнейшем используется для расчетов. Метод принимает один необязательный аргумент — title. С его помощью можно задать заголовок формы полосы загрузки. Значение заголовка по умолчанию равняется строке «Процесс выполнения».
  • Update – обновляет форму, если прошел интервал заданный методом setParameters. Данный метод принимает два необязательных аргумента:
    • curProcess – целое число. Номер текущего этапа процесса;
    • stringTextBox – строка для элемента TextBox.
  • exitBar – закрывает прогресс бар и выгружает форму из памяти.
  • getForm – возвращает ссылку на форму прогресс бара.

Можно заметить, что прогресс бар обязательно устанавливает интервал обновления окна загрузки. Поэтому сообщения, заданные в аргументе stringTextBox метода Update, попадут в форму только в случае, если интервал это позволит. Но можно напрямую обратиться к форме и внести сообщение – ссылка_на_форму.Text = “сообщение”.

Это сделано по двум причинам.

Первая причина. При выводе в форму оставшегося времени обработки, его расчет производится, исходя из среднего времени, затраченного на один этап процесса, а затем умноженного на число оставшихся процессов. Данный способ является достаточно простым и понятным, но так как этапы выполняются не всегда с одной и той же скоростью, то время постоянно перепрыгивает с одного показателя на другой, что не позволяет адекватно его оценивать. Особенно данный эффект заметен в начале, когда прошедших этапов для оценки не так много. Установив интервал, Вы можете смягчить данный эффект. Рекомендуемого интервала в данном случае нет, так как все зависит от конкретного процесса.

Второй причиной является производительность. Не смотря на то, что идея вывода информации по загрузке является вполне обоснованной, само ее использование сильно замедляет процесс. Например, с использованием ProgressBar время обработки нижеприведенного примера составляет 1 минута 17 секунд при установленном интервале обновления в секунду. При обновлении формы на каждом этапе, за 2 минуты обработалось чуть больше 2 сотых процента. Без использования на все ушло 8 секунд. Поэтому старайтесь использовать прогресс бар только в случаях, когда это действительно важно и применяйте к нему оптимальный интервал – секунды достаточно, свыше данного значения особых изменений в производительности не наблюдается.

Также предусмотрена возможность остановить выполнение всех процессов, закрыв окно загрузки. Предварительно пользователю будет выведено окно с подтверждением.

Пример подключения прогресс бара к макросу

Далее приводиться простой пример перебора символов строки. Процедура сама по себе смысла не имеет, но хорошо демонстрирует возможности окна загрузки.

Многоуровневая полоса загрузки

Применение описанного в статье класса позволяет создавать независимые друг от друга окна загрузки для многоуровневых процессов.

Никаких дополнительных действий не требуется, достаточно создать новый экземпляр класса (New ProgressBar) и работать с ним независимо от родительского процесса.

Рекомендация: Для дочерних процессов добавляйте к формам загрузок уникальные заголовки (ProgressBar.Start Заголовок). Это уведомит пользователя программы о том, что сейчас выполняется подпроцесс.

Специальный элемент Microsoft ProgressBar Control

Выше было сказано о том, что саму полосу загрузки можно заменить дополнительным элементом управления формы, который специально предназначен для этого и называется Microsoft ProgressBar Control, version 6.0. Чтобы применить его, достаточно нажать правой кнопкой мыши на панели Tollbox и выбрать пункт «Additional Control. «.

Но с применением этого элемента могут быть связаны проблемы работоспособности программы на разных версиях MS Office (в основном 2010 и 2013) и Windows, когда Вы попытаетесь добавить его в UserForm. Приложение выдаст ошибку «Библиотека не зарегистрирована».

Для ее устранения сначала проверьте наличие на Вашем компьютере файла MSCOMTCL.ocx. Это библиотека содержащая общие элементы управления Windows 6.0. Он должен располагаться в папке WindowsSysWOW64 для 64-разрядных ОС либо WindowsSistem32 для 32-разрядных. В случае необходимости скачайте его и разместите в требуемую папку.

После того, как Вы убедились в наличии библиотеки, следует ее зарегистрировать. Запустите командную строку от имени администратора (Пуск -> Все программы -> Стандартные -> Командная строка) и выполните команду regsvr32 MSCOMTCL.ocx.

Скачать пример полосы загрузки на VBA

Скачать пример progressbar VBA c применением Microsoft ProgressBar Control.

Суррогат Progress Bar

Поскольку Progress Bar использовать не так-то просто в силу разных причин, а кроме того, он не всегда вполне информативен, создал простенький, но удобный суррогат, может быть, кому-то пригодится.

Описание задачи:
Предположим, надо обработать несколько однотипных файлов, назовём их Объектами.
С каждым Объектом надо проделать несколько операций, которые могут занимать много времени.
Чтобы юзеру не было скучно, попытаемся отобразить состояние процесса.
В начале создаётся простенькая форма с одним единственным компонентом ListBox:

Далее, пишутся функции Активации Формы и Указания Статуса операции:

Параметры функции Активации это описание строки объектов и колонки операций, это, соответственно, нулевая строка и нулевая колонка ListBox«а.
Далее определяются размеры таблицы и заполняются её ячейки, причем на этапе активации только строка объектов и колонка операций, остальные ячейки пустые.
Функция Указания Статуса операции вписывает в заданную ячейку требуемый Статус.

Далее маленький код, имитирующий решение задачи, здесь, вместо собственно операций, выводится MsgBox.

====================
Пользуясь случаем, хочу задать два вопроса:

1. Как подогнать размеры ListBox«а и Формы, чтобы не торчало ничего и не появлялись скроллинги?
2. Есть ли возможность разлиновать таблицу?

Как сделать Progress-bar.
Когда нажимаем на сохранение документа в левом нижнем углу Excel’a появляется прогресс бар.

Можно ли переделать Progress bar в Track bar?
Можно ли переделать Progress bar в Track bar? От прогресбара нужно всего лишь, что бы можно было.

Читать еще:  Ссылка на пустую ячейку в excel

Progress Bar
Допустим, нужно сделать так чтобы после нажатия на кнопку, прогресс бар начинал свою работу, и.

Progress Bar
Вот. Нашел способ как сделать прогресс бар. Думаю будет интересно. -declarations section- .

К чему такие извращения, можно же ведь взять картинку и растягивать ее в контейнере фрейма
а процент соотносить к размеру, делим на 100 и умножаем на текущий коофициент

картинки для растягивания:

Скиньте, буду рад.

Просто, понимаете, это дело привычки и удобства.

Вот я смотрю на ToolBox и не вижу там Progress Bar, значит надо его искать какие-то Reference, подключать их, а вдруг у кого-то не подключится и т.д.
А тут двумерный индикатор, представляется удобным, впрочем, кому как.

Добавлено через 7 минут
По поводу моего Вопрос«а #2 — рекомендуют использовать ListView, он очень удобен, почти кусочек Excel«а, и содержится в Additional Controls, но проблема в том, что при переносе на другие компы могут возникать неприятности .

Добавлено через 1 час 53 минуты
Кроме того, смотрите, в данном примере Статус процесса сводится к двум состояниям — «Processing/Done», а ведь можно отображать гораздо более информативно, выдавать характеристики процесса и т.п.

Beautiful VBA Progress Bar with Step by Step Instructions

The VBA Tutorials Blog

Introduction

Make your macros stand out by creating this beautiful VBA Progress Bar to illustrate the progress. This tutorial walks you through how to make the sleek UserForm and how to implement it in your next project!

Inclusion of a VBA progress bar is an incredibly useful feature when you have long macros that take several minutes to complete. Without a periodic status update, your users will wonder if the macro is still running. Follow this step-by-step guide to learn how to incorporate a progress bar into your own spreadsheet.

To get you motivated about what’s in store, I’m going to go ahead and show you the final design of my VBA progress bar:

Design Progress Bar

Adding your UserForm

The first thing we want to do is create a UserForm and add the elements necessary to turn it into a progress bar. If you’re new to VBA, follow these steps to add a UserForm:

  1. Open the VBA Editor (Alt+F11)
  2. Insert a UserForm
    1. Right-click the Project Explorer Pane
    2. Hover over Insert
    3. Click Userform

    Setting the Progress Bar Properties

    Once you have an empty UserForm, go ahead and press F4 to bring up the Properties Window.

    1. Change the (Name) of the UserForm to ufProgress .
    2. Change the ShowModal property to False. Setting this property to False guarantees other macros will continue to run while the UserForm is open. Check out this tutorial to learn more about the ShowModal property.
    3. Adjust the size of your UserForm to something visually pleasing for you. I like to set the Height property of my Progress Bars to 110 and the Width property to 240 .
    4. If you’d like, you can go ahead and update the Caption property of the UserForm to something like Running. . This step isn’t necessary if you want to hide the title bar altogether. I’ll show you how to do that later in this tutorial!

    Here’s what my Progress Bar looks like after completing these steps:

    Designing the UserForm

    Now that you have the UserForm configured the way we want it, you can begin designing it. There are a few elements we must have for the VBA progress bar to function properly. Follow these steps to make sure each element is included:

    Insert Label

    1. Insert a label in the upper left of your UserForm. This will be used later to display the text indicating the status of your macro.
    2. Make sure the label is wide enough for any text you may display later. I set my Width property to 174 , but there’s nothing magical about that number.
    3. Change the (Name) of the label to LabelCaption .
    4. Change the Caption property to an empty string (no text).

    At this point, your Progress Bar should look something like this:

    Insert Frame

    The next step is to insert a Frame on your UserForm. The frame is the item highlighted in the Toolbox screenshot below:

    You want to insert the frame so it’s roughly centered on your UserForm, both horizontally and vertically, with a little margin on each side. It should be positioned below the label you previously added. At this point, your UserForm will look something like this:

    To make the frame begin to resemble a progress bar, you’ll need to change a few properties. Follow these steps to configure the frame properties:

    1. Select the frame and change the (Name) property to FrameProgress
    2. Change the Caption property to an empty string (no text)
    3. Change the SpecialEffect property to 2 — fmSpecialEffectSunken

    At this point, you can start to see the outline of your progress bar. The progress bar is finally starting to take shape and will look something like this:

    Insert Another Label

    Next, we want to insert another label, but this label is never going to have any text. This label is going to grow as your macro progresses to fill the frame you just created. Stay with me for a minute to learn what I mean.

    1. Insert a label INSIDE the frame you just created, and change the height so it fits nicely right up against the top and bottom of your frame.
    2. Position the label so the left edge of the label touches the left edge of the frame. The width of the label doesn’t matter at this point. It will look like this:
    3. Change the (Name) property to LabelProgress
    4. Change the Caption property to an empty string (no text)
    5. Change the BackColor property to blue , or whatever color you prefer.
    6. Change the SpecialEffect property to 1 -fmSpecialEffectRaised .

    You are done designing your VBA Progress Bar! The UserForm will look something like this:

    Once you get to this point, you’re ready to add the macros to your Progress Bar so it behaves the way we want it to.

    Add Progress Bar Macros

    When your progress bar pops up, you don’t want the ugly title bar with the red X to show up, right? I didn’t think so.

    Hide Title Bar

    To remove the title bar, I’m going to borrow a macro from my Remove Window Border tutorial. If the person using the spreadsheet you’re creating is a Mac user, this macro won’t work, but I’ll show you how to prevent it from crashing on them later.

    1. Insert a Standard Module
      1. Right-click the Project Explorer Pane
      2. Hover over Insert
      3. Click Module

  3. Change the (Name) property of the Module to HideTitleBar
  4. Paste the following macro into the new module you just created:

Make powerful macros with our free VBA Developer Kit

Tutorials like this can be complicated. That’s why we created our free VBA Developer Kit to supplement this tutorial. Grab it below and you’ll be writing macros so much faster than you are right now.

Add Macro to UserForm

Once you do this, go back to your ufProgress form and follow these steps:

  1. Right click anywhere on your ufProgress form and select View Code
  2. Clear out any macros that may appear on the form
  3. Paste the following macro:

The IsMac check in this routine is what prevents the macro from crashing for users running Excel on a Mac. Instead of the sleek UserForm without a title bar, they’ll see the title bar. In other words, their Progress Bars won’t be as pretty as you Windows users, but that’s okay, right!? 😉

Display Progress Bar

Now that you’re done designing your progress bar and configuring the macros, it’s time to figure out how to incorporate the progress bar into your existing macro.

This is where you may have to adapt the solution I provide into your own application. This might require you to think outside the box a bit, but I’m confident you can do that!

The best way to show you how to include the progress bar in your macro is to give you a demonstration and then walk you through the important pieces.

In this example, I loop through all the rows in my spreadsheet and update my progress bar after each row. Here’s the sample macro (pay attention to the comment cards):

This sample has 3 important steps. These 3 steps are common whether or not your macro uses a For loop like the one above.

Step 1 — Display your Progress Bar

At some point in your macro, you want to make your progress bar appear on your screen. Chances are, you want to do this right after your macro starts to run. To do that, you want to make sure the width of your progress bar is set to 0 at the beggining and then show your UserForm. All you have to do is add the following lines to your macro, like I did in the example above:

Step 2 — Periodically Update Progress Bar

At some point, you want to update the length of your progress bar to indicate how far along your macro is. That’s the point of a progress bar, right? In my example, I used a formula to calculate what percentange of the way through the macro I was, based on which row I was processing. Inside the loop, I included the following code:

Each time I get to a new row, I update the LabelCaption text and the width of my LabelProgress label.

This is a great way to indicate progress if your macro consists of a loop where you know the starting position and you know the ending position. Examples where a solution like the one above will work are when you’re processing each line of data in a spreadsheet, or looping through files in a folder.

Step 3 — Close the Progress Bar

When your macro is nearing completion, make sure you close your Progress Bar. In my example, I closed the VBA Progress Bar UserForm when I got to the last row. I did that via this line of code:

Final VBA Progress Bar

When you put it all together, you’ll get a beautiful VBA progress bar that looks like this:

What if I don’t have a loop?

The approach I demonstrated in the previous section is great for loops, but it’s not very useful if your macro isn’t constructed with a primary loop. What if you don’t have a loop?

The important part is, you need to follow the same 3 steps.

You don’t need a formula to do this. You could manually update the progress bar at various points in your macro. Take a look at this demonstration, where I include the same 3 steps but they’re manually sprinkled into my existing macro.:

In this example, I spaced out my macro so I could provide a status update at approximate 1/4 intervals. How you split your macro isn’t important. As long as you’re periodically updating your LabelCaption text and your LabelProgress width, your users will be happy.

What if my progress bar isn’t updating?

If you have a complicated macro that uses a bunch of resources, you may discover that your progress bar won’t update or it’ll show up white. To fix the progress bar, add the following code right below the End With statement in Step 2 of the progress bar.

This short piece of code forces VBA to redraw your progress bar so it’s updated each time the UserForm changes.

Final Thoughts

You have successfully created an incredible progress bar using VBA that your users will surely be thankful for! Get creative and change your caption text to specifically match what your macro is doing at any given point if you’d like. When I need to mass produce PDF invoices, I’ve included a progress bar like this one to keep me updated on the status. You can do the same!

That’s all for this tutorial. When you’re ready to take your VBA to the next level, subscribe using the form below.

Oh, and if you have a question, post it in our VBA Q&A community.

The best free VBA training on the web
I see people struggling with Excel every day and I want to help. That’s why I’m giving away my 90-days to Master VBA eCourse and my entire personal macro library for free.

Over 2 million people use our VBA tutorials each year to help automate their work. Are you ready to reclaim your time, too? Grab our VBA Cheat Sheets and you’ll be writing macros like a professional. With over 180 tips and 135 macro examples, they include everything you need to know to become a great VBA programmer.

Линейный индикатор выполнения (прогресс бар) в Excel

Разберёмся как создать и настроить линейный индикатор выполнения (прогресс-бар) в виде диаграммы в Excel.

Приветствую всех, уважаемые читатели блога TutorExcel.Ru!

В современную экономическую жизнь прочно вошли понятия КПЭ (ключевые показатели эффективности, или KPI) и дашборда, которые помогают нам увидеть насколько эффективно выполняются те или иные цели. Грамотная визуализация позволяет сделать это приятным и понятным глазу языком.

Мы уже разбирали с вами примеры пулевой диаграммы, диаграммы в виде спидометра, сейчас остановимся ещё на одном варианте визуализации — индикаторе выполнения (также встречаются названия индикатор процесса или прогресс-бар от английского progress bar).

Для начала давайте поймем, что же это именно такое?

Прогресс бар — это графический элемент в виде полоски (горизонтальной, вертикальной, круговой и т.д.), показывающий статус процесса с помощью заполнения полоски по мере выполнения. Вы часто можете видеть горизонтальный вариант графика во время ожидания загрузки файлов или установки программ.

Сегодня предлагаю подробно рассмотреть линейный вариант графика, который представляет собой простую горизонтальную или вертикальную полосу:

Также в целом можно выделить 2 способа построения графика:

  • Без делений на шкале; в этом случае полоска нарисована как единый объект.
  • С делениями. В этом случае дополнительно рисуется шкала, которая отображает уровни выполнения (к примеру от 0% до 40% — красная зона, от 40% до 70% — желтая зона и т.д.).

Построение линейного индикатора (прогресс бара)

Вариант 1. Прогресс бар без шкалы

Давайте приступим к построению и начнем с самого простого варианта.

Для начала создадим таблицу, состоящую всего из 2 рядов с данными, в первом будет исходный процент (к примеру 85%), а во втором оставшаяся недостающая часть до 100% (т.е. в данном случае 15% = 100% — 85%):

Выделяем диапазон с данными A1:B2 и строим гистограмму с накоплением (в панели вкладок выбираем Вставка -> Диаграммы -> Линейчатая гистограмма с накоплением):

Как видим Excel не совсем правильно интерпретировал данные и построил график с 2 рядами данных, поэтому для корректного отображения поменяем местами строки и столбцы (выделяем диаграмму и в панели вкладок Конструктор выбираем Строка/Столбец), этим мы добьемся отображения всех данных в одному ряду:

Отлично, диаграмма уже начинает приобретать узнаваемый вид.

Далее устанавливаем минимальную и максимальную границы для оси (щелкаем правой кнопкой мыши по горизонтальной оси и попадаем в настройки Формата оси), как 0 и 1 соответственно, чтобы наша полоска полностью помещалась и показывалась на графике:

В результате мы получаем следующий вид графика:

Уберем ненужные на текущий момент детали в виде названия, дополнительных осей и прочего, чтобы они не отвлекали от построения (их, безусловно, можно не удалять и компоновать на ваше усмотрение):

Как мы видим, полученная полоска занимает не всю ширину диаграммы, снизу и сверху мы видим пустые белые полосы.

Поэтому, чтобы растянуть диаграмму на всю возможную ширину и убрать лишние полосы, установим боковой зазор для ряда равным нулю (выделяем любой ряд с данными, щелкаем правой кнопкой мыши и выбираем Формат ряда данных -> Параметры ряда):

В итоге получаем более компактный вид:

Остались небольшие детали, покрасим части полоски в подходящие цвета и добавим подпись данных на ряд:

Все готово, перейдем к следующему варианту.

Вариант 2. Прогресс бар со шкалой

Отличие этого варианта от предыдущего заключается лишь в дополнительной подложке под полоску, которая показывает уровни выполнения показателя, остальные части практически повторяют предыдущий вариант построения.

Для начала несколько модифицируем нашу таблицу и добавим на нее дополнительные ряды для построения шкалы:

В данном случае я указал шаг шкалы равным 10%, но можно поставить абсолютно любой по вашему усмотрению, главное чтобы сумма всех таких шагов давала 100% (10 шагов по 10% как в примере, или 20 шагов по 5% и т.д.).

Выделяем диапазон с данными A1:B11 и, как и в предыдущем примере, строим линейчатую гистограмму с накоплением:

Повторяем алгоритм и меняем строки и столбцы местами, чтобы диаграмма приобрела необходимый нам вид:

Как мы видим, у нас появилась достаточно длинная полоса, где в начале находится полоска, а в конце как раз разместилась шкала в виде маленьких разноцветных прямоугольников.

Покрасим каждый шаг шкалы в подходящий цвет, для этого левой кнопкой мыши выделяем каждый ряд по отдельности и делаем заливку соответствующим цветом (к примеру, первые 4 шага красим красным, 3 средние — желтым и 3 последние — зеленым):

Так как шкала должна быть подложкой (т.е. находиться позади основного ряда), то поместим основной ряд на второстепенную ось, чтобы он всегда находился над шкалой. Для этого в настройке формата ряда данных указываем построить ряд по вспомогательной оси (именно для ряда с основной полоской):

В результате настройки типов осей получаем:

Далее также для обеих осей указываем 0 и 1 как минимальную и максимальную границы, чтобы график был ровно от 0% до 100%:

Убираем название, оси данных и прочие ненужные в данный момент детали, настраиваем нулевой боковой зазор:

Так как шкала на полученной диаграмме не видна за основной полоской, то для основного ряда с данными установим прозрачность (щелкаем по ряду правой кнопкой мыши, в контекстном меню выбираем Формат ряда данных -> Заливка и границы -> Заливка):

Также добавим подпись данных и получаем:

По усмотрению шкалу можно сделать не сплошной, а с разделителями, для этого установим для каждого ряда шкалы белую границу:

Спасибо за внимание!
Если у вас есть вопросы по теме статьи — пишите в комментариях.

Индикатор выполнения в VBA Excel

Я делаю приложение Excel, которое требует большого обновления данных из базы данных, поэтому оно требует времени. Я хочу сделать индикатор выполнения в форме пользователя, и он появляется, когда данные обновляются. Бар, который я хочу, — это просто маленькая синяя полоска, которая движется вправо и влево и повторяется до тех пор, пока обновление не будет сделано, не нужно никакого процента. Я знаю, что должен использовать контроль progressbar , но я пытался когда-то, но не могу сделать это.

EDIT : моя проблема с управлением progressbar , я не могу видеть бар ‘progress’. Он просто завершается, когда появляется форма. Я использую цикл и DoEvent , но это не работает. Кроме того, я хочу, чтобы этот процесс выполнялся неоднократно, а не только один раз.

13 Ответов

Иногда достаточно простого сообщения в строке состояния:

Вот еще один пример использования StatusBar в качестве индикатора выполнения.

Используя некоторые символы Юникода, можно имитировать индикатор выполнения. 9608-9615-это коды, которые я пробовал для баров. Просто выберите один из них в соответствии с тем, сколько места вы хотите показать между полосами. Вы можете установить длину бара, изменив NUM_BARS. Кроме того, используя класс, вы можете настроить его для обработки инициализации и освобождения StatusBar автоматически. Как только объект выходит из области видимости, он автоматически очищается и освобождает StatusBar обратно в Excel.

В прошлом, с проектами VBA, я использовал элемент управления label с цветным фоном и регулировал размер в зависимости от прогресса. Некоторые примеры с подобными подходами можно найти по следующим ссылкам:

Вот один из них, который использует Автофигуры Excel:

Создать кнопку на листе; сопоставить кнопку с макросом «ShowProgress»

Создать UserForm1 с 2 кнопками, прогресс-бар, бар, текстовое поле:

Элемент управления label, который изменяет размер, является быстрым решением. Однако большинство людей в конечном итоге создают индивидуальные формы для каждого из своих macros. Я использовал функцию DoEvents и немодальную форму, чтобы использовать одну форму для всех ваших macros.

Все, что вам нужно сделать, это импортировать форму и модуль в свои проекты и вызвать индикатор выполнения с помощью: Call modProgress.ShowProgress(ActionIndex, TotalActions, Title. )

Надеюсь, это поможет.

Мне нравятся все решения, опубликованные здесь, но я решил эту проблему, используя Условное форматирование в виде процентной шкалы данных.

Это применяется к ряду ячеек, как показано ниже. Ячейки, включающие 0% и 100%, обычно скрыты, потому что они просто существуют, чтобы дать контекст «ScanProgress» именованного диапазона (слева).

В коде я просматриваю таблицу, делая некоторые вещи.

Минимальный код, выглядит прилично.

Привет модифицированной версии еще один пост Марецкая . Имеет 4 стиля

Прежде чем вы спросите, почему я не редактировал этот пост, я сделал это, и мне было предложено опубликовать новый ответ.

Что касается элемента управления progressbar в форме пользователя, то он не будет показывать никакого прогресса, если вы не используете событие repaint . Вы должны закодировать это событие внутри цикла (и, очевидно, увеличить значение progressbar ).

Просто добавляю свою часть в вышеприведенную коллекцию.

Если вы ищете меньше кода и, возможно, прохладный UI. Проверьте мой GitHub для Progressbar для VBA

Dll предназначен для MS-Access, но должен работать на всех платформах VBA с незначительными изменениями. Существует также файл Excel с образцами. Вы можете развернуть обертки vba в соответствии с вашими потребностями.

Этот проект в настоящее время находится в стадии разработки, и не все ошибки охвачены. Так что ждите немного!

Вы должны беспокоиться о сторонних библиотеках DLL, и если это так, пожалуйста, не стесняйтесь использовать любой надежный онлайн-антивирус перед реализацией dll.

Там было много других замечательных сообщений, однако я хотел бы сказать, что теоретически вы должны быть в состоянии создать контрольную панель прогресса REAL :

  1. Используйте CreateWindowEx() для создания индикатора выполнения

hwndParent должно быть установлено в родительское окно. Для этого можно было бы использовать строку состояния или пользовательскую форму! Вот структура окна Excel, найденная в Spy++:

Поэтому это должно быть относительно простым использованием функции FindWindowEx() .

После создания индикатора выполнения необходимо использовать SendMessage() для взаимодействия с индикатором выполнения:

Я не уверен, насколько практично это решение, но оно может выглядеть несколько более ‘official’, чем другие методы, изложенные здесь.

Хорошая диалоговая форма progressbar, которую я искал. progressbar от alainbryden

очень проста в использовании, и выглядит красиво.

редактировать: ссылка теперь работает только для премиум -пользователей :/

вот хороший альтернативный класс.

Решение, опубликованное @eykanal, может быть не лучшим, если у вас есть огромный объем данных для работы, так как включение строки состояния замедлит выполнение кода.

Следующая ссылка объясняет хороший способ построить индикатор выполнения. Хорошо работает с большим объемом данных (

Похожие вопросы:

У меня есть функциональность для загрузки файла excel в моем проекте. При нажатии кнопки экспорта porgress bar is displayed.but даже если браузер сохранить как dialouge появился индикатор выполнения.

Я использую индикатор выполнения, чтобы показать пользователю состояние запущенного макроса, однако, поскольку макрос удаляет строки, он работает в обратном направлении For i = lastrow To 2 Step -1.

Как я могу сделать индикатор выполнения с PowerPoint VBA? Это должно быть сделано как анимация на слайде.

Во время выполнения макроса я читаю несколько файлов excel и создаю новый файл excel, я создаю аналогичный лист: Во время выполнения по VBA я хочу установить эту область и создать таблицу, добавить.

Я пытаюсь выполнить следующий код из учебника excel vba, но это не удается: ProgressBat не обновляется, плюс строка UserForm1.ProgressBar1.Value = UserForm1.ProgressBar1.Value + 1 выделяется с.

У меня есть этот код Excel VBA, который я получил из интернета, в котором перечислены все файлы в папке. Моя проблема заключается в том, что я хочу, чтобы индикатор выполнения подсказывал.

Я создал микро-и пользовательскую форму на Excel VBA, когда я дважды щелкнул файл Excel и попытался запустить макрос, он дал мне ошибку: ошибка: Excel VBA Ошибка времени выполнения ’13’.

Здравствуйте, у меня есть требование использовать индикатор выполнения в wpf, в котором я должен связать индикатор выполнения с моим кодом, т. е. когда я нажимаю кнопку импорта, у меня есть.

Копирование многих файлов из нескольких источников в несколько пунктов назначения по нашей сети с помощью MS Access 2016. Можно использовать SysCmd для отображения индикатора выполнения в строке.

Я пытаюсь узнать, как использовать индикатор выполнения с пользовательской формой. Проблема, которую я имею с моим кодом, заключается в том, что он отображает индикатор выполнения после запуска.

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector