Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
trvi
26 / 1 / 0
Регистрация: 20.02.2013
Сообщений: 126
1

Как при ошибке передать выход Exit Sub в сам код

11.03.2013, 15:39. Просмотров 2415. Ответов 20
Метки нет (Все метки)

Есть код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Sub Generate()
    Dim ws0 As Worksheet
    Set ws0 = Worksheets("Лист0")
 
    Dim ws1 As Worksheet
    Set ws1 = Worksheets("Лист1")
 
    Dim ws2 As Worksheet
    Set ws2 = Worksheets("Лист2")
 
    Dim rn As Range
    Set rn = ws1.Range("A1:Z100")
 
Application.ScreenUpdating = False
 
    With ws0
        d_A# = .Range("D6")
        d_B# = .Range("E6")
    End With
 
    Call Check_Err(d_A, d_B, d_T, d_C) ' вызов функции и присвоение ей параметров макроса
 
Application.ScreenUpdating = True
End Sub
 
В отдельному модуле идет проверка на ошибки:
 
Sub Check_Err(a1#, b1#)
    If a1 < b1 Then
        MsgBox ("Ширина не может быть больше Длины!")
        Exit Sub ' выход
    End If
 
    If (a1 / b1) > 3 Then
        MsgBox ("Длина не может привышать Ширину более чем в 3 раза!")
        Exit Sub ' выход
    End If
 
End Sub
Как при ошибке передать выход ExitSub в сам код. У меня ExitSub в функции, а мне надо, чтобы функция проверяя на валидность, отключала бы дальнейшее выполнение кода.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2013, 15:39
Ответы с готовыми решениями:

Как сделать выход из окна при нажатии кнопки "Exit" в PyQt5?
Изучаю книгу &quot;Python 3 и PyQt. Разработка приложений.&quot; Книга написана для...

Нужен ли выход из приложения при ошибке glfwOpenWindow
if( !glfwOpenWindow( 300,300, 0,0,0,0,0,0, GLFW_WINDOW ) ) { ...

Как создать HTML код, который при заходе на ссылку сам кликал по горизонтали и вертикали
помогите

Досрочный выход из программы - функция exit
как выйти досрочно из программы exit(0); выдаёт ошибку. 'exit' was not...

Исправить exit на формальный выход из цикла
Нужно исправить все exit на формальный выход из цикла, help :help: uses crt;...

20
ikki
призрак
2823 / 879 / 118
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
11.03.2013, 15:47 2
у вас этот код вообще запускается?
в объявлении процедуры - два параметра, в вызоче - четыре...


по вопросу:
объявите процедуру как функцию, присваивайте ей результат, этот результат проверяйте в вызывающей процедуре.

примерно так:

Visual Basic
1
2
3
4
5
6
7
8
9
sub main()
  x=f(a,b,c)
  if x=-1 then exit sub
end sub
 
function f%(x,y,z)
  if x>y then f=-1
  if y/z >3 then f=-1
end function
1
Igor_Tr
4369 / 653 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
11.03.2013, 15:51 3
Я обявляю переменную модуля public dim bExit as boolean.
Visual Basic
1
2
3
4
5
6
 bExit = False 
    If (a1 / b1) > 3 Then
        MsgBox ("Длина не может привышать Ширину более чем в 3 раза!")
        bExit = true ' !!!!!!!
        Exit Sub ' выход
    End If
Потом проверяю значение bExit в нужном месте, что влечет какие-то действия (if bExit = true then Exit function). Меня выручает. Но если есть другие пути - буду тоже благодарный за подсказку.
Смотрю, тут Ikki тоже на вашу тему ответил. Тот же принцып, только проверяется какое-то значение.
0
IvanOK
693 / 99 / 10
Регистрация: 25.06.2011
Сообщений: 718
11.03.2013, 15:57 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

попробуй вместить все в один модуль
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Dim temp As Boolean
 
Sub Generate()
 Dim ws0 As Worksheet
 Set ws0 = Worksheets("Лист0")
 
 Dim ws1 As Worksheet
 Set ws1 = Worksheets("Лист1")
 
 Dim ws2 As Worksheet
 Set ws2 = Worksheets("Лист2")
 
 Dim rn As Range
 Set rn = ws1.Range("A1:Z100")
 
 Application.ScreenUpdating = False
 
 With ws0
 'd_A# = .Range("D6")
 'd_B# = .Range("E6")
 d_A# = 1
 d_B# = 5
 End With
  temp = True
 
  Check_Err d_A, d_B  'вызов функции и присвоение ей параметров макроса
 
 Application.ScreenUpdating = True
 If temp = False Then Exit Sub
 End Sub
 
  Function Check_Err(a1#, b1#)
  If a1 < b1 Then
 MsgBox ("Ширина не может быть больше Длины!")
 temp = False
 Exit Function ' выход
 End If
 
 If (a1 / b1) > 3 Then
 MsgBox ("Длина не может привышать Ширину более чем в 3 раза!")
 temp = False
 Exit Function ' выход
 End If
 
 End Function
0
trvi
26 / 1 / 0
Регистрация: 20.02.2013
Сообщений: 126
11.03.2013, 16:01  [ТС] 5
У меня функция отдельно. Мне надо чтобы она передала ошибку в основной код и завершила бы его выполнение
0
Igor_Tr
4369 / 653 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
11.03.2013, 17:13 6
А какая разница где она? Вы определяете false в основной. Вызываете функуцию, в которой меняется (если) на True. Это true проверяется в основной сразу после выхода из функции. Но повторяю - булевая переменная глобальная.
1
Igor_Tr
4369 / 653 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
11.03.2013, 17:26 7
Я не сказал до конца. Если у Вас "многоуровневый" проект. To-есть, Вы вызвали процедуру из процедуры, и з которой вызвали еще одну процедуру и из этой последней (а может и не последней) вызвали фукцию где меняется значение, то и, в зависимости от нужд, проверять нужно значение везде в обратном порядке до нужного Вам места. Если нет, процес будет продолжаться как ни в чем небывало.
0
trvi
26 / 1 / 0
Регистрация: 20.02.2013
Сообщений: 126
11.03.2013, 17:31  [ТС] 8
IvanOK,
Сделал так - не работает:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub Generate()
    
    Dim ws0 As Worksheet
    Set ws0 = Worksheets("Лист0")
 
Application.ScreenUpdating = False
 
    With ws0
        d_A# = .Range("D6")
        d_B# = .Range("E6")
    End With
    
    Dim temp As Boolean
    temp = True
    Check_Err d_A, d_B, d_T, d_C
    
    If temp = False Then MsgBox ("hello") ' Exit Sub
 
Application.ScreenUpdating = True
End Sub
0
IvanOK
693 / 99 / 10
Регистрация: 25.06.2011
Сообщений: 718
11.03.2013, 17:52 9
Цитата Сообщение от IvanOK Посмотреть сообщение
Dim temp As Boolean
ты проставил?

Цитата Сообщение от IvanOK Посмотреть сообщение
Visual Basic
1
2
3
Function Check_Err(a1#, b1#)
  If a1 < b1 Then
 MsgBox ("Ширина не может быть больше Длины!")
обрати внимание
Visual Basic
1
2
3
4
5
6
7
8
9
 temp = False
 Exit Function ' выход
 End If
If (a1 / b1) > 3 Then
 MsgBox ("Длина не может привышать Ширину более чем в 3 раза!")
 temp = False
 Exit Function ' выход
 End If
End Functio
n
Цитата Сообщение от IvanOK Посмотреть сообщение
Visual Basic
1
temp = False
перед вызовом функцией
Цитата Сообщение от IvanOK Посмотреть сообщение
Visual Basic
1
temp = True
Добавлено через 53 секунды
Цитата Сообщение от trvi Посмотреть сообщение
Check_Err d_A, d_B, d_T, d_C
что ето ?
ты сначела проставь мой код в один модуль и посмотри как он работает
0
Igor_Tr
4369 / 653 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
11.03.2013, 18:08 10
To IvanOk. На всякий случай: видимось переменной, обявленой всередине процедуры - только в пределах этой процедуры. Видимость переменной, обявленной в самом верху модуля, после Option Explicit (Private Dim....), перед первым Sub ...() - в пределах модуля, не зависимо от колличества в нем процедур или функций. Если там-же, но Public Dim... - видимость всеми модулями книги и больше, если грамтно вызвать из других книг.
1
Казанский
14337 / 5949 / 1576
Регистрация: 24.09.2011
Сообщений: 9,368
11.03.2013, 20:25 11
Цитата Сообщение от trvi Посмотреть сообщение
мне надо, чтобы функция проверяя на валидность, отключала бы дальнейшее выполнение кода
Оператор End
0
IvanOK
693 / 99 / 10
Регистрация: 25.06.2011
Сообщений: 718
11.03.2013, 20:36 12
Igor_Tr,
Цитата Сообщение от Igor_Tr Посмотреть сообщение
после Option Explicit (Private Dim....), перед первым Sub ...() - в пределах модуля
для решения етой задачи больше не надо
0
trvi
26 / 1 / 0
Регистрация: 20.02.2013
Сообщений: 126
12.03.2013, 10:15  [ТС] 13
Если функцию перенести в отдельный модуль, то выхода в случае ошибки не происходит!!! У меня один модуль: run и модель проверок на ошибки: checkerror. В модуле run основной макрос, в модуле checkerror - функция. Если функцию положить рядом с макросом, то всё работает, если перенести в отдельный модуль, то нет.

Я изначально говорил, что функция проверки на ошибку лежит в отдельном модуле.

Добавлено через 58 минут
Разобрался... всем спасибо
0
Igor_Tr
4369 / 653 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
12.03.2013, 12:15 14
Давайте еще раз. Спокойно и по порядку. Вы обявляете ГЛОБАЛЬНУЮ ПЕРЕМЕННУЮ Publiс Dim bExit as Boolean в МОДУЛЕ (не в процедуре!!!), где лежит процедура Run. Из этой процедуры вызвали функцию которая лежит в другом модуле, перед вызовом которой в процедуре Run назначили переменной значение bExit = False. В функии что-то проверили и решили выйти (из функции):
Visual Basic
1
2
3
4
 if [условие] then
   bExit = true
   exit Function
end if
Здесь Вы вернетесь в первый модуль, в процедуру Run, в строку, которая следующая после строки вызова функции из другого модуля. Вот это "следующая строка" и должна быть строкой проверки значения bExit:
Visual Basic
1
 If bExit = true Then End ' (полная остановка всего)
Если все-таки эта процедура была промежуточной, и Вам нужно сразу вернутся в предыдущую этой промежуточной, из которой была вызвана функция, тогда
Visual Basic
1
  If bExit = true Then Exit sub
Это просто обязано работать. Еще такого чуда, чтоб не работало, у меня не было.

Добавлено через 1 час 47 минут
Наверное, я тогда еще не проснулся... Что б не вводить народ в ошибки, вместо
Publiс Dim bExit as Boolean
глобальную нужно прописывать
Publiс bExit as Boolean
Извиняюсь
1
trvi
26 / 1 / 0
Регистрация: 20.02.2013
Сообщений: 126
12.03.2013, 13:05  [ТС] 15
Igor_Tr,

Спасибо! Твой второй вариант тоже подойдёт!!
0
Igor_Tr
4369 / 653 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
12.03.2013, 13:52 16
Не понял. А какой был первый? Я кажется с самого начала говорил об одном. Меня наверное не до конца понимали. Еще и сам просил, что если кто-то знает, как по другому - пусть скажет и я буду благодарен.
0
trvi
26 / 1 / 0
Регистрация: 20.02.2013
Сообщений: 126
12.03.2013, 14:17  [ТС] 17
Вот такой вариант:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub Generate()
    Dim ws0 As Worksheet
    Set ws0 = Worksheets("Лист0")
    With ws0
        d_A# = .Range("D6")
        d_B# = .Range("E6")
    End With
    
    x = f_error(d_A, d_B)
    If x = -1 Then Exit Sub
End Sub
Visual Basic
1
2
3
4
5
6
Function f_error%(a1#, b1#)
    If a1 < b1 Then
        MsgBox ("Ширина не может быть больше Длины!")
        f_error = -1
    End If
End Function
0
Igor_Tr
4369 / 653 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
12.03.2013, 14:22 18
To trvi. Вопрос не по теме этого форума, но мне очень интересно. Я - технарь. До мозга.... AutoCad - очень родная сфера. А что ж Вы такое делаете в нем с помощью VBA? Там есть родной - Autolisp. VBA - это вспомогательное, ну, например, легче отправить на плоттер. И в полной версии там столько всего наворочено, что ума не приложу, зачем усложнять VBA. В своей сфере AutoCad по мощности - как целый MSOffice. Если сравнивать с ArchiCad, тогда то, что можно сделать в AutoCAD, в другом и подумать нельзя (попробуйте запроектировать винтовую лестницу с наклонной осью и сплошным заполнением экранов). Lisp - это родная среда САПР.

Добавлено через 3 минуты
А!!! Но это не мой. Это Ikki!. Но принцып тот же.
1
trvi
26 / 1 / 0
Регистрация: 20.02.2013
Сообщений: 126
12.03.2013, 14:39  [ТС] 19
Igor_Tr,

Я тоже инженер. У меня в AutoCAD тоже все написано на лиспе... не люблю примочки типа Mechanics и т. п. предпочитаю лисп - отличное решение.

Про VBA на AutoCAD - долгий разговор... честно, очень долго объяснять... У не специалист по VBA, я специалист по продуктам Autodesk, ой... не будем заниматься фалометрией...
1
Igor_Tr
4369 / 653 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
12.03.2013, 14:57 20
Спасибо. Но все-равно я весь в догадках....
0
12.03.2013, 14:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2013, 14:57

Как передать переменную при загрузке страницы из js в php код?
Нужно представить, что при каждой загрузке страницы одной js-переменной (var...

Indy : получить код страницы при 503 ошибке
Здравствуйте. При обращении к сайту получаю ошибку HTTP/1.1 503 Service...

Какой статус код возвращать при ошибке пользователя?
Здравствуйте. Возник вопрос. А что, если пользователь введет неверные данные в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru