powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / try catch в VBA
25 сообщений из 34, страница 1 из 2
try catch в VBA
    #34646480
Самурай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В С++ есть такая тема, как локальный отлов ошибок (try {...} catch (...) {...})

Есть ли такая же возможность в VBA? Мне нужно отловить возможную ошибку в небольшой части кода. Если ошибка обнаружена, то надо выполнить определённые действия, после чего продолжить выполнение кода, расположенного после ошибочного куска.

Это как-нибудь можно сделать?
_____________________________
Использую Access 2003, mdb
...
Рейтинг: 0 / 0
try catch в VBA
    #34646489
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On Error
...
Рейтинг: 0 / 0
try catch в VBA
    #34646602
Самурай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторOn Error

А можно привести пример кода? Так чтобы ошибка искалась только в определённом участке кода, и нигде больше.
_____________________________
Использую Access 2003, mdb
...
Рейтинг: 0 / 0
try catch в VBA
    #34646640
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код.............
код.............
On Error Goto Метка
код с проверкой
код с проверкой
Метка:
Обработка ошибки
...
Рейтинг: 0 / 0
try catch в VBA
    #34646716
Самурай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что произойдёт, если ошибки не будет? Он же просто пройдёт участок кода
Код: plaintext
1.
код с проверкой
код с проверкой
, дойдёт до метки Метка:, после чего выполнит все инструкции по обработке ошибок (т.е. в моём случае выдаст сообщение, даже если ошибки не было)...



_____________________________
Использую Access 2003, mdb
...
Рейтинг: 0 / 0
try catch в VBA
    #34646787
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это же не рабочий код. Конечно, существуют обходы, типа Goto, Exit Sub и т.д.
...
Рейтинг: 0 / 0
try catch в VBA
    #34646878
Самурай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Это же не рабочий код. 

Так вот я и просил пример РАБОЧЕГО кода, который бы мог подойти в моей ситуации...;-)))
...
Рейтинг: 0 / 0
try catch в VBA
    #34646909
Karfaqen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Function test()
On Error GoTo err1
    Dim i&
    If MsgBox("Делим на ноль?",  32  + vbYesNo) = vbYes Then i =  1  /  0 
    MsgBox "Выходим по-хорошему",  64 
    Exit Function
err1:
    MsgBox Error,  16 , "ОМАШКА"
    Exit Function
End Function
...
Рейтинг: 0 / 0
try catch в VBA
    #34646914
ч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ч
Гость
зоздай на форме кнопку при помощи мастера и у тебя будет код
...
Рейтинг: 0 / 0
try catch в VBA
    #34646939
ЛП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Karfaqen
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Function test()
On Error GoTo err1
    Dim i&
    If MsgBox("Делим на ноль?", 32 + vbYesNo) = vbYes Then i = 1 / 0
    MsgBox "Выходим по-хорошему", 64
    Exit Function
err1:
    MsgBox Error, 16, "ОМАШКА"
    Exit Function
End Function

ужоснах
над строкой "32 + vbYesNo" - плакаль...
:)
...
Рейтинг: 0 / 0
try catch в VBA
    #34647011
Самурай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, приведу кусок моего кода, чтобы было понятно, чего же я хочу...


Код: plaintext
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.
On Error GoTo ErrorHandler

    'Исполняем введённый запрос для проверки его корректности
    Dim TmpRS As DAO.Recordset
    Set TmpRS = CurrentDb.OpenRecordset(Me![SelectQuery].Value)
    TmpRS.Close
    Set TmpRS = Nothing   

    
   'Проверка на повторяющиеся названия в рамках одной подгруппы
   'если добавляется новая запись, то проверяются все узлы на текущем уровне вложенности
   'если редактируется старая запись, то проверяются все узлы на текущем уровне вложенности, кроме него самого
    Dim i As Integer
    For i =  2  To RequeryObject.Nodes.Count 'просматриваем все узлы, кроме корневого
        If (Me.NewRecord And RequeryObject.Nodes(i).Text = Me![Name].Value And RequeryObject.Nodes(i).Parent.Key = RequeryObject.Nodes(RequeryObject.SelectedItem.Index).Key) _
        Or (Not Me.NewRecord And i <> RequeryObject.SelectedItem.Index And RequeryObject.Nodes(i).Text = Me![Name].Value) Then
            MsgBox "В текущей подгруппе уже имеется запись с таким названием!", vbCritical, "Ошибка заполнения"
            Exit Sub
        End If
    Next i

    DoCmd.Close acForm, Form.Name  'закрытие формы
    
ExitFunction:
    Exit Sub
    
