Страницы: 1
RSS
Ожидание завершения функции или процедуры
 
Уважаемые форумчане!

Пожалуйста, подскажите синтаксис ожидания завершения функции или процедуры.
Проблема в том, что не успевает сформироваться ворд файл, который потом прикрепляется к письму как вложение. Письмо собирается быстрее и соответственно по указанному пути еще нет файла.
Нашел только эту конструкцию, но она похоже для запуска сторонних программ (exe и т.д.).
Код
Set WshShell = CreateObject("WScript.Shell").Run("MyScript", 0, True)
Хотелось бы так же, только вместо скрипта вложить функцию.
Пробовал подставлять функцию, выкидывает ошибку 5. Элементарный пример ниже.
Код
Function test1(MyNumber As Long)
    MsgBox MyNumber + 3
End Function
Sub test2()
    On Error GoTo Errorcatch
    Set WshShell = CreateObject("WScript.Shell").Run(test1(7), 0, True)
    Set WshShell = Nothing
Errorcatch:
    MsgBox Err.Description
End Sub
 
Добрый день,
Как насчёт другого подхода?
Например, Вы всегда знаете, что процесс формирования ворд файла занимает определенное время, можно поставить ожидание:
Код
Application.Wait (Now + TimeValue("0:00:02"))  

Пример ожидания выполнения на 2 сек.
Также можно сделать каждые 2 секунды мониторить каталог и смотреть, если ли там нужный файл и повторять это же действия, пока его не будет там:

Код
Sub Search()
Dim xFactor As Boolean
Dim strDirPath, strMaskSearch, strFileName As String
strDirPath = "E:\test\" 'Папка поиска
strMaskSearch = "*.txt*" 'Маска поиска
Do While xFactor = False
    'Ожидание 5 сек
    Application.Wait (Now + TimeValue("0:00:05"))
    'Получаем первый файл соответствующий шаблону
    strFileName = Dir(strDirPath & strMaskSearch)
    Do While strFileName <> "" 'До тех пор пока файлы "не закончатся"
        If strFileName = "Имя вашего документа.txt" Then
         xFactor = True
        End If
        strFileName = Dir 'Следующий файл
    Loop
Loop
End Sub
Изменено: ProFessor - 24.04.2018 16:17:45
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
ProFessor, этот способ известен, однако уж очень он не универсален. Каждый файл формируется по разному, так как данные разные и компьютеры у всех разные (скорость обработки), поэтому угадать какое время занимает каждый отдельный случай не возможно.
Идеальный вариант - дождаться окончания одного процесса и приступить к следующему.
 
Цитата
ac1-caesar написал:
однако уж очень он не универсален
Посмотрите, пожалуйста, вторую часть я её изменил и обновил
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
ProFessor, метод остался тот же - задержка по времени 5 сек. А как быть если процесс займет 6 сек? И если процесс займет 2 секунды, то появляется лишнее ожидание +3 секунды.
 
ac1-caesar, А как возникает синхронность процессов?
Цитата
ac1-caesar написал:
Письмо собирается быстрее и соответственно по указанному пути еще нет файла
По вопросам из тем форума, личку не читаю.
 
какой процесс? где тут о нем хоть буква написана? какой помощи Вы ждете?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, первое сообщение предельно ясно излагает суть вопроса.
Цитата
Уважаемые форумчане!

Пожалуйста, подскажите синтаксис ожидания завершения функции или процедуры.
 
какой функции (или процедуры)?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
окончание функции определяет End Function или Exit Function в теле функции
окончание процедуры определяет End Sub или Exit Sub в теле процедуры
End - в теле функции (процедуры) определяет ее немедленное окончание
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
так подойдет?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
БМВ написал:
А как возникает синхронность процессов?
Есть процедура формирования ворд файла на основе шаблона
Код
Sub CreateWordFile()
.....
WD.SaveAs SavedAlertNoticePath, AddToRecentFiles:=False
Далее вызывается функция формирования письма
Код
Call SendMailNotification(SavedAlertNoticePath)
End sub
Здесь получается что полный путь для файла мы имеем, а вот сам файл формируется позже чем собирается письмо и поэтому в письме во вложении ничего нет. А по указанному пути файл присутствует.
Изменено: ac1-caesar - 24.04.2018 16:35:47
 
Есть желание выделить создание ворд файла в отдельную функцию или процедуру, запустить ее, дождаться полного выполнения и выполнить следующую процедуру.
Код
sub test()

call CreateWordFile()
'дождаться завершения создания файла и запустить процедуру отправки письма
call SendMail(FilePath)

 
после
 WD.SaveAs ....
закройте файл.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
if Dir(FilePath) <> "" then SendMail(FilePath)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
ac1-caesar, так и проверяйте наличие файла в цикле до посинен...  появления файла, каждые 500мс . Я так понял, что работает иное приложение при формировании .
По вопросам из тем форума, личку не читаю.
 
Ігор Гончаренко,  Игорь, что случилось сегодня? Все отдельными постами! :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
ac1-caesar написал:
то появляется лишнее ожидание +3 секунды.
Сразу видно профи, бережет секунды. Мало таких у нас в стране родимой...
Если поставить частоту обновления в 1 сек, то макс задержка предложенного мной метода равна <1 сек.
То что вы нарыли:
Цитата
ac1-caesar написал:
Set WshShell = CreateObject("WScript.Shell").Run("MyScript", 0, True)
не используется для Вашего варианта.
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
Цитата
Ігор Гончаренко написал:
после   WD.SaveAs ....закройте файл.
Закрывается конечно

А это уже дело
Цитата
if Dir(FilePath) <> "" then SendMail(FilePath)
в сочетании с
Цитата
так и проверяйте наличие файла в цикле до посинен...  появления файла
Спасибо, друзья!
 
Код
DoEvents
Страницы: 1
Наверх