Здравствуйте Ув.Профессионалы! Хотелось бы попросить Вашей помощи в следующем вопросе.
Столкнулся с необычной проблемой. У меня есть макрос в котором есть 6 циклов и каждый цикл разной длины и размерности. Суть моего макроса это сравнение двух разных книг и копирование всей информации из одной книги в другую при этом учитывает чтобы кол-во строк было равным, и поэтому в макросе много циклов. Сам макрос выполняется около 40 сек. Так вот возник вопрос как отобразить процесс выполнения макроса. Читал много разных идей но так и не нашёл нужный вариант. Т.е. мне не нужно создавать форму и делать в ней прогресбар для меня лучший вариант отображение в статус бар что упрощает вывод индикации. Ниже код который я использую для того чтобы видеть прогресс, но он работает если его вставить в один цикл, тогда понятно как связать его с макросом но у меня много разных циклов.
Так вот вопрос: как привязать данный код к макросу с множеством циклов? И можно ли запустить индикацию так чтобы параллельно выполнялся макрос? Ну и получится что я буду видеть ход выполнения макроса.
PS: Есть вариант где через промежутки кода вставить фиксированные значения - это не подходит т.к. длина циклов разная Пробовал привязать макрос через Timer т.e выполнение макроса в сек находил с помощью таймера а значит я могу точно знать необходимое кол-во итераций в макросе. Но как всё связать так и не получилось.
[vba]
Код
'Вариант отображения % и стрелками ->(1 стрелка = 10% выполнения) Sub StatusBar() Dim lr As Long, lp As Double Dim lAllCnt As Long 'кол-во итераций Dim s As String lAllCnt = 10000 For lr = 1 To lAllCnt lp = lr \ 100 'десятая часть всего массива 'формируем строку символов(от 1 до 10) s = String(lp \ 10, ChrW(10152)) & String(11 - lp \ 10, ChrW(8700)) Application.StatusBar = "Выполнено: " & lp & "% " & s: DoEvents DoEvents Next 'очищаем статус-бар от значений после выполнения Application.StatusBar = False End Sub
[/vba]
Здравствуйте Ув.Профессионалы! Хотелось бы попросить Вашей помощи в следующем вопросе.
Столкнулся с необычной проблемой. У меня есть макрос в котором есть 6 циклов и каждый цикл разной длины и размерности. Суть моего макроса это сравнение двух разных книг и копирование всей информации из одной книги в другую при этом учитывает чтобы кол-во строк было равным, и поэтому в макросе много циклов. Сам макрос выполняется около 40 сек. Так вот возник вопрос как отобразить процесс выполнения макроса. Читал много разных идей но так и не нашёл нужный вариант. Т.е. мне не нужно создавать форму и делать в ней прогресбар для меня лучший вариант отображение в статус бар что упрощает вывод индикации. Ниже код который я использую для того чтобы видеть прогресс, но он работает если его вставить в один цикл, тогда понятно как связать его с макросом но у меня много разных циклов.
Так вот вопрос: как привязать данный код к макросу с множеством циклов? И можно ли запустить индикацию так чтобы параллельно выполнялся макрос? Ну и получится что я буду видеть ход выполнения макроса.
PS: Есть вариант где через промежутки кода вставить фиксированные значения - это не подходит т.к. длина циклов разная Пробовал привязать макрос через Timer т.e выполнение макроса в сек находил с помощью таймера а значит я могу точно знать необходимое кол-во итераций в макросе. Но как всё связать так и не получилось.
[vba]
Код
'Вариант отображения % и стрелками ->(1 стрелка = 10% выполнения) Sub StatusBar() Dim lr As Long, lp As Double Dim lAllCnt As Long 'кол-во итераций Dim s As String lAllCnt = 10000 For lr = 1 To lAllCnt lp = lr \ 100 'десятая часть всего массива 'формируем строку символов(от 1 до 10) s = String(lp \ 10, ChrW(10152)) & String(11 - lp \ 10, ChrW(8700)) Application.StatusBar = "Выполнено: " & lp & "% " & s: DoEvents DoEvents Next 'очищаем статус-бар от значений после выполнения Application.StatusBar = False End Sub
Есть вариант где через промежутки кода вставить фиксированные значения - это не подходит т.к. длина циклов разная
А что мешает начало и конец цикла помещать в переменные? И причем тут таймер? Он вообще-то отработанное время считает, а не кол-во итераций или ячеек...
Есть вариант где через промежутки кода вставить фиксированные значения - это не подходит т.к. длина циклов разная
А что мешает начало и конец цикла помещать в переменные? И причем тут таймер? Он вообще-то отработанное время считает, а не кол-во итераций или ячеек..._Igor_61
И можно ли запустить индикацию так чтобы параллельно выполнялся макрос?
нет. Многозадачность не поддерживается и нужно из каждого макроса изменять состояние индикатора. Любой прогресс бар показывает относительно известной величины. Например известно количество этапов - их завершение можно отобразить. Если она не известна, то лучше использовать ,что-то что дает понять что процесс идет, но не акцентировать на том что осталось столько т. В противном случае некорректный указатель может только сбивать.
И можно ли запустить индикацию так чтобы параллельно выполнялся макрос?
нет. Многозадачность не поддерживается и нужно из каждого макроса изменять состояние индикатора. Любой прогресс бар показывает относительно известной величины. Например известно количество этапов - их завершение можно отобразить. Если она не известна, то лучше использовать ,что-то что дает понять что процесс идет, но не акцентировать на том что осталось столько т. В противном случае некорректный указатель может только сбивать.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
_Igor_61, Таймер я использовал для того чтобы определить скорость макроса, разные ПК вычисляют макрос с разной скоростью, а значит для того чтобы шкала в 100% была верной я считал Timer время выполнения и присваивал значение в переменную "lAllCnt" а зная время - его можно конвертировать в итерации, таким образом шкала имеет правильный вид.
_Igor_61, Таймер я использовал для того чтобы определить скорость макроса, разные ПК вычисляют макрос с разной скоростью, а значит для того чтобы шкала в 100% была верной я считал Timer время выполнения и присваивал значение в переменную "lAllCnt" а зная время - его можно конвертировать в итерации, таким образом шкала имеет правильный вид.komilfo2285
В общем тема сложная, спасибо всем за участие...временно решил проблему - вставил через промежутки часть кода, работает каряво ну хоть так... Всем спасибо.
В общем тема сложная, спасибо всем за участие...временно решил проблему - вставил через промежутки часть кода, работает каряво ну хоть так... Всем спасибо.komilfo2285