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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2010, 14:40   #11
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию

Мое ПО - надстройка, которая (по совету EducatedFool – спасибо за совет!) инсталлируется и деинсталлируется с помощью InnoSetup. При этом еще используются скрипты. Прогресс-бар требуется, например, при завершении работы с программой (не для деинсталляции). Процесс занимает до 10-12 секунд .
Сейчас призавершении работы я п/п Finish скрываю все активные формы (до 6) и сразу запускаю свой «прогресс» ( в программном модуле общего назначения одна команда: ufProgress.Show)
ufProgress - это пустая модальная форма с Caption = “идет процесс сохранения, подождите…” Выход из нее «крестом» - закрыт (в событии UserForm_QueryClose – команда: If CloseMode = vbFormControlMenu Then Cancel = True)
Далее идет нудный процесс выгрузки форм, сохранения данных из форм в книге, восстановление нормального интерфейса приложения и книг, стирания временных имен и т.п.

Конец п/п Finish:
'отключение Cancel на период сохранения надстройки
Application.EnableCancelKey = xlDisabled
'сохранение надстройки (около 5-6 сек)
ThisWorkbook.Save
With Application
If .Workbooks.Count = 0 Then
.Quit
Else
Unload ufProgress
End If
End With

End Sub


Все работает без проблем, но подвешивать неинформативную (без динамики) форму как-то некрасиво.
Прежде, чем пробовать предложенные варианты в ПО (в примерах-то я их прокрутил), хотелось бы просто услышать: пригодны ли они при такой структуре п/п Finish? А то боюсь в своем же запутаться… Ну, и динамика - вопрос!
Простите за назойливость и заранее спасибо!
alvazor вне форума Ответить с цитированием
Старый 11.08.2010, 14:51   #12
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
пригодны ли они при такой структуре п/п Finish?
Да как сказать...

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

Не совсем понятно, что вы хотите получить в итоге.
Можете просто вывести бегущую строку на форме - пример есть здесь: http://excelvba.ru/code/frmAbout
EducatedFool вне форума Ответить с цитированием
Старый 11.08.2010, 15:02   #13
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию

Да в той же InnoSetup как-то сделано (при деинсталляции), что полоска индикатора заведомо медленно начинает заполняться, а когда процесс закончен - быстренько заполняется до конца и форма закрывается. Красиво, блин...
alvazor вне форума Ответить с цитированием
Старый 11.08.2010, 15:28   #14
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию

