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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2011, 09:50   #1
-Anton-
Пользователь
 
Регистрация: 09.06.2011
Сообщений: 21
По умолчанию ожидание завершения работы макроса

Добрый день форумчане!

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

Из одного макроса (1) запускается другой (2). Как дождаться завершения работы 2 и только после этого продолжить работу макроса 1?

Пример:



Код:
Sub Main()

Dim i As Integer

For i = 1 To 500

Application.OnTime Now + TimeValue("00:00:05"), "Obrabotka_tabl"

DoEvents

Next i

End Sub

Программа работает просто. Из Main() вызывается макрос (Obrabotka_tabl), после чего следует передача управления системе на небольшой промежуток времени (5 сек), далее выполнение макроса Obrabotka_tabl, и всё по-новой...


В данном случае программа не дожидается завершения выполнения Obrabotka_tabl, и цикл запускается повторно, что приводит к отсутствию запланированной паузы в 5 сек.

Можно ли каким-то образом при выполнении макроса Obrabotka_tabl дождаться его завершения, и только после этого продолжить работу main?
-Anton- вне форума Ответить с цитированием
Старый 18.06.2011, 10:00   #2
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Вынести за цикл строку
Код:
Application.OnTime Now + TimeValue("00:00:05"), "Obrabotka_tabl"
а в макрос "Obrabotka_tabl" последней строкой сделать
Код:
call main
Еще в макросе "Obrabotka_tabl" убрать DoEvents
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728

Последний раз редактировалось kuklp; 18.06.2011 в 10:03.
kuklp вне форума Ответить с цитированием
Старый 18.06.2011, 10:12   #3
-Anton-
Пользователь
 
Регистрация: 09.06.2011
Сообщений: 21
По умолчанию

Цитата:
Вынести за цикл строку
Код:

Application.OnTime Now + TimeValue("00:00:05"), "Obrabotka_tabl"
А как тогда запустить этот макрос 500 раз?


Цитата:
а в макрос "Obrabotka_tabl" последней строкой сделать
Код:

call main

Тогда получится запуск "main" из "Obrabotka_tabl", потом из "main" запустится "Obrabotka_tabl" и т.д. имхо ни к чему хорошему это не приведет..


Цитата:
Еще в макросе "Obrabotka_tabl" убрать DoEvents
Там нет такого кода.
-Anton- вне форума Ответить с цитированием
Старый 18.06.2011, 10:25   #4
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Код:
Sub Main()

    Dim i As Integer, n&
    Do While n < 500
        For i = 1 To 500
            DoEvents
        Next i
        Application.OnTime Now + TimeValue("00:00:05"), "Obrabotka_tabl"
        n = n + 1
    Loop
End Sub
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 18.06.2011, 10:46   #5
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

По-моему, это надо немного по-другому делать:
Код:
Dim i&

Sub main()
i = 500
Obrabotka_tabl
End Sub

Sub Obrabotka_tabl()
'действия
i = i - 1
If i >= 0 Then Application.OnTime Now + #12:00:05 AM#, "Obrabotka_tabl"
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 18.06.2011, 10:50   #6
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

И то верно, нафиг там цикл с DoEvents.
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 18.06.2011, 11:24   #7
-Anton-
Пользователь
 
Регистрация: 09.06.2011
Сообщений: 21
По умолчанию

Цитата:
Sub Main()

Dim i As Integer, n&
Do While n < 500
For i = 1 To 500
DoEvents
Next i
Application.OnTime Now + TimeValue("00:00:05"), "Obrabotka_tabl"
n = n + 1
Loop
End Sub
Данный код вызывает постоянный запуск "Obrabotka_tabl", пауза отсутствует.


Цитата:
И то верно, нафиг там цикл с DoEvents.
Для того, чтоб на некоторое время передать управление пользователю. (в частности на 5 секунд, указанные в

Код:
Application.OnTime Now + TimeValue("00:00:05"), "Obrabotka_tabl"
Склоняюсь к мысли, что единственный вариант - сделать "Obrabotka_tabl" функцией, и по завершении работы возвращать true, и только после этого продолжать выполнение main.
-Anton- вне форума Ответить с цитированием
Старый 18.06.2011, 11:32   #8
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

А чем вариант Алексея(Казанский) не устраивает?
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 18.06.2011, 11:51   #9
-Anton-
Пользователь
 
Регистрация: 09.06.2011
Сообщений: 21
По умолчанию

Цитата:
А чем вариант Алексея(Казанский) не устраивает?
В нем нет возврата в main после каждого выполнения "Obrabotka_tabl".
-Anton- вне форума Ответить с цитированием
Старый 18.06.2011, 12:27   #10
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию -Anton-

> Для того, чтоб на некоторое время передать управление пользователю. (в частности на 5 секунд, указанные в
Application.OnTime Now + TimeValue("00:00:05"), "Obrabotka_tabl"

Метод OnTime работает совсем не так. Вышеприведенный оператор назначает старт процедуры Obrabotka_tabl через 5 секунд, при этом выполнение программы продолжается.

Опишите задачу подробнее. Возможно, процедуру Obrabotka_tabl лучше запускать не по времени, а по какому-то событию?
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ожидание завершения потоков Voody Общие вопросы Delphi 11 14.06.2016 06:10
Отмена закрытия консольного окна после завершения работы приложения FeloS Общие вопросы C/C++ 21 25.02.2011 16:34
Ожидание завершения процесса Человек-Ололо Общие вопросы Delphi 2 08.03.2010 19:39
Как программно вызвать окно завершения работы UfoRoot Win Api 4 21.01.2009 11:15
Перехват завершения работы ОС vynt Win Api 7 19.05.2008 08:59