Страницы: 1 2 След.
RSS
Как прервать работу макроса из другого макроса?
 
Добрый день
Подскажите пож как прервать работу одного макроса из другого? Что-то вроде:
Код
Sub aaa()
 Call bbb
End Sub

Sub bbb()
 exit sub aaa
End Sub
 
Макросы работают в разных инстансах?
 
Цитата
Ливиан написал:
Что-то вроде:
означает убиение родительского процесса из дочернего. что не понятно для чего. Родительский, на время выполнения дочернего не работает а ждет окончания работы дочернего, и если надо прервать цепочку, то нужно просто поставить глобальный флаг, который проверить и не продолжать родительский процесс, или использовать функции, возвращающие этот флаг.
По вопросам из тем форума, личку не читаю.
 
Код
Dim exit_sub As Boolean
Sub aaa()
    exit_sub = True
End Sub

Sub bbb()
    Call aaa
    Do
        If exit_sub Then Exit Sub
    Loop
End Sub
Как вариант через переменную уровня модуля.
Изменено: МатросНаЗебре - 02.09.2019 14:59:43
 
Цитата
БМВ написал: что не понятно для чего
есть макрос который вызывает несколько макросов. в некоторых по возникновению ряда условий нужно прервать главный макрос. был вариант с выделением отдельной ячейки под продолжать или нет главный макрос, но не хочется нагружать ненужной информацией рабочий лист.
Цитата
БМВ написал: то нужно просто поставить глобальный флаг
Цитата
МатросНаЗебре написал: Как вариант через переменную уровня модуля
это равнозначные понятия? еще никогда не работал с глобальными переменными, только как то читал про них. Они только на одном модуле работают? А на разных? Другим книгам и их макросам не доступны? Если нет, придется остановиться на ячейке...
Цитата
МатросНаЗебре написал:
Макросы работают в разных инстансах?
Макросы в разных книгах. Если правильно все понял
Изменено: Ливиан - 02.09.2019 22:13:16 (опечатка)
 
Цитата
Ливиан написал:
это равнозначные понятия?
Близкие, но есть отличия. Отличаются областью видимости.
Цитата
Ливиан написал:
Они только на одном модуле работают? А на разных?
В разных модулях работают глобальные переменные.
Цитата
Ливиан написал:
Другим книгам и их макросам не доступны?
Не доступны. Но в книге, содержащей требуемую глобальную переменную, можно сделать процедуру, изменяющую эту переменную. А вот эту процедуру уже можно вызвать из другой книги.
Цитата
Ливиан написал:
Если нет, придется остановиться на ячейке...
Не сдавайтесь. Еще есть потенциал для решения этой задачи :)
 
Доброе время суток.
Коллеги, а зачем глобальные переменные? Это не кошерно преобразовать процедуру в функцию, которая возвращает статус завершения, по которому вызывающая процедура и определяет - нужно ли продолжать выполнение?
Код
Public Sub Main()
    If Not ChildCode1 Then Exit Sub
End Sub


Public Function ChildCode1() As Boolean
    Dim StatusDoNext As Boolean
    'делаем что-то, определяя статус продолжения
    ChildCode1 = StatusDoNext
End Function
 
Цитата
МатросНаЗебре написал:
Не сдавайтесь. Еще есть потенциал для решения этой задачи
спасибо всем большое. попробую предложенные варианты.
 
Цитата
БМВ: использовать функции, возвращающие этот флаг
вот это как раз мой метод
Код
Sub Test ()
Dim x
x=4
If Not Check(x)Then Exit Sub
End Sub

Function Check (iVal) As Boolean
If iVal>5 Then Check=True
End Function
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Андрей VG написал:
Коллеги, а зачем глобальные переменные? Это не кошерно преобразовать процедуру в функцию
Все то вы Андрей до конца не дочитываете
Цитата
БМВ написал:
или использовать функции, возвращающие этот флаг.
:D

Вот теперь стало и название темы вырисовыватся, все ж это не прервать работу, а прекратить дальнейшее выполнения после завершения дочерней процедуры  и наверно по условию.
Изменено: БМВ - 02.09.2019 15:46:30
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
до конца не дочитываете
Так на форуме не только полезному учишься, но и худому то же - не читать многобукв :)  
Приношу свои извинения, всё осознал, буду стараться в одних и тех же постах не пересекаться!
 
Цитата
Андрей VG написал:
буду стараться в одних и тех же постах не пересекаться!
а вот это лишнее :-) Как раз наоборот :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
Ливиан написал:
Макросы в разных книгах.
Тогда не понятно, как выполняется
Код
Call bbb

Но, если все-же эта строка сработала, есть редко используемая команда
Код
Sub bbb()
     End
End Sub
 
Вот и я это хотел предложить, а тут уже есть...
End - останавливаем все макросы. Неужели не то?
 
 А End сработает на другую книгу?
 
Есть крооошечный нюанс
The End statement provides a way to force your program to halt. For normal termination of a Visual Basic program, you should unload all forms. Your program closes as soon as there are no other programs holding references to objects created from your public class modules and no code executing.

Дошел до End и забудь про формы открытые, они уже закрыты, даже если это и не надо :-).
По вопросам из тем форума, личку не читаю.
 
Зато ничего не мешает )
 
Цитата
Ливиан написал:
Как прервать работу макроса из другого макроса?
никак
Код
Sub One() ' этот макрос не подлежит редактированию, просто выполните его после того, как напишите макрос Two
  Dim a
  Do While True
    a = a
    DoEvents
  Loop
End Sub

Sub Two()
  
End Sub
пишите в макрос Two все что подскажет Вам фантазия
вопрос такой:
что такое Вы написали в макрос Two, чтобы после запуска  на выполнение макроса One, запустить на выполнение Two и чтобы он остановил работу макроса One?
какой у VBA есть механизм контроля из одного макроса над работой другого???
Изменено: Ігор Гончаренко - 02.09.2019 23:05:09
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Как по мне, End это "корявость" похлеще ненужных переходов по меткам (я не про саму команду, а про то, что давненько не видел необходимости её применения). Логика должна быть построена таким образом, чтобы учитывать все необходимые нюансы. А прочие "глупости" можно например обойти как раз переходом по метке:
Код
Sub Macro ()
On Error GoTo er
' тело кода
er: MsgBox "Error", vbCritical, "Непредусмотренная ошибка!"
End Sub
Кстати говоря, до перехода на булевые функции в качестве контроля, я в случае нештатных ситуаций в дочерних процедурах генерировал ошибку, которая "передавалась" в родительский, где её как раз ловил вышеописанный переход. Сейчас страшно вспоминать  :D
Изменено: Jack Famous - 03.09.2019 08:59:16
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Вить, тогда уж дял надежности через shell rundll32.exe user.exe,**ExitWindows**  :D
По вопросам из тем форума, личку не читаю.
 
Jack Famous,
ну, не знаю, дело вкуса.
у меня почти в каждом проекте присутствует стандартная процедура:
Код
Sub LastMessage(Msg$, Optional Mode& = vbCritical, Optional Tit$ = "Аварийное завершение работы!")
  Application.ScreenUpdating = True:  Application.EnableEvents = True
  Application.DisplayAlerts = True:   Application.Calculation = xlCalculationAutomatic
  Application.StatusBar = False:      MsgBox Msg, Mode, Tit:  End
End Sub
которая используется приблизительно так:
Код
LastMessage "Указанная Вами папка: " & FdName & vblf & "не содержит необходимых данных! До новых встреч"
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Игорь, а With почему не уважаешь?
 
во-первых, это реально первый раз было использовано лет 15 назад, лежит себе в библиотеке и кочует от туда в проекты
во-вторых, я With и его End пишу в отдельные строки всегда,  и LastMessage в результате не станет компактнее нынешних 5 строк.

и все-таки п.1 важнее, процедура написана 15 лет назад и хорошо себя зарекомендовала за истекший период. работает - вот и пусть себе работает, не нужно ничего менять))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Код
Sub LastMessage(Msg$, Optional Mode& = vbCritical, Optional Tit$ = "Аварийное завершение работы!")
    With Application
        .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True
        .Calculation = xlCalculationAutomatic: .StatusBar = False
    End With
    
    MsgBox Msg, Mode, Tit: End
End Sub

Меняй, иначе ретроградом станешь :)
 
Офф
Цитата
Ігор Гончаренко написал:
не станет компактнее нынешних 5 строк.
Крохобор, переводов строк ему жалко :-). Игорь, поменяй уже телетайп с 5тью строками на монитор :-)
Вот мне например больше Application.Calculation = xlCalculationAutomatic не нравится.
Про закрытие форм, я уже писал выше и метод  действительно хорош для аварийного заверщения всех обработок, но не для обработки по процессу , который при ветвлении должен штатно завершится.
По вопросам из тем форума, личку не читаю.
 
Цитата
Ігор Гончаренко: дело вкуса
это точно. Повторюсь, мне не приходилось разрабатывать решения, где бы пригодился такой вот "обнулятор" с выходом. А так - вполне себе имеет право на жизнь. Только вычисления я бы всё-таки запоминал и восстанавливал, а не ставил автомат по-дефолту
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
а вам только дай что-то пообсуждать, лишь бы ничего не делать!
читайте название темы, думайте что вписать в Sub Two, а то у меня Sub One уже вторые сутки маслает и ни одного предложения как его остановить из другого макроса.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко: что вписать в Sub Two
варианты, как решить проблему не "в лоб" (например, действия выполнять булевой функцией и проверять её значение в родительском макросе) предоставлены
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
а) макрос 1 уже написан, прервать нужно его работу, другим макросом
б) разницу улавливаете между тем что 1 отработал и вернул результат в 2? это не ПРЕРВАТЬ 1, это выполнить 1 из 2 и ДОЖДАТЬСЯ окончания его работы и продолжить выполнение 2. разницу улавливаете между вопросом, который стоит и решением, которое предлагается? ДОЖДАТЬСЯ окончания работы макроса и ПРЕРВАТЬ работу макроса - это разные понятия, Вы предлагаете дождаться когда он закончит работу, а спрашивают как прервать

свой ответ я написал в #8 (повторю на всякий случай)
Цитата
Ігор Гончаренко написал:
никак
Изменено: Ігор Гончаренко - 03.09.2019 09:24:49
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, в коде из стартового сообщения
Код
Sub aaa()
 Call bbb
End Sub
 
Sub bbb()
 exit sub aaa
End Sub
автор недвусмысленно даёт понять, что есть связь между родительским и дочерним макросом, а вы лишь буквоедством занимаетесь…не надо так
Кроме того, оператор End прекратит выполнение всех макросов, в том числе и родительского, — что и показано в вашем примере и отвечает на вопрос НАПРЯМУЮ. Другое дело, что, скорее всего, автору нужно было не совсем это.

Одна из сверхспособностей помогающих — это понять что именно нужно ТСу, а не ответить в точности на поставленный вопрос, ведь авторы постов, сюрприз, далеко не всегда знают, как и что правильно называется и какими путями можно чего-то подобного достичь. Странно, что вам нужно объяснять подобное…

Название темы: «Как проверить выполнение условия в дочернем макросе из родительского»
Изменено: Jack Famous - 03.09.2019 10:04:17
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1 2 След.
Наверх