До чего-ж красив бегущий текст!!! Поразбираюсь...
Но опять DoEvents, который до меня не доходит и пугает -(
Вроде как, на период до следующего шага вычислительные ресурсы отдаются другим процессам - а в этом многообразии прерываний мозги в трубочку..Дурацкая привычка пытаться вникать, куда вроде бы и не надо
alvazor вне форума Ответить с цитированием
Старый 11.08.2010, 16:02   #15
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
Но опять DoEvents, который до меня не доходит и пугает -(
А что тут пугающего?
Хотите наблюдать песочные часы вместо курсора, чтобы Excel подвисал, чтобы не все компоненты формы сразу отрисовывались на экране, - не используйте DoEvents

Если же вам надо сделать небольшую паузу, или дождаться наступления какого-то события, при этом не нагружая комп, - добавляйте оператор DoEvents внутрь цикла.
EducatedFool вне форума Ответить с цитированием
Старый 11.08.2010, 16:53   #16
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию

Все так просто? - ну не скажите!
Вот Ваша бегущая строка (FormAbout.xls) - вроде все без проблем, но...
Открываю книгу с макросами, запускается форма с бегущей строкой, ставлю курсор на текст формы "База договоров" (ставится!) и нажимаю Esc
Форма гаснет и - зависон... Еше раз Esc - верещит дебугер "Code execution has been interrupted" и выход на ошибку в п/п StartAd... Но тут хоть выскочить можно по End дебугера. Что за эффект - не понял, да и зачем - такого просто не должно быть.
Ей-Богу, случайно получилось! Пытался нащупать клавишу выхода, которая оказалась закрыта рисунком.
Вот этаких эффектов по прерываниям я и боюсь, потому закрываю прерывания перед сохранением книги (еще и ряд клавиш и сочетаний)
alvazor вне форума Ответить с цитированием
Старый 11.08.2010, 17:25   #17
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию

Вот текст из справочника функций vba:
Функция DoEvents
DoEvents()
Функция передает управление операционной системе для обработки событий и сообщений, ждущих в системной очереди и всех нажатий клавиш из очереди SendKeys. После обработки всех событий управление возвращается приложению(следующий за строкой DoEvents инструкции. Применяется для обеспечения возможности прерывания пользователем какой-нибудь длительной операции, выполняемой программой

Возвращаемое значение
Функция возвращает значение типа Integer, определяющих число открытых форм в Visual Basic, в других приложениях возвращается 0

Пример
' Создание переменной для хранения
' числа загруженных и видимых форм VB
Dim I, OpenForms
For I = 1 To 150000 ' Начало цикла
If I Mod 1000 = 0 Then ' Если цикл выполнен 1000 раз
' Передает управление операционной системе
OpenForms = DoEvents
End If
Next I

...Ну кабы не пример и возвращаемое значение....
ни хрена не понял!
alvazor вне форума Ответить с цитированием
Старый 01.09.2010, 15:16   #18
Pilot
Пользователь
 
Регистрация: 13.11.2007
Сообщений: 33
Восклицание

Цитата:
Сообщение от IgorGO Посмотреть сообщение
Очень простенький вариант с демострацией работы без визуализации, а потом с ней.
на мой взгляд если что-то выполняется больше 2 секунд - надо человека занять чем-то, чтобы отвлечь его от тягостных дум типа "а что происходит?, а когда это закончится?". оператор из категории "полной непонятки" переходит в категорию "контролирующего процесс" - это добавляет ему уверенности и уважения к себе от понимания собственной важности в происходящем.
Заинтересовала данная тема, но не хватает знаний по практическому применению. Как вставить данный процесс
Sub S100100()
For i = 1 To 2
Cells.ClearContents
sb = ""
For r = 1 To 100
For c = 1 To 128
Cells(r, c) = "p." & Format(r, "00") & " c." & c
If i = 2 Then
If Len(sb) < r Then sb = sb & "I"
Application.StatusBar = "Done " & Format(r, "00") & "% " & sb
End If
Next
Next
sb = "Процесс заполнения сейчас повторится. Следите за строкой состояния (снизу окна)"
If i = 2 Then sb = "А с визуализацией процесса спокойнее..."
MsgBox sb, vbOKOnly, "ГОТОВО..."
Application.StatusBar = False
Next
End Sub
в такой вот макрос (соответственно только строку состояния)
Sub f4()
Comm1 51, 4
Comm1 52, 5
Comm1 53, 6
Comm1 54, 7
Comm1 55, 8
Comm1 56, 9
Comm1 57, 10
Comm1 58, 11
Comm1 59, 12
Comm1 60, 13
Comm1 61, 14
Comm1 62, 15
End Sub
Sub Comm1(arg1, arg2)
Dim i As Long, acontrol As Date, icounter As Long
With Sheets("ХРОНОМЕТРАЖ")
For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
If .Cells(i, 5) = "УТП" And .Cells(i, 29) <> "Вне базы " And .Cells(i, 1) <> acontrol And .Cells(i, 1) >= Sheets("Подведение итогов").Cells(arg1, 1) _
And .Cells(i, 1) <= Sheets("Подведение итогов").Cells(arg1, 2) Then
acontrol = .Cells(i, 1)
icounter = icounter + 1
End If
Next
Sheets("Подведение итогов").Cells(arg2, 6) = icounter
End With
End Sub

Сам пытался, но чегой-то не получилось.

Последний раз редактировалось Pilot; 01.09.2010 в 15:38.
Pilot вне форума Ответить с цитированием
Старый 01.09.2010, 16:12   #19
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Не проверял,должно работать

Код:


Sub f4()
Comm1 51, 4, 1
Comm1 52, 5, 2
Comm1 53, 6, 3
Comm1 54, 7, 4
Comm1 55, 8, 5
Comm1 56, 9, 6
Comm1 57, 10, 7
Comm1 58, 11, 8
Comm1 59, 12, 9
Comm1 60, 13, 10
Comm1 61, 14, 11
Comm1 62, 15, 12
End Sub
Sub Comm1(arg1, arg2, Nom)
Dim i As Long, acontrol As Date, icounter As Long, iperc As Integer, icount As Long
sb = ""
With Sheets("ХРОНОМЕТРАЖ")
icount = .Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
If .Cells(i, 5) = "УТП" And .Cells(i, 29) <> "Вне базы " And .Cells(i, 1) <> acontrol And .Cells(i, 1) >= Sheets("Подведение итогов").Cells(arg1, 1) _
And .Cells(i, 1) <= Sheets("Подведение итогов").Cells(arg1, 2) Then
acontrol = .Cells(i, 1)
icounter = icounter + 1
End If
iperc = Int(100 * i / icount)
  If Len(sb) < iperc Then sb = sb & "I"
sb = sb & "I"
  Application.StatusBar = "Done Macro " & Nom & Format(iperc, "00") & "%  " & sb

Next
Sheets("Подведение итогов").Cells(arg2, 6) = icounter
End With
End Sub
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 01.09.2010, 16:22   #20
Pilot
Пользователь
 
Регистрация: 13.11.2007
Сообщений: 33
По умолчанию

Цитата:
Сообщение от doober Посмотреть сообщение
Не проверял,должно работать

Ругается на этой стоке
Application.StatusBar = "Done Macro " & Nom & Format(iperc, "00") & "% " & sb

Сообщает: Run-time error '1004'
Method 'StatusBar' of object '_Application' failed

В строке состояния Done Macro 109%

Последний раз редактировалось Pilot; 01.09.2010 в 16:29.
Pilot вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
BASS Визуализация Garacio_cain Мультимедиа в Delphi 2 14.08.2008 00:19
Перенос макроса в модуль valerij Microsoft Office Excel 6 09.06.2008 23:13
Привязка макроса к кнопке VisuaL Microsoft Office Excel 7 10.05.2008 07:04
Запись макроса valerij Microsoft Office Excel 5 01.12.2007 00:49
визуализация алгоритма Alar Паскаль, Turbo Pascal, PascalABC.NET 0 30.10.2006 14:10