Как сделать индикатор выполнения

Обновлено: 07.07.2024

Изначально искал, как сделать индикатор процесса в управляемых формах. Почти все ссылки с интернета идут на этот сайт, в результате понял что индикатор делается через функцию Сообщить().
Но тут задумался, а чего бы не сделать чтоб в таблице на форме в одной колонке можно было вывести индикатор для каждой строки?
оказалось не так и сложно, больше времени ушло на прорисовку графического индикатора для каждого процента (итого 100 картинок)
Дальше встал вопрос как их вместить в обработку и как вызывать?
в результате получилась вот такая вот обработка, которая содержит в себе кучу примеров работы в управляемых формах, а именно:
1. вывод картики в ячейки табличной части через навигационную ссылку
2. обращение к макету и вытаскивание из него картинок
3. создание навигационных ссылок для внешних графических файлов, и подсовование их "на лету" в форму

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

при обработке результата определяем процент и вызываем ссылку из списка значений

надеюсь кому то пригодится, по мне так очень красиво получается если использовать в обработках обмена :)

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

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

Прогресс бар в VBA Excel

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

Я знаю, что я должен использовать progressbar контроль, но я пытался на некоторое время, но не могу это сделать.

Как сделать прогресс бар в excel?

Это очень проста в реализации:

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

Используя некоторые символы Unicode, вы можете имитировать прогресс бар. 9608 — 9615 являются кодами я пытался за решетку. Просто выберите один в зависимости от того, сколько места вы хотите, чтобы показать, между планками.

Вы можете установить длину строки, изменив NUM_BARS. Кроме того, используя класс, вы можете настроить его для обработки инициализации и автоматически отпуская StatusBar.

После того, как объект выходит из области видимости он будет автоматически очистить и освободить StatusBar обратно в Excel.

‘ Class Module — ProgressBar Option Explicit

Private statusBarState As Boolean
Private enableEventsState As Boolean
Private screenUpdatingState As Boolean
Private Const NUM_BARS As Integer = 50
Private Const MAX_LENGTH As Integer = 255
Private BAR_CHAR As String
Private SPACE_CHAR As String

Private Sub Class_Initialize() ‘ Save the state of the variables to change
statusBarState = Application.DisplayStatusBar
enableEventsState = Application.EnableEvents
screenUpdatingState = Application.ScreenUpdating’ set the progress bar chars (should be equal size)
BAR_CHAR = ChrW(9608) SPACE_CHAR = ChrW(9620) ‘ Set the desired state
Application.DisplayStatusBar = True Application.ScreenUpdating = False
Application.EnableEvents = False
End Sub

Private Sub Class_Terminate() ‘ Restore settings
Application.DisplayStatusBar = statusBarState
Application.ScreenUpdating = screenUpdatingState
Application.EnableEvents = enableEventsState
Application.StatusBar = False
End Sub

Dim progressBar As New ProgressBar

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

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

Sub ShowProgress()
UserForm1.Show
End Sub

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

UserForm1 = canvas to hold other 5 elements
CommandButton2 = Run Progress Bar Code; Caption:Run
CommandButton1 = Close UserForm1; Caption:Close
Bar1 (label) = Progress bar graphic; BackColor:Blue
BarBox (label) = Empty box to frame Progress Bar; BackColor:White
Counter (label) = Display the integers used to drive the progress bar

======== Attach the following code to UserForm1 =========

Private Sub UserForm_Initialize()

Bar1.Tag = Bar1.Width
Bar1.Width = 0

End Sub
Sub ProgressBarDemo()
Dim intIndex As Integer
Dim sngPercent As Single
Dim intMax As Integer
‘==============================================
‘====== Bar Length Calculation Start ==========

‘————————————————‘
‘ This section is where you can use your own ‘
‘ variables to increase bar length. ‘
‘ Set intMax to your total number of passes ‘
‘ to match bar length to code progress. ‘
‘ This sample code automatically runs 1 to 100 ‘
‘————————————————‘
intMax = 100
For intIndex = 1 To intMax
sngPercent = intIndex / intMax
Bar1.Width = Int(Bar1.Tag * sngPercent)
Counter.Caption = intIndex

DoEvents
‘————————
‘ Your production code would go here and cycle
‘ back to pass through the bar length calculation
‘ increasing the bar length on each pass.
‘————————

‘this is a delay to keep the loop from overrunning memory
‘remove after testing is complete
Sleep 10

End Sub
Private Sub CommandButton1_Click() ‘CLOSE button

End Sub
Private Sub CommandButton2_Click() ‘RUN button