ErrorHandler:
    MsgBox "Ошибка во введённом SELECT-запросе: """ & Err.Description & """", vbCritical, "Ошибка"
    Resume ExitFunction
    
End Sub


Так вот... Мне нужно, чтобы сообщение

Код: plaintext
MsgBox "Ошибка во введённом SELECT-запросе: """ & Err.Description & """", vbCritical, "Ошибка"

появлялось только в том случае, если ошибка возникла ТОЛЬКО в куске кода

Код: plaintext
1.
    Dim TmpRS As DAO.Recordset
    Set TmpRS = CurrentDb.OpenRecordset(Me![SelectQuery].Value)

Потому что, если какая-нибудь ошибка возникнет здесь:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   'Проверка на повторяющиеся названия в рамках одной подгруппы
   'если добавляется новая запись, то проверяются все узлы на текущем уровне вложенности
   'если редактируется старая запись, то проверяются все узлы на текущем уровне вложенности, кроме него самого
    Dim i As Integer
    For i =  2  To RequeryObject.Nodes.Count 'просматриваем все узлы, кроме корневого
        If (Me.NewRecord And RequeryObject.Nodes(i).Text = Me![Name].Value And RequeryObject.Nodes(i).Parent.Key = RequeryObject.Nodes(RequeryObject.SelectedItem.Index).Key) _
        Or (Not Me.NewRecord And i <> RequeryObject.SelectedItem.Index And RequeryObject.Nodes(i).Text = Me![Name].Value) Then
            MsgBox "В текущей подгруппе уже имеется запись с таким названием!", vbCritical, "Ошибка заполнения"
            Exit Sub
        End If
    Next i

    DoCmd.Close acForm, Form.Name  'закрытие формы

тогда её уже нельзя будет назвать "Ошибка SELECT-запроса"!
...
Рейтинг: 0 / 0
try catch в VBA
    #34647044
ЛП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Самурай
Скажите, а какая в Японии официальная религия?
В смысле - она что, запрещает читать хелп?
...
Рейтинг: 0 / 0
try catch в VBA
    #34647194
Самурай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
Скажите, а какая в Японии официальная религия?
В смысле - она что, запрещает читать хелп?

Хэлп-то она читать не запрещает!)))))

Просто в хэлпе по этому поводу ничего толкового я не смог найти.

Даже если пробую проверять таким образом:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
On Error GoTo ErrorHandler

    'Исполняем введённый запрос для проверки его корректности
    Dim TmpRS As DAO.Recordset
    Set TmpRS = CurrentDb.OpenRecordset(Me![SelectQuery].Value)

ErrorHandler:
    
    If Error() <> "" Then 'если возникла ошибка
        MsgBox "Ошибка во введённом SELECT-запросе: """ & Err.Description & """", vbCritical, "Ошибка"
        Set TmpRS = Nothing
        Exit Sub
    End If
    
    Dim d As Integer
    d =  1  /  0 


ТО мне выдаётся сообщение "Ошибка во введённом SELECT-запросе: Division by zero", хотя деление на 0 было инициировано ПОСЛЕ проверки корректности запроса!
_____________________________
Использую Access 2003, mdb
...
Рейтинг: 0 / 0
try catch в VBA
    #34647234
Фотография Drunechka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
on error goto Errhandler
...
'тра-та-та
...
on error goto Errhandler2
...
'бла-бла-бла
exit sub

ErrHandler:
'сработало на тра-та-та
resume next
ErrHandler2:
'сработало на бла-бла-бла
resume next
+ - + - + - + - + - + - +
Век живи, век учись!
...
Рейтинг: 0 / 0
try catch в VBA
    #34647244
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно понаставить столько разных переходов на РАЗНЫЕ обработчики, сколько вам нужно.

Код: plaintext
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.
On Error goto Err_DataRead
...
...
On Error goto Err_DataCalculate
...
...
On Error goto Err_DataSave
...
...

Exit Function

Err_DataRead:
...
...
Resume туда

Err_DataCalculate:
...
...
Resume куда-то еще

Err_DataSave:
...
...
Resume куда-то в другое место
...
Рейтинг: 0 / 0
try catch в VBA
    #34647292
Самурай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Drunechka и Программист-Любитель ОГРОМНОЕ СПАСИБО!))) Теперь всё работает так, как нужно!))
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
try catch в VBA
    #39174920
guest123123222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
использовать GoTo в 21 веке? это не язык программирования, это чудовище
...
Рейтинг: 0 / 0
try catch в VBA
    #39174927
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest123123222использовать GoTo в 21 веке? это не язык программирования, это чудовище

спагетти можно сварить и без GOTO
еще круче получится
-------------
всегда применяла GOTO для выхода на конец процедуры или обработку ошибок
причем задолго до того, как прочитала про структурное программирование
...
Рейтинг: 0 / 0
try catch в VBA
    #39174963
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest123123222использовать GoTo в 21 веке?
Потрясающая глупость... а если бы синтаксис требовал другого литерала? например ON ERROR EXECUTE FROM label ? язык бы подходил для 21 века?
...
Рейтинг: 0 / 0
try catch в VBA
    #39174969
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest123123222использовать GoTo в 21 веке? это не язык программирования, это чудовище

а критиковать посты десятилетней давности, даже не замечая этого - ещё хуже...
...
Рейтинг: 0 / 0
try catch в VBA
    #39174975
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmagа критиковать посты десятилетней давности, даже не замечая этого - ещё хуже...
Претензии - к движку форума. У него бывают заскоки, и он в списке обновлённых сообщений совершенно безосновательно отображает древние темы. Отвечающий редко начинает просмотр темы с изучения дат публикации сообщений - обычно читают сами сообщения, и, если от контента не веет древностью, на даты вообще не смотрят. Сам пару раз так прокалывался.
...
Рейтинг: 0 / 0
try catch в VBA
    #39174989
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

а может и от браузера зависит и от внимательности... обычно когда тыкаешь ответить - то выскакивает напоминалка типа "а ничего что сообщению уже больше года ?"
...
Рейтинг: 0 / 0
try catch в VBA
    #39174990
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

а может и от браузера зависит и от внимательности... обычно когда тыкаешь ответить - то выскакивает напоминалка типа "а ничего что сообщению уже больше года ?"
...
Рейтинг: 0 / 0
try catch в VBA
    #39174991
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag,

хотя да, движок поддает - один раз нажал отправить...
...
Рейтинг: 0 / 0
try catch в VBA
    #39175025
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmagобычно когда тыкаешь ответить - то выскакивает напоминалка типа "а ничего что сообщению уже больше года ?"Значит, у меня всё необычно - ни разу не видел такого сообщения.
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / try catch в VBA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]