Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2015, 18:46   #1
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию ProgressBar

Всем привет!

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

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

предлагаемый ProgressBar в меру информативен и динамичен. отображается в строке статуса.
из настроек у Вас есть начальная строка StartStr и количество шагов Count, которые можно задать отдельно, а можно предать процедуре InitVar. функция State возвращает состояние ProgressBar для i-го шага, в котором есть стартовая строка, % уже выполненых шагов, динамический индикатор процесса и прогноз времени до окончания процесса.

Код:
Sub ProgrBarDemo()
  Dim i As Long, pb
  Set pb = New ProgressBar
  pb.InitVar 500000, "ПрогрессБар Демо: "
  For i = 1 To pb.Count
    Application.StatusBar = pb.State(i)
  Next
  Application.StatusBar = False
End Sub
приятных впечатлений,
Игорь
Вложения
Тип файла: rar ProgressBarDemo.rar (11.3 Кб, 50 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 08.05.2015, 06:44   #2
Евгений Таб
Форумчанин
 
Аватар для Евгений Таб
 
Регистрация: 09.08.2013
Сообщений: 202
По умолчанию

Игорь привет, красота.

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

Спасибо!
Евгений Таб вне форума Ответить с цитированием
Старый 08.05.2015, 11:03   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

експорт модуля класса из вложенного файла, импорт в свою книгу и можно пользоваться
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 15.05.2015, 13:51   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

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

Тепеть все работает гораздо быстее за счет того, что в строке статуса отображается не каждый шаг (как было раньше), а только те, когда строка отображающая состояние процесса изменилась и ее нужно показать
на первом варианте (на моем копьютере)
цикл на 0.5млн. шагов работал чуть больше минуты
то в данном варианте
цикл на 50 млн. шагов работает чуть больше полминуты, т.е.количество вычислений увеличилось в 100 раз, а время затраченное на это уменьшилось вдвое

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

в использовании все просто:
1. Инициируете переменные InitProgressBar К-воШагов, Информационная строка
2. в цикле ProgressBarAt №Шага
3. Очистите строку статуса по окончании цикла Application.StatusBar = False

процедура Test в конце кода - это собственно пример использования ProgressBar, для работы ProgressBar она не нужна, может быть удалена

Код:
Option Explicit
Dim MaxI As Long, Prsnt1 As Single, StartStr As String, PBStatus As String, Position As Long
Dim StartTm As Single, EndTm As String, LastTm As Single


Sub InitProgressBar(pMaxI As Long, pStartStr As String)
  MaxI = pMaxI:  StartStr = pStartStr:  StartTm = Now:  Prsnt1 = Application.Max(MaxI / 100, 1)
End Sub


Sub ProgressBarAt(i As Long)
  Dim E As Long, O As Long, B As Long, s As String, PBs As String
  E = Int(i / Prsnt1): O = 100 - E: B = Int((i Mod Prsnt1) * O / Prsnt1)
  If B <> Position Then
    Position = B
    PBs = StartStr & Format(i / MaxI, "00.0%  ") & String(B, " ") & "I" & String(O - B, " ") & String(E, "I")
    If E > 10 Then
      If Timer < LastTm Then LastTm = Timer
      If Timer - LastTm > 1 Then LastTm = Timer: s = Format((Now - StartTm) * (MaxI - i) / i, "nn:ss")
      If s <> "" Then If EndTm <> s Then EndTm = s
      PBs = PBs & "  " & EndTm
    End If
    If PBs <> PBStatus Then PBStatus = PBs:  Application.StatusBar = PBStatus
  End If
End Sub


Private Sub Test()
  Dim i As Long, tm As Single
  i = 50000000: InitProgressBar i, "TEST ":  tm = Timer
  For i = 1 To i
    ProgressBarAt i
  Next
  Application.StatusBar = False:  MsgBox Timer - tm
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 15.05.2015 в 13:57.
IgorGO вне форума Ответить с цитированием
Старый 17.05.2015, 19:52   #5
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Не было ни гроша, да вдруг алтын!

Вот это тема! Импорт в свой проект, боюсь, займёт всю ночь.

Вы не могли бы в качестве примера использования встроить своё изобретение в какое-нибудь из моих?

Скорострельность последнего высока, но как пример встраивания тоже, надеюсь, пойдёт.

Последний раз редактировалось Sasha_Smirnov; 17.05.2015 в 20:00.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 17.05.2015, 20:52   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Саша, а каие сложности?

1. добавляете модуль в проект (правой кнопкой по имени проекта, Insert, Module) ексель добавит в проект Module1 или Module2 и т.д. (не знаю сколько модулей уже есть в Вашем проекте)
2. в этот самый добавленный модуль копируете код из моего предыдущего сообщения. Все, ProgressBar внедрен в Ваш проект.
3. Чтобы использовать ProgressBar Ваш макрос должен выполлнять какое-то циклическое действие (обработку строк в таблице, обработку символов в строке и пр.)
3.1. Выдолжны наперед знать сколько данных необходимо обработать
а дальше в предыдущем сообщении написано
"в использовании все просто:"
и 3 простых шага... не вижу смысла повторять

почему не внедрил в ваши темы? потому что написано это выполняется 0.3 секунды, это еще меньше...
на быстрых расчетах использование ProgressBar не имеет смысла, на коротких рассчетах 3-5 сек - можно, но без особого эФфекта, а вот если расчет в несколько тысяч шагов, и 20-30 сек и более по времени - на таком расчете ProgressBar отвлечет пользователя от тягостного ожидания.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 17.05.2015, 21:42   #7
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Полшага к цели

Цитата:
Сообщение от IgorGO Посмотреть сообщение
1. добавляете модуль в проект (правой кнопкой по имени проекта, Insert, Module) ексель добавит в проект Module1 или Module2 и т.д. (не знаю сколько модулей уже есть в Вашем проекте)
2 модуля (ваш — второй, Module2). Module1 ищет натуральные делители. Запуск через ALT+F8 в документе Word.
Цитата:
Сообщение от IgorGO Посмотреть сообщение
2. в этот самый добавленный модуль копируете код из моего предыдущего сообщения. Все, ProgressBar внедрен в Ваш проект.
Так и сделал. Самостоятельно настроить пока не берусь (минут 10 только «внедрял»), остальное помню смутно (хоть вы и объяснили).
Цитата:
Сообщение от IgorGO Посмотреть сообщение
Саша, а какие сложности?

3.1. Вы должны наперед знать сколько данных необходимо обработать…
Вот это и есть одна из них! Ну мне так кажется, во всяком случае.

Приложил проект. Для визуализации задержки вводил число из 16—17 единиц. Расчёт идёт секунд 5—10, но, как вы понимаете, пока без полосы.
Изображения
Тип файла: jpg 2015-05-17_212418.jpg (47.0 Кб, 119 просмотров)
Вложения
Тип файла: doc 11111111111111111.doc (32.5 Кб, 12 просмотров)

Последний раз редактировалось Sasha_Smirnov; 17.05.2015 в 21:50. Причина: ALT
Sasha_Smirnov вне форума Ответить с цитированием
Старый 18.05.2015, 03:57   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

отмечаете число, запускаете макрос
Вложения
Тип файла: doc 11111111111111111[1].doc (45.0 Кб, 13 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 18.05.2015, 04:30   #9
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Прогон

Всё работает, IgorGO! Из-за мелькания на скрин не попало, а так видно.

Спасибо, что заинтересовались и нашли время!

На соседнем* форуме программистов в одной из моих тем мне тоже прикрутили этакий движок. Буду изучать.
____________
* вроде бы дружественном...
Изображения
Тип файла: jpg прогон-2.0.jpg (31.1 Кб, 128 просмотров)
Тип файла: jpg прогон-2.1.jpg (38.3 Кб, 124 просмотров)

Последний раз редактировалось Sasha_Smirnov; 18.05.2015 в 04:55.
Sasha_Smirnov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Progressbar kalugin19 Общие вопросы Delphi 4 28.11.2013 14:15
ProgressBar Diamand Microsoft Office Access 5 05.04.2012 22:01
ProgressBar как Slider или Slider как ProgressBar coNsept Общие вопросы .NET 5 08.03.2012 17:00
Progressbar slai Компоненты Delphi 2 18.10.2010 04:36
ProgressBar Andrei Isaev Общие вопросы Delphi 1 20.11.2008 14:59