Sub ShowProgress()
UserForm1.Show
End Sub

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

Все, что вам нужно сделать, это импортировать форму и модуль в ваших проектах, и вызвать прогресс бар с: Call modProgress.ShowProgress (ActionIndex, TotalActions, название…..)

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

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

Как сделать прогресс бар в excel?

Как сделать прогресс бар в excel?

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

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

1. dots ….
2 10 to 1 count down
3. progress bar (default)
4. just percentage.

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

Const x As Long = 150000
Dim i&, PB$

For i = 1 To x
DoEvents
UpdateProgress i, x
Next i

Визуализация работы макроса при помощи прогресс-бара

Как сделать прогресс бар в excel?

Данный прогресс-бар позволяет отображать ход выполнения любого макроса.

Для использования этого индикатора перетащите из файла-примера в свой файл модуль класса ProgressIndicator и форму F_Progress

Использовать прогресс бар сравнительно просто — достаточно добавить в макрос несколько строк кода:

Sub ФорматированиеЯчейки(ByVal n As Long) ‘ вызываемый макрос Cells(n).Interior.ColorIndex = 15: Cells(n).BorderAround xlContinuous
End Sub

  1. Давайте рассмотрим подробнее работу с индикатором.
  2. Прогресс-бар выполнен в виде модуля класса, поэтому, для начала работы с ним, надо прежде всего создать экземпляр этого класса:

Dim pi As New ProgressIndicator ‘ создаём новый прогресс-бар

  • Итак, прогресс-бар создан, и теперь надо его отобразить.
  • Для этого мы используем метод Show объекта типа ProgressIndicator:
  1. При использовании метода Show мы сразу задаём заголовок индикатора (можно здесь указать название вашего макроса)
  2. Индикатор появился на экране — но полоса не отображается, ибо процент выполнения по-умолчанию равен нулю.
  3. Для каждого действия мы будем задавать начальный и конечный процент выполнения задачи
  4. К примеру, если первое действие вашего макроса занимает по времени примерно пятую часть от времени выполнения всего макроса, то мы укажем интервал для индикатора от 0% до 20%:
  5. Как вы заметили, для запуска очередного действия используется метод StartNewAction объекта ProgressIndicator.
  6. При вызове этого метода можно сразу задать текст для каждой из 3 текстовых строк индикатора:

(например, основное действие — это форматирование ячеек (от 0% до 20% индикатора), а поддействия — это окраска отдельных ячеек (первая строка — от 0% до 1% индикатора, вторая строка — от 1% до 2%, и т.д.))

Чтобы нам не мучиться с расчётами этих процентов, мы просто задаём количество действий (например, количество форматируемых ячеек, равное 3000), и индикатор сам разделит диапазон от 0% до 20% на 3000 равных частей, плавно увеличивая длину полосы индикатора по мере форматирования отдельных ячеек.

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

В этом случае (если значения некоторых из 3 строк индикатора не заданы), эти строки не изменяются (в первой строке индикатора останется текст, заданный ранее при использовании метода StartNewAction)

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

  • $index и $count — для вывода строк типа «Обрабатывается ячейка 515 из 3000«,
  • $time — для вывода ожидаемого времени до окончания макроса
  • (макрос анализирует текущий процент выполнения и затраченное время, и предсказывает, сколько времени осталось до окончания всех действий)
  • Если же необходимо просто увеличить длину полоски индикатора — можете использовать метод SubAction без параметров:
  • Вы можете выводить сколько угодно действий в индикаторе, причем совсем не обязательно, чтобы начальный процент очередного действия был равен конечному проценту предыдущего.
  • Вполне допустим следующий код:

По окончании макроса желательно закрыть прогресс бар:

pi.Hide ‘ закрываем индикатор

У объекта ProgressIndicator имеется много различных свойств и методов.

Вкратце расскажу о некоторых свойствах:

  • свойство Caption позволяет задать новый заголовок индикатора
  • свойство FP позволяет получить доступ к отображаемой форме (и всем её элементам управления) (например, код pi.FP.PrintForm выведет индикатор на печать)
  • свойства Line1, Line2 и Line3 позволяют в любом месте кода задать текст конкретной строки индикатора
  • свойства ShowPercents и ShowTime включают или выключают отображение процента выполнения и времени в заголовке индикатора (по умолчанию оба свойства имеют значение TRUE, т.е. в заголовке отображается и время, и процент выполнения макроса)

Из функций объекта мы рассмотрим только одну: AddChildIndicator

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

