2014-11-17 1 views
2

Я создаю инструмент, который извлекает данные из других файлов Excel и выполняет различные типы анализа. Из-за этих многочисленных различных анализов мне пришлось создать несколько подсетей, которые затем все вызываются в «master», что активируется, когда пользователь нажимает кнопку.Как остановить суб, который вызывает несколько подкатегорий

Проблема, с которой я столкнулся, связана с обработкой ошибок, чтобы остановить макрос при возникновении проблемы или когда пользователь пытается остановить сам код - например, появляется всплывающее окно со сценарием типа «продолжить или остановить». Тем не менее, я не могу решить, как остановить макросы! Использование Exit Sub не работает, потому что мастер-подпрограмма просто перейдет к следующему югу в очереди.

См. Пример ниже - пользователь нажимает кнопку, чтобы активировать master_sub. Если в течение 1-го этапа пользователь выбирает «Нет» или «Отмена» в MsgBox, суб1 завершается (если используется Exit Sub), но master_sub просто перейдет к sub2 и sub3. Как мне сделать master_sub stop на основе ввода/действия в пределах sub1?

Sub sub1() 
    Dim MyMsg as Variant 
    MyMsg = msgbox("Do you wish to continue?", vbYesNo) 
    If MyMsg = 7 then 'If user clicks "No" 
     Exit Sub 
    Else 
     'Do stuff 
    End if 
End Sub 

Sub sub2() 
    'More stuff 
End Sub 

Sub sub3() 
    'Other stuff 
End Sub 

master_sub() 
    call sub1 
    call sub2 
    call sub3 
End Sub 
+0

Если вы пишете макрос, вы не используете VB.NET – Plutonix

+0

Да, не знаю, откуда появился тег vb.net. Теперь изменен. – Jules

ответ

0

Вместо использования Exit Sub Внесите индивидуальное исключение и поймайте его в своем master_sub.

Что-то вроде

Sub sub1() 
    Dim MyMsg as Variant 
    MyMsg = msgbox("Do you wish to continue?", vbYesNo) 
    If MyMsg = 7 then 'If user clicks "No" 
     Throw new MyException 
    Else 
     'Do stuff 
    End if 
End Sub 

master_sub() 
Try 
    call sub1 
    call sub2 
    call sub3 
Catch ex as MyException 
'Do something if you want 
End Try 
End Sub 
+0

Примечание: этот ответ был отправлен, в то время как у вопроса был тэг [vb.net]. Ответ не применим в [vba]. – YowE3K

0

вопрос «как же master_sub» определяет, когда один из методов ребенка был отменен может быть решена так:

Sub master_sub() 
    Dim result As Boolean 

    result = Sub1() 
    If (result = False) Then 
     Exit Sub 
    End If 

    result = Sub2() 
    If (result = False) Then 
     Exit Sub 
    End If 

    result = Sub3() 
    If (result = False) Then 
     Exit Sub 
    End If 
End Sub 

Function Sub1() As Boolean 
    Return True 
End Function 

Function Sub2() As Boolean 
    Return False 
End Function 

Function Sub3() As Boolean 
    Return True 
End Function 

Я держал это очень просто, но в основном путем изменения от Sub до Function вы можете вернуть каждому методу значение и принять решение в своей основной подпрограмме (master_sub), что делать в зависимости от возвращаемого значения.

Смежные вопросы