Dim pi as new progressindicator как исправить

 

Лина

Пользователь

Сообщений: 223
Регистрация: 03.11.2014

#1

06.03.2015 21:39:25

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

Код
Dim pi As New ProgressIndicator ' создаём новый прогресс-бар pi.Show "Подождите, работает макрос" ' отбражаем индикатор 

' код макроса 
Application.ScreenUpdating = False 
Range("B22".Select 
Selection.AutoFill Destination:=Range("B2200", Type:=xlFillDefault 
Range("B2200".Select 
Range("B201201".Select 
Selection.AutoFill Destination:=Range("B201400", Type:=xlFillDefault 
Range("B201400".Select 
Range("E2".Select 
ActiveCell.FormulaR1C1 = "1" 
Selection.AutoFill Destination:=Range("E2:E400", Type:=xlFillDefault 
Range("E2:E400".Select
Range("C1".Select 

'Dim rng As Range 
With ThisWorkbook.Worksheets("раскрой двп".Range("C:C" 
Set Rng = .Find(0, , LookIn:=xlValues, lookat:=xlWhole) 
If Not Rng Is Nothing Then 
Do 
Rng.EntireRow.Delete 
Set Rng = .FindNext() 
Loop While Not Rng Is Nothing 
End If 
End With 

For Each cell In Sheets("раскрой двп".Range("A2200" 
cell.Formula = cell.Value 
Next cell 

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

   

Изменено: Лина07.03.2015 03:40:53

 

The_Prist

Пользователь

Сообщений: 14257
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Лина, читать код совершенно неудобно. Сами гляньте. Исправьте, пожалуйста, применив теги кода. Это кнопочка <…> чуть выше поля, где набираете сообщение.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Приложите файл-пример, помогут быстрее
Прогресс бар

отсюда

?
Может я чего-то не понимаю.. Но какой смысл в прогресс баре, если отключено обновление экрана?

Изменено: Alexander8806.03.2015 23:21:50

 

Лина

Пользователь

Сообщений: 223
Регистрация: 03.11.2014

Вот файл

Прикрепленные файлы

  • Книга1.xlsm (23.66 КБ)

 

Sanja

Пользователь

Сообщений: 14849
Регистрация: 10.01.2013

#5

06.03.2015 23:52:35

А Вы все по инструкции сделали? Если прогрессбар именно

«оттуда»

, то:

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

в Вашем файле их нет

Изменено: Sanja07.03.2015 03:41:24

Согласие есть продукт при полном непротивлении сторон.

 

Лина

Пользователь

Сообщений: 223
Регистрация: 03.11.2014

 

Юрий М

Модератор

Сообщений: 60744
Регистрация: 14.09.2012

Контакты см. в профиле

#7

07.03.2015 01:19:52

Лина

, а цитировать зачем? Вы можете просто отвечать?

Прогресс-бар на VBA

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

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

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

Sub ПростейшийПримерИспользованияПрогрессБара()
    Dim pi As New ProgressIndicator    ' создаём новый прогресс-бар
    pi.Show "Подождите, работает макрос"    ' отбражаем индикатор

    ' здесь код вашего макроса

    pi.Hide    ' закрываем индикатор
End Sub
Sub ПримерИспользованияПрогрессБара()
 
    КоличествоЗапусковВнешнегоМакроса = 3000
 
    Dim pi As New ProgressIndicator    ' создаём новый прогресс-бар
    pi.Show "Форматирование ячеек"    ' отбражаем индикатор

    ' первое действие (на шкале индикатора от 0 до 95 процентов) - это окраска ячеек
    pi.StartNewAction 0, 95, "Окраска ячеек", , , КоличествоЗапусковВнешнегоМакроса
 
 
 
    ' цикл с вызовом внешнего макроса "ФорматированиеЯчейки"
    For i = 1 To КоличествоЗапусковВнешнегоМакроса
 
        ' инициируем очередное действие в индикаторе
        pi.SubAction , "Обрабатывается ячейка $index из $count", "$time"
 
        ' собственно, код цикла
        ФорматированиеЯчейки i
    Next
 
    ' всё покрасили - теперь пора чистить ячейки )
    pi.StartNewAction 95, 100, "Очистка ячеек"
    Cells.Clear
 
    pi.Hide    ' закрываем индикатор
End Sub
 
Sub ФорматированиеЯчейки(ByVal n As Long)    ' вызываемый макрос
    Cells(n).Interior.ColorIndex = 15: Cells(n).BorderAround xlContinuous
End Sub

Давайте рассмотрим подробнее работу с индикатором.

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

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

Итак, прогресс-бар создан, и теперь надо его отобразить.

Для этого мы используем метод Show объекта типа ProgressIndicator:

pi.Show "Форматирование ячеек"    ' отбражаем индикатор

При использовании метода Show мы сразу задаём заголовок индикатора (можно здесь указать название вашего макроса)

Индикатор появился на экране — но полоса не отображается, ибо процент выполнения по-умолчанию равен нулю.

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

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

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

При вызове этого метода можно сразу задать текст для каждой из 3 текстовых строк индикатора:

pi.StartNewAction 0, 20, "Текст первой строки", "Текст строки 2", "Текст строки 3"

Если действие состоит из нескольких отдельных «поддействий», то можно также сразу задать и количество этих «поддействий»

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

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

 pi.StartNewAction 0, 20, "Окраска ячеек", , , 3000

Чтобы уведомить индикатор об очередном «поддействии» внутри цикла, мы используем метод SubAction объекта ProgressIndicator

' инициируем очередное действие в индикаторе
        pi.SubAction , "Обрабатывается ячейка $index из $count", "$time"

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

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

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

  • $index и $count — для вывода строк типа «Обрабатывается ячейка 515 из 3000«,
  • $time — для вывода ожидаемого времени до окончания макроса

(макрос анализирует текущий процент выполнения и затраченное время, и предсказывает, сколько времени осталось до окончания всех действий)

Если же необходимо просто увеличить длину полоски индикатора — можете использовать метод SubAction без параметров:

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

Вполне допустим следующий код:

    pi.StartNewAction 5, 20, "Действие 1"    ' начинаем не с нуля
    pi.StartNewAction 20, 50, "Действие 2"    ' начинается сразу после предыдущего
    pi.StartNewAction 35, 60, "Действие 3"    ' начинается раньше предыдущего
    pi.StartNewAction 85, 90, "Действие 4"    ' начинается через время после предыдущего
    pi.StartNewAction 10, 100, "Действие 5"    ' начинаем почти всё сначала

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

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

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

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

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

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

Эта функция создаёт дочерний прогресс бар, и отображает его выше или ниже родительского:

' создаём дочерний индикатор, и выводим его ниже основного
    Dim pi2 As ProgressIndicator
    Set pi2 = pi.AddChildIndicator("Раскрашивание ячеек", 1)

При изменении процента выполнения в дочернем индикаторе пропорционально меняется и процент выполнения главного (родительского) прогресс-бара.

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

На индикаторе присутствует кнопка «Отмена» — её нажатие вызывает останов всех запущенных макросов
(выполняется команда End, останавливающая все макросы, и обнуляющая все переменные)

Поскольку у этой кнопки свойство Cancel установлено в TRUE, нажатие на клавиатуре клавиши ESC равносильно нажатию кнопки «Отмена»
(при нажатии Esc макрос останавливается)


добавлено 23.02.2012

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

новая версия прогресс-бара

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

вывод лога макроса на индикаторе выполнения

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


PS: Идеальный прогресс-бар должен работать так  :)

  • 116234 просмотра

Не получается применить макрос? Не удаётся изменить код под свои нужды?

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

Xtaz2011

0 / 0 / 0

Регистрация: 29.03.2017

Сообщений: 3

1

Сборщик данных не корректно работатет

03.04.2017, 18:35. Показов 656. Ответов 4

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Дорогие форумчане, не пойму, что не так, в какой- то момент файл начал собирать не с 3-ей строки, а со второй, хотя второй кусок кода, где должно быть с 100 строки, идёт нормально.
Сможете подсказать где косяк??

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Sub LoadDataFromWorkbooks()
    On Error Resume Next: shd.UsedRange.Offset(2).ClearContents
    On Error Resume Next: shd1.UsedRange.Offset(2).ClearContents
    On Error Resume Next: Err.Clear
    Dim AskForFolder As Boolean: AskForFolder = Not shd.OLEObjects("SaveFolderPath").Object.Value
 
    ' запрашиваем пути к папкам с файлами
    msg1$ = "Выберите папку с файлами для обработки"
    InvoiceFolder$ = GetFolder(1, AskForFolder, msg1$)
    If InvoiceFolder$ = "" Then MsgBox "Не задана папка с файлами для обработки", vbCritical, "Обработка заявок невозможна": Exit Sub
 
    Dim coll As Collection
    Set coll = FilenamesCollection(InvoiceFolder$, "*.xls*", 1)
 
    If coll.Count = 0 Then
        MsgBox "Не найдено ни одной заявки для обработки в папке" & vbNewLine & InvoiceFolder$, _
               vbExclamation, "Нет необработанных заявок"
        Exit Sub
    End If
 
    Dim pi As New ProgressIndicator: pi.Show "Обработка заявок", , 2
    pi.StartNewAction , , , , , coll.Count
    Dim WB As Workbook, sh As Worksheet, ra As Range
    Application.ScreenUpdating = False
 
    
    For Each Filename In coll
 
        
        pi.SubAction "Обрабатывается файл $index из $count", "Файл: " & Dir(Filename), "$time"
        pi.Log "Файл: " & Dir(Filename)
 
        
        Set WB = Nothing: Set WB = Workbooks.Open(Filename, False, True)
 
        If WB Is Nothing Then
            pi.Log vbTab & "ОШИБКА при загрузке файла. Файл не обработан."
 
        Else
            Set sh = WB.Worksheets(1)
            Set ra = sh.Range(sh.Range("a3"), sh.Range("a" & sh.Rows.Count).End(xlUp)).Resize(, 50)
            shd.Range("a" & shd.Rows.Count).End(xlUp).Offset(1).Resize(ra.Rows.Count, ra.Columns.Count).Value = ra.Value
            
            Set sh = WB.Worksheets(2)
            Set ra = sh.Range(sh.Range("a100"), sh.Range("a" & sh.Rows.Count).End(xlUp)).Resize(, 70)
            shd1.Range("a" & shd1.Rows.Count).End(xlUp).Offset(1).Resize(ra.Rows.Count, ra.Columns.Count).Value = ra.Value
           
            WB.Close False: DoEvents
            pi.Log vbTab & "Файл успешно обработан."
 
        End If
    Next
 
    pi.Hide: DoEvents: Application.ScreenUpdating = True
    MsgBox "Обработка заявок завершена", vbInformation
End Sub

Добавлено через 58 секунд
Самое забавное, что косяк не критичный, но прям бесит



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

03.04.2017, 18:35

4

kalbasiatka

414 / 262 / 82

Регистрация: 27.10.2012

Сообщений: 860

03.04.2017, 18:54

2

Visual Basic
1
...sh.Range("a" & sh.Rows.Count).End(xlUp))...

Ищется последняя заполненная ячейка в столбце «А». Скорее всего столбец пустой и хватает 2ю строку.



0



0 / 0 / 0

Регистрация: 29.03.2017

Сообщений: 3

03.04.2017, 19:14

 [ТС]

3

Да в том и дело, что столбец полон, А1-«ФИО», А2-«Дата», начиная с А3 идёт заполнение нужными данными

Добавлено через 6 минут
Ааааа, всё, сорян, всё ОК, сам закосячил, А3 хотел вставить дату и скрыть строку (чтоб всегда была и не было такого косяка), а вставил повторно 2ю строчку…



0



6878 / 2810 / 534

Регистрация: 19.10.2012

Сообщений: 8,571

03.04.2017, 19:35

4

Цитата
Сообщение от Xtaz2011
Посмотреть сообщение

и скрыть строку

— кстати метод с Rows.Count).End(xlUp) может наврать когда есть скрытые строки, смотрите осторожно там
Я в важных макросах стараюсь не забывать перед применением снимать все фильтры и отображать все строки.



0



0 / 0 / 0

Регистрация: 29.03.2017

Сообщений: 3

03.04.2017, 19:43

 [ТС]

5

не совсем скрыть, я сужаю до 1 пикселя



0



Формулировка задачи:

Дорогие, не пойму, что не так, в какой- то момент файл начал собирать не с 3-ей строки, а со второй, хотя второй кусок кода, где должно быть с 100 строки, идёт нормально.
Сможете подсказать где косяк??

Самое забавное, что косяк не критичный, но прям бесит

Код к задаче: «Сборщик данных не корректно работатет»

textual

...sh.Range("a" & sh.Rows.Count).End(xlUp))...

Полезно ли:

13   голосов , оценка 4.000 из 5

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

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

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

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

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

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

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

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

Dim x As Integer Dim MyTimer As Double ‘Change this loop as needed. For x = 1 To 50’ Do stuff
Application.StatusBar = «Progress: » & x & » of 50: » & Format(x / 50, «0%») Next x Application.StatusBar = False

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

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

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

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

Как сделать прогресс бар в excel? Как сделать прогресс бар в 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

Public Sub Update(ByVal Value As Long, _
Optional ByVal MaxValue As Long= 0, _
Optional ByVal Status As String = «», _
Optional ByVal DisplayPercent As Boolean = True) ‘ Value : 0 to 100 (if no max is set) ‘ Value : >=0 (if max is set) ‘ MaxValue : >= 0′ Status : optional message to display for user’ DisplayPercent : Display the percent complete after the status bar» Validate entries
If Value < 0 Or MaxValue < 0 Or (Value > 100 And MaxValue = 0) Then Exit Sub ‘ If the maximum is set then adjust value to be in the range 0 to 100
If MaxValue > 0 Then Value = WorksheetFunction.RoundUp((Value * 100) / MaxValue, 0)’ Message to set the status bar to
Dim display As String
display = Status & » «‘ Set bars display = display & String(Int(Value / (100 / NUM_BARS)), BAR_CHAR)’ set spaces
display = display & String(NUM_BARS — Int(Value / (100 / NUM_BARS)), SPACE_CHAR) ‘ Closing character to show end of the bar
display = display & BAR_CHAR If DisplayPercent = True Then display = display & » (» & Value & «%) » ‘ chop off to the maximum length if necessary
If Len(display) > MAX_LENGTH Then display = Right(display, MAX_LENGTH) Application.StatusBar = display
End Sub

Пример использования:

Dim progressBar As New ProgressBar

For i = 1 To 100
Call progressBar.Update(i, 100, «My Message Here», True)
Application.Wait (Now + TimeValue(«0:00:01»))
Next

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

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

http://www.andypope.info/vba/pmeter.htm

============== This code goes in Module1 ============

Sub ShowProgress()
UserForm1.Show
End Sub

============== Module1 Code Block End =============

Создание кнопки на рабочем листе; Кнопка карта для «ShowProgress» макро

Создание 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 =========

Option Explicit’ This is used to create a delay to prevent memory overflow ‘ remove after software testing is complete Private Declare Sub Sleep Lib «kernel32» (ByVal dwMilliseconds As Long)

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

‘======= Bar Length Calculation End ===========
‘==============================================

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

Next

End Sub
Private Sub CommandButton1_Click() ‘CLOSE button

Unload Me

End Sub
Private Sub CommandButton2_Click() ‘RUN button

ProgressBarDemo

End Sub

================= UserForm1 Code Block End =====================

============== This code goes in Module1 =============

Sub ShowProgress()
UserForm1.Show
End Sub

============== Module1 Code Block End =============

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

Вот блоге я писал об этом: http://strugglingtoexcel.wordpress.com/2014/03/27/progress-bar-excel-vba/

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

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

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

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

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

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

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

For intRow = 1 To shData.Range(«tblData»).Rows.Count

shData.Range(«ScanProgress»).Value = intRow / shData.Range(«tblData»).Rows.Count
DoEvents ‘ Other processing

Next intRow

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

Привет Модифицированная версия другого сообщению Марецкая. Имеет 4 стиля

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

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

Sub ShowProgress()

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

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

Application.StatusBar = «»
End Sub ‘ShowProgress

Sub UpdateProgress(icurr As Long, imax As Long, Optional istyle As Integer = 3)
Dim PB$
PB = Format(icurr / imax, «00 %»)
If istyle = 1 Then ‘ text dots >>….

Источник: https://myht.ru/question/5181164-progress-bar-v-vba-excel

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

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

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

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

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

Sub ПростейшийПримерИспользованияПрогрессБара() Dim pi As New ProgressIndicator ‘ создаём новый прогресс-бар pi.Show «Подождите, работает макрос» ‘ отбражаем индикатор ‘ здесь код вашего макроса pi.Hide ‘ закрываем индикатор
End Sub
Sub Пример

ИспользованияПрогрессБара()
КоличествоЗапусковВнешнегоМакроса = 3000
Dim pi As New ProgressIndicator ‘ создаём новый прогресс-бар
pi.Show «Форматирование ячеек» ‘ отбражаем индикатор’ первое действие (на шкале индикатора от 0 до 95 процентов) — это окраска ячеек
pi.StartNewAction 0, 95, «Окраска ячеек», , , КоличествоЗапусковВнешнегоМакроса  ‘ цикл с вызовом внешнего макроса «ФорматированиеЯчейки»
For i = 1 To КоличествоЗапусковВнешнегоМакроса  ‘ инициируем очередное действие в индикатореpi.SubAction , «Обрабатывается ячейка $index из $count», «$time»  ‘ собственно, код цикла ФорматированиеЯчейки i Next  ‘ всё покрасили — теперь пора чистить ячейки )pi.StartNewAction 95, 100, «Очистка ячеек» Cells.Clear  pi.Hide ‘ закрываем индикатор

End Sub

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:

pi.Show «Форматирование ячеек» ‘ отбражаем индикатор

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

pi.StartNewAction 0, 20, «Текст первой строки», «Текст строки 2», «Текст строки 3»
Как сделать прогресс бар в excel?

Если действие состоит из нескольких отдельных «поддействий», то можно также сразу задать и количество этих «поддействий»

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

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

pi.StartNewAction 0, 20, «Окраска ячеек», , , 3000

  • Чтобы уведомить индикатор об очередном «поддействии» внутри цикла, мы используем метод SubAction объекта ProgressIndicator‘ инициируем очередное действие в индикаторе pi.SubAction , «Обрабатывается ячейка $index из $count», «$time»

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

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

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

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

pi.StartNewAction 5, 20, «Действие 1» ‘ начинаем не с нуля
pi.StartNewAction 20, 50, «Действие 2» ‘ начинается сразу после предыдущего
pi.StartNewAction 35, 60, «Действие 3» ‘ начинается раньше предыдущего
pi.StartNewAction 85, 90, «Действие 4» ‘ начинается через время после предыдущего
pi.StartNewAction 10, 100, «Действие 5» ‘ начинаем почти всё сначала

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

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

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

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

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

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

Эта функция создаёт дочерний прогресс бар, и отображает его выше или ниже родительского:’ создаём дочерний индикатор, и выводим его ниже основного
Dim pi2 As ProgressIndicator Set pi2 = pi.AddChildIndicator(«Раскрашивание ячеек», 1)

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

На индикаторе присутствует кнопка «Отмена» — её нажатие вызывает останов всех запущенных макросов (выполняется команда End, останавливающая все макросы, и обнуляющая все переменные)

Поскольку у этой кнопки свойство Cancel установлено в TRUE, нажатие на клавиатуре клавиши ESC равносильно нажатию кнопки «Отмена» (при нажатии Esc макрос останавливается)

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

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

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

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

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

Источник: https://ExcelVBA.ru/code/tools/ProgressIndicator

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

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

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

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

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

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

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

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

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

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

В случае ненадобности тех или иных элементов, их можно не выводить. Контроль за выводом элементов осуществляет класс «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 секунд.

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

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

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

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

Sub test() ‘ Объявляем переменную для загрузки строки
Dim strC As String
strC = Cells(1, 1).Value’ увеличиваем ее содержание
strC = strC & strC & strC & strC & strC
strC = strC & strC & strC & strC & strC
strC = strC & strC & strC & strC & strC
strC = strC & strC & strC & strC & strC
strC = strC & strC & strC & strC & str’ создаем экземпляр класса прогресс бара
Dim bar As ProgressBar Set bar = New ProgressBar ‘ создаем элементы формы прогресс бара ‘ последовательность создания элементов не имеет никакого значения, т.к. ‘ перед его создание проверяется наличие остальных. Если элементы найдены, то они сдвигаются
bar.createtimeFinish ‘ вывод строки для оставшегося времени
bar.createLoadingBar ‘ вывод полосы загрузки
bar.createString ‘ вывод строки пройденных этапов из общего количества с указанием процента
bar.createtimeDuration ‘ текущая время обработки процесса
bar.createTextBox ‘ вывод пустого текстового поля
bar.setParameters Len(strC), 0, 5 ‘ Задание параметров для последующей обработки:’ 1 — указание числа этапов процесса;’ 2 — интервал обновления формы, в данном случае ноль, но можно вовсе опустить ‘ 3 — интервал обновления в секундах, применяется, только если предыдущий аргумент равен нулю или опущен bar.Start ‘ запускаем прогресс бар перед началом процесса For i = 1 To Len(strC)
ch = Mid(strC, i, 1) bar.Update i ‘ обновляем прогресс бар и передаем ему номер текущего этапа процесса’ вторым аргументом можно передать строку для текстового поля, но она попадет туда только в случае,’ если интервал это позволяет, поэтому к элементу формы можно обратиться по его имени «Text»
Next ibar.exitBar ‘ Закрываем прогресс бар Set bar = Nothing ‘ удаляем экземпляр класса прогресс бара End Sub

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

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

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

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

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

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

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

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

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

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

Источник: https://my-excel.ru/vba/excel-vba-progress-bar.html

Понравилась статья? Поделить с друзьями:
  • Как найти моль все формулы
  • Как найти что я считаю классным
  • Как найти почту знакомых
  • Как найти вещь на столе
  • Как найти песню через видео на телефоне