Страницы: 1
RSS
как "привязать" стандартный progressbar к выполнению макроса
 
Добрый вечер! Заранее извините за, вероятно, простой вопрос. В очередной раз уповаю на форум, поскольку для меня вопрос простым не является.  
Ищу возможность визуализировать процесс выполнения макроса (чтобы пользователи не думали, что программа зависла). Нашла много вариантов progressbar`ов, но не могу понять, как их "привязывать" к выполнению конкретных макросов.  
Для простоты и бесхитростности мне подойдет и стандартный progressbar, из additional controls.  
 
В моих userform есть несколько commandbutton, каждая из которых запускает разные макросы:  
Private Sub CommandButton5_Click()  
Call ImportZ_Step3  
End Sub  
 
В инете я нашла код работы стандартного progressbar:  
iMax = 65000  
Me.ProgressBar1.Max = iMax  
For iCount = 1 To iMax  
   Me.ProgressBar1.Value = iCount  
Next  
Me.ProgressBar1.Value = 0  
 
Подскажите, пожалуйста, как прописать работу progressbar во время выполнения макроса? Так, что бы эти процессы шли не один за другим, а одновременно: макрос работает - progressbar заполняется, макрос отработал - progressbar обнулился.
 
если у Вас макросы с циклами то:  
а теле этого цикла    
Me.ProgressBar1.Value = i/Count, где i-я итерация, count - общее число шагов.  
 
если макросы без циклов, то можно через промежутки кода вставить фиксированные значения, к примеру  
Me.ProgressBar1.Value = 20  
...  
Me.ProgressBar1.Value = 40
 
чуть не забыл  
ятобы картинка не зависала не забыть вставить DoEvents. для надежности 2 штуки)  
 
DoEvents  
Me.ProgressBar1.Value = i/Count,  
DoEvents
 
офф - вообще-то лучше писать макросы, которые работают секунды и не требуют прогрессбаров - пусть не так красиво, зато быстро, и код проще :)  
И кстати прогрессбар тоже неплохо время потребляет - если макрос без него может отработать за пару секунд, то с баром уже может быть порядка десяти секунд, особенно если его на каждом цикле отрисовывать, без пропусков.
 
Спасибо, будем пробовать!
 
Hugo, а помните я выкладывал простенький ПБ и мы с Вами время замеряли с неи и без. И получилось с ним быстрее) Вот прикол ^_^  
 
\простенький ПБ
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Помню, но про время забыл :)  
Но согласитесь, это исключение, подверждающее правило :)  
Я вот прямо сейчас погонял:  
 
11,17188    
3,515625    
3,125    
3,5    
11,25    
10,1875    
 
И это работа напрямую с ячейками, сейчас на массиве попробую.
 
На массиве:  
 
Sub io()  
Dim tm: tm = Timer  
Dim i&  
ReDim a(1 To Rows.Count, 1 To 1)  
 
For i = 1 To Rows.Count  
   a(i, 1) = i  
'    goPBar 1, Rows.Count, i, 100  
Next  
[a1].Resize(Rows.Count) = a
Debug.Print Timer - tm  
End Sub  
 
 
2,921875    
2,90625    
0,703125    
0,71875
 
>>Но согласитесь, это исключение, подверждающее правило :)  
Конечно же, на массивах быстрее. Но бывают случаи, когда не уйти от перебора именно ячеек. Тогда ПБ может быть очень кстати)  
 
с баром  
5,390625    
5,484375    
5,40625    
 
без  
6,890625    
6,90625    
6,84375    
 
на массиве  
0,390625    
0,359375    
0,3125    
 
коды (2003 Excel)  
 
Sub io()  
Dim i&, t#  
t = Timer  
For i = 1 To Rows.Count  
   Cells(i, "A") = i  
   goPBar 1, Rows.Count, i, 100  
Next  
Debug.Print Timer - t  
End Sub  
 
Sub io2()  
Dim i&, t#  
t = Timer  
For i = 1 To Rows.Count  
   Cells(i, "A") = i  
   'goPBar 1, Rows.Count, i, 100  
Next  
Debug.Print Timer - t  
End Sub  
 
Sub io3()  
Dim tm: tm = Timer  
Dim i&  
ReDim a(1 To Rows.Count, 1 To 1)  
 
For i = 1 To Rows.Count  
a(i, 1) = i  
' goPBar 1, Rows.Count, i, 100  
Next  
[a1].Resize(Rows.Count) = a
Debug.Print Timer - tm  
End Sub
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
Страницы: 1
Читают тему
Наверх