Новая версия прогресс-бара — с поддержкой отображения лога на индикаторе, и возможностью отображения лога в виде текстового файла.

Как сделать прогресс бар в excel?

Высоту текстового поля с логом можно изменять:

Как сделать прогресс бар в excel?

Новая версия индикатора, и примеры его использования — во втором прикреплённом файле.

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

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

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

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

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

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

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

Как сделать прогресс бар в excel?

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

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

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

Update – обновляет форму, если прошел интервал заданный методом setParameters. Данный метод принимает два необязательных аргумента:

  • curProcess – целое число. Номер текущего этапа процесса;
  • stringTextBox – строка для элемента TextBox.
  • exitBar – закрывает прогресс бар и выгружает форму из памяти.
  • getForm – возвращает ссылку на форму прогресс бара.

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

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

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

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

Второй причиной является производительность. Не смотря на то, что идея вывода информации по загрузке является вполне обоснованной, само ее использование сильно замедляет процесс. Например, с использованием ProgressBar время обработки нижеприведенного примера составляет 1 минута 17 секунд при установленном интервале обновления в секунду.

При обновлении формы на каждом этапе, за 2 минуты обработалось чуть больше 2 сотых процента. Без использования на все ушло 8 секунд.

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

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

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

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

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

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

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

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

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

Как сделать прогресс бар в excel?

Ответы 1

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

Код так с этим изменением:

К сожалению, у нас сейчас проблема. Метод запускает загрузку в фоновом режиме, и ваш код сразу же продолжает работу. Это означает, что вы нажимаете кнопку, появляется первый MessageBox, второй MessageBox появляется сразу после первого, и если ваша загрузка не завершена, когда вы закрываете второй, ваш файл выполняется слишком рано.

Чтобы избежать этого, WebClient имеет Мероприятия. Тот, который нам нужен, называется DownloadFileCompleted . Как следует из названия, он выполняет все, что вы хотите, когда загрузка завершена. Итак, давайте посмотрим на новый код:

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

Теперь давайте предположим, что пользователь может нажать кнопку во второй раз, прежде чем загрузка будет завершена. Тогда наш клиент будет перезаписан, и загрузка будет отменена. Так что давайте просто проигнорируем нажатие кнопки, если мы уже что-то загружаем, и создадим новый клиент, только если у нас его нет. Новый код:

Теперь, когда скучная часть сделана, давайте перейдем к вашей проблеме: просмотр прогресса в индикаторе выполнения. У WebClient есть еще одно событие под названием DownloadProgressChanged . Мы можем использовать его для обновления нашего индикатора выполнения.

Говоря о индикаторах выполнения: в Windows Forms вы можете создать его, выполнив поиск ProgressBar в окне инструментов в Visual Studio. Затем поместите его где-нибудь в вашем окне. Компонент ProgressBar имеет несколько свойств, важных для его диапазона. Нам повезло, значения по умолчанию именно то, что нам нужно.

Наш обновленный код (при условии, что ваш индикатор выполнения называется progressBar1 :

  1. Вы можете создать метод FormClosing , дважды щелкнув событие FormClosing в поле свойств вашего окна.
  2. Вызов client.Dispose() необходим только тогда, когда ваша программа не завершается после закрытия окна. В любом другом случае вы можете полностью избавиться от FormClosing .

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

Большое спасибо за этот удивительно структурированный ответ. Все идет отлично, кроме индикатора прогресса. Он остается пустым до тех пор, пока файл не будет полностью загружен. Который потом только прыгает из пустого в полностью заполненный. Я попытался просмотреть код и манипулировать несколькими вещами. Но он делает то же самое. Это проблема с гугл диском? РЕДАКТИРОВАТЬ Я попробовал это с файлом меньшего размера, и это сработало чудесно! Еще раз, спасибо!

Как я могу создать индикатор выполнения в копировании или SQL-запросе или передаче файлов (rapi)?

Или что-то, что я не могу измерить?

Спасибо за любую помощь.

Ну . действительно, поскольку вы не можете измерить, вам просто нужно угадать. Вы когда-либо устанавливали окна, а индикатор выполнения очень медленно двигался, но потом вдруг он прыгает очень много?

Пара идей. Если у вас есть только один запрос SQL, вы можете медленно перемещать индикатор выполнения с течением времени (например, 0,5% в секунду?). Тогда, если запрос не закончил к тому времени, когда он достиг 90%, остановите его. Тогда не позволяйте этому закончить, пока это не будет сделано. Если он заканчивается рано (в то время как медленный подъем продолжается), просто прыгайте на 100%.

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

Читайте также: