Страницы: 1
RSS
Выполнить только часть макроса при выполнении условия, если запускается самостоятельно - выполнить весь код, если вторым макросом - часть кода
 
Задача вот в чем. Имеется macro1 и macro2.
Каждый из них имеет свой код.
macro2 может запускаться как самостоятельно так и из макроса macro1.
Попытался объявить переменную в macro1 чтобы в macro2 проверять ее и при несовпадении чтобы он пропускал часть кода, но не получилось.
Так вот смысл в том чтобы если макрос 2 запускается самостоятельно, то чтобы выполнялся весь код, а если из-под макроса1, то чтобы только со второй части кода...
Может кто подскажет как это реализовать и вообще возможно ли такое?)
Код
Sub macro1()
Dim zzz As Boolean
zzz = True
MsgBox "Макрос выполнен, перехожу к другому"
macro2
End sub

Sub macro2()
'первая часть кода
On Error Resume Next
If zzz = False Then
If msgbox ("Выполнить первую часть кода?", vbYesNo) = vbNo Then Exit Sub
End If
'вторая часть кода
Range ("A1:C20").ClearContents
End Sub
 
например ввести переменную bSkip
Код
Dim bSkip As Boolean
Sub macro1()
Dim zzz As Boolean
zzz = True
MsgBox "Макрос выполнен, перехожу к другому"
bSkip = True
macro2
bSkip  = False
End Sub
 
Sub macro2()
If not bSkip  Then
     'первая часть кода
    On Error Resume Next
    If zzz = False Then
    If MsgBox("Выполнить первую часть кода?", vbYesNo) = vbNo Then Exit Sub
    End If
End If
'вторая часть кода
Range("A1:C20").ClearContents
End Sub
Изменено: Leanna - 08.02.2015 02:30:26 (наоборот всё)
Работать надо не 12 часов, а головой.
 
Dim zzz As Boolean объявляйте вне макросов.
Ну и во втором после работы скидывайте zzz в false.
 
Leanna, вот оно оказывается как надо)))))) КРУТО!!! СПАСИБИЩЕ))))))))
Hugo, да я и во вне макросов объявлял, но тоже не получалось, а оказывается вот оно как надо...
 
Я вот так предлагал:

Код
Dim zzz As Boolean

Sub macro1()
    zzz = True
    MsgBox "Макрос выполнен, перехожу к другому"
    macro2
End Sub

Sub macro2()
'первая часть кода
    On Error Resume Next
    If zzz = False Then
        If MsgBox("Выполнить первую часть кода?", vbYesNo) = vbNo Then Exit Sub
    End If
    'вторая часть кода
    Range("A1:C20").ClearContents
    zzz = False
End Sub
 
 
Hugo, так толку то от его скидывания если скидывание в конце макроса происходит а он и в начале его не проверял!
 
Цитата
andrey062006 пишет: скидывание в конце макроса происходит а он и в начале его не проверял!
Как это не проверял? А это что?
Код
If zzz = False Then
 
 
Юрий М, ну вот в таком виде почему то у меня не срабатывал, а вот как написала Leanna, всё заработалос разу)
 
Так ведь и у Leanna точно такая же проверка. Единственная разница, переменная объявлена на уровне модуля, а у вас внутри процедуры - вторая процедура её не "видит".
 
Юрий М, понял кажется в чем ошибка, я ее объявлял во вне макросов но не Dim а Public, видимо поэтому и не работало(
 
Да Public тоже должна была сработать, только нужно, чтобы она была объявлена в области деклараций - до первого Sub.
 
Если паблик - то переменная будет видна всюду, а если дим - то только в макросах этого модуля.
А сбрасывать ззз в конце нужно для того, чтоб если сперва выполняете первый+второй, а затем только второй - чтоб когда только второй то этот макрос отрабатывал весь! Понятно? :)
 
Hugo, ясно, спасибо
Юрий М, спасибо  
Страницы: 1
Наверх