При ошибке access

Access для Microsoft 365 Access 2021 Access 2019 Access 2016 Access 2013 Access 2010 Access 2007 Еще…Меньше

С помощью макрокоманды ПриОшибке можно указать действие, выполняемое при возникновении ошибки в макросе.

Примечание: Макрокоманда «ПриОшибке» недоступна в веб-приложениях Access.

Настройка

Макрокоманда ПриОшибке имеет следующие аргументы:

Аргумент макрокоманды

Описание

Перейти

Определяет общее поведение после возникновения ошибки. Щелкните стрелку раскрывающегося списка и выберите одно из следующих значений:

Параметр

Описание

Далее

Access записывает подробные сведения об ошибке в объекте ОшибкаМакроса, но не останавливает макрос. Выполнение продолжается со следующей макрокоманды.

Имя макроса

Access останавливает выполнение текущего макроса и запускает макрос, указанный в аргументе Имя макроса.

Сбой

Access останавливает выполнение текущего макроса и отображает сообщение об ошибке.

Имя макроса

Если аргумент Перейти имеет значение Имя макроса, введите имя макроса, который будет использоваться для обработки ошибок. Введенное имя должно соответствовать имени вложенного макроса для текущего макроса; нельзя указать имя другого объекта. В следующем примере макрос «ОбработчикОшибок» содержится в том же объекте макроса, что и макрокоманда ПриОшибке.

Этот аргумент должен оставаться пустым, если аргумент Перейти имеет значение Далее или Сбой.

Замечания

  • Макрокоманда ПриОшибке обычно находится в начале макроса, но ее можно поместить и дальше. Правила, определяемые этой макрокомандой, будут действовать независимо от места ее запуска.

  • Если для аргумента «Перейти» установлено действие «Сбой», Access работает так же, как если бы в макросе не было макро макроса «При Входе». Таким образом, если произошла ошибка, Access останавливает макрос и выводит стандартное сообщение об ошибке. Основное использование параметра «Сбой» — отключение обработки ошибок, которые были установлены ранее в макросе.

Пример

Следующий макрос демонстрирует использование макрокоманды ПриОшибке. В данном примере макрокоманда ПриОшибке указывает, что при возникновении ошибки будет выполнен пользовательский вложенный макрос «ОбработчикОшибок». Если в любой из последующих макрокоманд произойдет ошибка, Access перейдет к вложенному макросу «ОбработчикОшибок». Макрос «ОбработчикОшибок» отображает окно сообщения с данными об ошибке из объекта ОшибкаМакроса.

Имя вложенного макроса

Макрокоманда

Аргументы

ПриОшибке

Перейти: Имя макроса

Имя макроса: ОбработчикОшибок

[Макрокоманда 2]

[Макрокоманда n]

ОбработчикОшибок

Окно сообщения

Сообщение: =»Ошибка» & [MacroError].[Номер] & «в макрокоманде» & [MacroError].[ИмяМакрокоманды].

Сигнал: Да

Тип: Отсутствует

Заголовок: Произошла ошибка

Ниже показан снимок экрана с конструктором макросов Access (в Access 2010 или более поздней версии), в котором настроен макрос из предыдущего примера. В этом случае выражение в макрокоманде ЗадатьЛокПеременную вызывает ошибку из-за попытки деления на нуль. Access переходит к вложенному макросу с именем «ОбработчикОшибок» и выводит окно сообщения со сведениями об ошибке.

Рабочая область конструирования макросов Access с макрокомандой "ПриОшибке".

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.

В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.

Обработка ошибок на этапе выполнения

Как
бы тщательно не проверялся код, на этапе
его выполнения неизбежно возникают
ошибки. Попытка деления на ноль – это
типичный пример ошибки времени выполнения.
В Access обработка ошибок выполняется с
помощью инструкции On Error. Имеется три
вида инструкций On Error:

  1. On Error GoTo Метка – осуществляет переход
    на строку с меткой (Метка) при возникновении
    произвольной ошибки на этапе выполнения.
    После обработки ошибки можно либо
    вызвать повторение той части кода, где
    произошла ошибка, либо проигнорировать
    ошибку и продолжить выполнение
    последующих инструкций. Для возвращения
    на строку с ошибкой используется
    ключевое слово Resume.

  2. On Error Resume Next – игнорирует ошибку и
    продолжает выполнение последующих
    инструкций.

  3. On Error GoTo 0 – отключает обработку ошибок.

После
обработки первой ошибки инструкция On
Error GoTo Метка продолжает выполняться для
всех последующих ошибок, пока не
закончится выполнение данной процедуры
либо обработка ошибок не будет явно
отключена инструкцией On Error GoTo 0. Если
нет обработки какой-то ошибки или
обработка выключена, то при возникновении
необработанной ошибки приложение сразу
же выдаст сообщение об ошибке и прекратит
работу.

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

Private Sub
MyID_DblClick(Cancel As Integer)

On Error GoTo
Err_MyID_DblClick

Текст процедуры

Exit_MyID_DblClick:

Exit Sub

Err_MyID_DblClick:

MsgBox
Err.Description

Resume
Exit_MyID_DblClick

End Sub

Объект
Err содержит информацию об ошибках
выполнения и обычно используется вместе
со структурой Select Case, чтобы определить,
какое действие предпринять в зависимости
от кода ошибки.

Select Case Err

Case 58 To 76

Call FileError- процедура обработки ошибок
работы с файлами

Case 281 To 297

Call DDEError — процедура для обработки ошибок
DDE

Case 340 To 344

Call ArrayError — процедура
ошибок массивов

End
Select

Err=0
— отключение обработки необработанных
ошибок.

Работа с объектами и коллекциями

В VBA
можно работать с объектами и коллекциями
Access, библиотекой доступа к данным DAO
(Data Access Objects), библиотекой прямого доступа
к данным баз данных ODBC (ODBC Direct), библиотекой
доступа к данным ADO (ActiveX Data Objects) и другими
библиотеками. В Access, DAO и ADO все объекты
расположены внутри коллекций и доступны
в VBA. Каждый объект имеет свойства и
методы. Все библиотеки организованы в
виде иерархии объектов. Объекты имеют
коллекции (семейства) подчиненных
объектов и т.д. В Access имеется восемь
базовых объектов; их иерархия представлена
на Рис. 1.

Объекты ms Access:

  1. Application – активное приложение;

  2. Control – элемент управления;

  3. DoCmd – объект вызова макрокоманд в VBA
    коде;

  4. Form – открытая форма;

  5. Module – объект, ссылающийся на стандартные
    модули;

  6. Reference – объект, содержащий ссылки на
    объекты;

  7. Report – открытый отчет;

  8. Screen – ссылка на экран;

Названия
семейств формируются путем возведения
в множественное число названия
соответствующего объекта. В свою очередь
большинство объектов имеют присоединенные
коллекции свойств (Properties),
а формы и отчеты – коллекции разделов
и т.д. Так как все объекты в Access хранятся
внутри иерархически связанных коллекций,
то доступ к объекту на нижней ступени
иерархии можно получить, указав все
имена коллекций, разделенных точкой,
начиная от корневого объекта. Например,
Application.Forms(«Заказы»).Controls(0).Properties(0).
Большинство коллекций, к примеру,
коллекции форм и отчетов, являются
глобальными. Тогда к объекту этой
коллекции можно обращаться напрямую:
Forms(«Заказы») или Forms!Заказы.

Рис. 1. Иерархия объектов Access

Поскольку библиотека DAO всегда поставляется
с Access, рассмотрим ее
структуру и основные методы более
подробно (Рис. 2).

Регистрация на форуме тут, о проблемах пишите сюда — alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите восстановить пароль

Поиск по форуму
Расширенный поиск

Страница 1 из 2 1 2 Следующая >

Почему возникает эта ошибка.
Ошибка синтаксиса (пропущен оператор) в выражении запроса ‘[Стипендія нарахування].[Середній бал]? (база данных в Access 2010)

SELECT [Стипендія нарахування].[Середній бал]
IF([Середній бал]<4,»0″,
IF([Середній бал]=5,»950″,
IF([Середній бал]>=4 And <5,»800″)) AS [Стипендія]
FROM [Стипендія нарахування];

Сообщение об ошибке при использовании специальных символов в базах данных Access

В этой статье перечислены специальные символы, которые не следует использовать при работе с именами объектов базы данных или именами полей во всех версиях Access.

Оригинальный номер базы знаний: 826763

Эта статья применима к файлам баз данных Microsoft Access (.mdb) или (.accdb), а также к файлу проекта Microsoft Access (.adp).

Симптомы

При использовании специальных символов в Access возникает одна из следующих проблем.

Проблема 1

В имени поля таблицы используется один из следующих специальных символов:

  • Знак над символом (`)
  • Восклицательный знак (!)
  • Точка (.)
  • квадратные скобки ([])
  • Пробел
  • Непечатаемые символы

В этом случае отобразится следующее сообщение об ошибке:

Недопустимое имя поля.
Убедитесь, что имя не содержит точку (.), восклицательный знак(!), квадратные скобки ([]), пробел или непечатаемый символ, например символ возврата каретки. Если вы вставляете имя из другого приложения, попробуйте нажать клавишу ESC и ввести имя еще раз.

При использовании этих специальных символов в имени таблицы отобразится следующее сообщение об ошибке:

Введенное имя объекта ‘TableName‘ не соответствует правилам именования объектов Microsoft Office Access.

Проблема 2

Вы создаете выражение запроса. Выражение запроса включает поля, содержащие специальные символы. При использовании отдельных специальных символов отображается следующее сообщение об ошибке:

Если имя поля содержит пробел, вопросительный знак (?) или знак @, отобразится следующее сообщение об ошибке:

Ошибка синтаксиса во введенном выражении.
Задано значение для операции без оператора

Если имя поля содержит кавычки («) или апостроф (‘), отобразится следующее сообщение об ошибке:

Введенное выражение содержит ошибочную строку.
Строка может содержать до 2048 знаков, включая знаки открывающей и закрывающей кавычек.

Если имя поля содержит знак решетки (#), отобразится следующее сообщение об ошибке:

Введенное выражение содержит недопустимое значение даты.

Если имя поля содержит знак процента (%), тильду (

), точку с запятой (;) или скобки ([]), отобразится следующее сообщение об ошибке:

Ошибка синтаксиса во введенном выражении.
Пропущен операнд или оператор, введен недопустимый знак или лишняя запятая, либо задана строка без кавычек.

Если имя поля содержит фигурные скобки (), отобразится следующее сообщение об ошибке:

Неверно сформированный код GUID в выражении запроса ‘ObjectName

Если имя поля содержит квадратные скобки ([]) или круглые скобки (()), отобразится следующее сообщение об ошибке:

Во введенном выражении отсутствует закрывающая скобка, квадратная скобка (]) или вертикальная черта (|).

Проблема 3

У вас есть запрос, содержащий выражения запроса. Выражения запроса включают поля, содержащие специальные символы. При выполнении запроса предлагается ввести значение параметра. Как правило, эта проблема возникает при использовании следующих специальных символов:

  • знак «больше» (>);
  • знак «меньше» (<);
  • Точка (.)
  • Звездочка (*)
  • Двоеточие (:)
  • Крышка (^)
  • Знак плюс (+)
  • Обратная косая черта ()
  • Знак равенства (=)
  • амперсанд (&);
  • Косая черта (/)

Обходной путь

Чтобы устранить эту проблему, не используйте специальные символы. Если в выражениях запроса необходимо использовать специальные символы, заключите их в квадратные скобки ([]). Например, если вы хотите использовать знак «больше» (>), используйте [>].

Дополнительная информация

Microsoft Access не ограничивает использование специальных символов, таких как знак решетки (#), точка (.) или кавычки («) в именах объектов базы данных или в именах полей базы данных. Однако при использовании специальных символов могут возникнуть непредвиденные ошибки. Поэтому корпорация Майкрософт рекомендует не использовать специальные символы в именах объектов базы данных в базе данных Access или в проекте базы данных. В этой статье рассматриваются специальные символы, которые не следует использовать во избежание известных проблем с ними.

При работе с Access или другим приложением, например приложением Microsoft Visual Basic или приложением Active Server Pages (ASP), не следует использовать следующие специальные символы:

Соглашения об именовании в Access

Корпорация Майкрософт рекомендует не использовать точку (.), восклицательный знак (!), знак ударения (`), квадратные скобки ([ ]), пробел ( ) или кавычки («) внутри имен функций, имен переменных, имен полей или имен объектов базы данных, таких как таблицы и формы.

Использование следующих специальных символов в Access приводит к возникновению известных проблем. В следующих сценариях описано, когда не следует использовать специальные символы:

Что значит пропущен оператор в выражении запроса access

Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет

Здравствуйте.

Вобще на форме выбирется ДАТА в dateTimePicker, затем хочу сделать ЗАПРОС на ВЫБОРКУ из таблицы (Access) по этой дате . ну если дата совпала, то потом все вывожу в dataGridView1

Код
OleDbDataAdapter B = new OleDbDataAdapter(«SELECT * FROM Содержание_заказа WHERE Дата=»+dateTimePicker1.Value+»», «Provider=Microsoft.Jet.OLEDB.4.0;» + «Data Source=» + @»….kafe.mdb»);
B.SelectCommand.Connection.Open();
B.SelectCommand.ExecuteNonQuery();
B.SelectCommand.Connection.Close();
DataTable C = new DataTable();
B.Fill(C);
dataGridView1.DataSource = C;

ну вобщем когда я на форме выбираю дату и нажимаю кнопку поиск ВЫЛАЗИЕТ вот такая ОШИБКА:

Код
Ошибка синтаксиса (пропущен оператор) в выражении запроса ‘Дата=03.12.2008 0:00:00’.
Код
SELECT * FROM Содержание_заказа WHERE Дата=03.12.2008 0:00:00

Помогите разобраться с этой проблемой.
Заранее спасибо.

Let’s do some .NET

Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67

kuller, dateTimePicker1.Value.ToString(«dd.MM.yyyy»);

Добавлено через 36 секунд
kuller, а вообще в каком формате дата хранится в базе?

Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет

Let’s do some .NET

Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67

Вот так выглядит у меня в Access 2003 запрос на выборку поля с датой

SELECT Table1.ID, Table1.Field1
FROM Table1
WHERE (((Table1.Field1)=#1/10/2008#));

Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет

Код
Дата содержит синтаксическую ошибку в выражении запроса ‘Дата=#03.12.2008 0:00:00#’.
Код
SELECT * FROM Содержание_заказа WHERE Дата=#03.12.2008 0:00:00#

Добавлено через 4 минуты и 4 секунды
и так ошибка(((

Код
OleDbDataAdapter B = new OleDbDataAdapter(«SELECT * FROM Содержание_заказа WHERE (([Содержание_заказа].[Дата]=» + dateTimePicker1.Value + «))», «Provider=Microsoft.Jet.OLEDB.4.0;» + «Data Source=» + @»….kafe.mdb»);
Код
Ошибка синтаксиса (пропущен оператор) в выражении запроса ‘(([Содержание_заказа].[Дата]=03.12.2008 0:00:00))’.

Let’s do some .NET

Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67

kuller, попробуйте прогнать запрос с хардкодом

Код
OleDbDataAdapter B = new OleDbDataAdapter(«SELECT * FROM Содержание_заказа WHERE Дата= #12/03/2008#», «Provider=Microsoft.Jet.OLEDB.4.0;» + «Data Source=» + @»….kafe.mdb»);
B.SelectCommand.Connection.Open();
B.SelectCommand.ExecuteNonQuery();
B.SelectCommand.Connection.Close();
DataTable C = new DataTable();
B.Fill(C);
dataGridView1.DataSource = C;

Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет

Код
OleDbDataAdapter B = new OleDbDataAdapter(«SELECT * FROM Содержание_заказа WHERE Дата=#12/03/2008#», .

ну т.к. в БД нет строки с такой датой то у меня выскочила табличка:

Код
MessageBox.Show(«Извените, по вашему запросу ничего не найдено», .

значит все работает, но это для статического варианта даты . а вот как теперь это исправить для динамически меняющейся даты.

Добавлено через 1 минуту и 8 секунд
Вот поставил 20/11/2008:
и в dataGridView1 вывелись ВСЕ найденные РЕЗУЛЬТАТЫ .. причем верные)))))

Добавлено через 3 минуты и 34 секунды
ВЫВОД:

дату надо получить из dateTimePicker1.Value и привести к виду:

#ч/м/г#,а потом только вызывать запрос.

Let’s do some .NET

Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67

Код
OleDbDataAdapter B = new OleDbDataAdapter(«SELECT * FROM Содержание_заказа WHERE Дата=#»+dateTimePicker1.Value.ToString(«dd/MM/yyyy»)+»#», «Provider=Microsoft.Jet.OLEDB.4.0;» + «Data Source=» + @»….kafe.mdb»);
B.SelectCommand.Connection.Open();
B.SelectCommand.ExecuteNonQuery();
B.SelectCommand.Connection.Close();
DataTable C = new DataTable();
B.Fill(C);
dataGridView1.DataSource = C;

Это сообщение отредактировал(а) Partizan — 4.12.2008, 12:28

Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет

Да уж(
и так не работате((((

Код
OleDbDataAdapter B = new OleDbDataAdapter(«SELECT * FROM Содержание_заказа WHERE Дата=#»+dateTimePicker1.Value.ToString(«MM/dd/yyyy»)+»#», «Provider=Microsoft.Jet.OLEDB.4.0;» + «Data Source=» + @»….kafe.mdb»);
Код
Дата содержит синтаксическую ошибку в выражении запроса ‘Дата=#11.20.2008#’.
Код
SELECT * FROM Содержание_заказа WHERE Дата=#11.20.2008#

Добавлено через 5 минут
Причем по моему не так:
ToString(«MM/dd/yyyy»)
а вот так:
ToString(«dd/MM/yyyy»)
ну всеравно не пашет((((

Это сообщение отредактировал(а) kuller — 4.12.2008, 12:32

Let’s do some .NET

Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
Sub ImportExcel2()
Dim strExcelPath As String, strTableName As String, strRangeName As String, strFile As String, IMPORT_FOLDER As String, n As Integer, strPathFile As String
Dim IMPORT_FOLDER_DONE As String, strExcelPathDone As String, strPathFileDone As String, strFileNew As String
IMPORT_FOLDER = "import"
IMPORT_FOLDER_DONE = "importимпоритрованные"
    If Dir(CurrentProject.Path & "" & IMPORT_FOLDER, vbDirectory) = "" Then
    MkDir CurrentProject.Path & "" & IMPORT_FOLDER
    End If
    
        If Dir(CurrentProject.Path & "" & IMPORT_FOLDER_DONE, vbDirectory) = "" Then
    MkDir CurrentProject.Path & "" & IMPORT_FOLDER_DONE
    End If
strExcelPath = CurrentProject.Path & "" & IMPORT_FOLDER
strExcelPathDone = CurrentProject.Path & "" & IMPORT_FOLDER_DONE
strTableName = "акты_импортированные_2"
strRangeName = "Лист1!B4:D7"
strFile = Dir(strExcelPath & "*.xlsm")
n = 0
If strFile = Empty Then
    MsgBox "В папке:" & vbCr & strExcelPath & vbCr & "нет файлов для импорта"
    Else: Do While Len(strFile) > 0
 
                strPathFile = strExcelPath & strFile
                strFileNew = "Импоритрован_" & strFile
                strPathFileDone = strExcelPathDone & strFileNew
                Call DoCmd.TransferSpreadsheet(acImport, _
                acSpreadsheetTypeExcel12, strTableName, strPathFile, _
                True, strRangeName)
                Name strPathFile As strPathFileDone
                'Kill strPathFile
                strFile = Dir()
                n = n + 1
    Loop
    MsgBox "Импортирован(о) " & n & " файл(ов)"
    End If
 
End Sub
Sub ImportExcel3()
Dim strExcelPath As String, strTableName As String, strRangeName As String, strFile As String, IMPORT_FOLDER As String, n As Integer, strPathFile As String
Dim IMPORT_FOLDER_DONE As String, strExcelPathDone As String, strPathFileDone As String, strFileNew As String
IMPORT_FOLDER = "import"
IMPORT_FOLDER_DONE = "importимпоритрованные"
    If Dir(CurrentProject.Path & "" & IMPORT_FOLDER, vbDirectory) = "" Then
    MkDir CurrentProject.Path & "" & IMPORT_FOLDER
    End If
    
        If Dir(CurrentProject.Path & "" & IMPORT_FOLDER_DONE, vbDirectory) = "" Then
    MkDir CurrentProject.Path & "" & IMPORT_FOLDER_DONE
    End If
strExcelPath = CurrentProject.Path & "" & IMPORT_FOLDER
strExcelPathDone = CurrentProject.Path & "" & IMPORT_FOLDER_DONE
 
strFile = Dir(strExcelPath & "*.xlsm")
n = 0
 
If strFile = Empty Then
    MsgBox "В папке:" & vbCr & strExcelPath & vbCr & "нет файлов для импорта"
    Else: Do While Len(strFile) > 0
    
                          
                strPathFile = strExcelPath & strFile
                strFileNew = "Импоритрован_" & strFile
                strPathFileDone = strExcelPathDone & strFileNew
                strTableName = "rekvizity"
                strRangeName = "rekvizity"
                Call DoCmd.TransferSpreadsheet(acImport, _
                acSpreadsheetTypeExcel12, strTableName, strPathFile, _
                True, strRangeName)
                
                strTableName = "obekty"
                strRangeName = "obekty"
                Call DoCmd.TransferSpreadsheet(acImport, _
                acSpreadsheetTypeExcel12, strTableName, strPathFile, _
                True, strRangeName)
                
                strTableName = "napravleniy"
                strRangeName = "napravleniy"
                Call DoCmd.TransferSpreadsheet(acImport, _
                acSpreadsheetTypeExcel12, strTableName, strPathFile, _
                True, strRangeName)
                
                strTableName = "meropriytiy"
                strRangeName = "meropriytiy"
                Call DoCmd.TransferSpreadsheet(acImport, _
                acSpreadsheetTypeExcel12, strTableName, strPathFile, _
                True, strRangeName)
                
                strTableName = "narusheniy"
                strRangeName = "narusheniy"
                Call DoCmd.TransferSpreadsheet(acImport, _
                acSpreadsheetTypeExcel12, strTableName, strPathFile, _
                True, strRangeName)
                
                Name strPathFile As strPathFileDone
                'Kill strPathFile
                strFile = Dir()
                n = n + 1
             
    Loop
    MsgBox "Импортирован(о) " & n & " файл(ов)"
    End If
        
End Sub

Содержание

  • Памятка по ошибкам VBA
  • Обработка ошибок VBA
  • Заявление об ошибке VBA
  • VBA IsError
  • Если ошибка VBA
  • Типы ошибок VBA
  • Другие термины ошибок VBA
  • Обработка ошибок VBA в Access

Ошибки

ОписаниеКод VBAПри ошибке — код остановки и ошибка отображенияПри ошибке Перейти к 0При ошибке — пропустить ошибку и продолжить работуПри ошибке Возобновить ДалееПри ошибке — перейдите к строке кода [Ярлык]При ошибке Перейти к [ярлык]Сбрасывает (сбрасывает) ошибкуПри ошибке GoTo -1Показать номер ошибкиMsgBox Err.NumberПоказать описание ошибкиMsgBox Ошибка ОписаниеФункция для генерации собственной ошибкиErr.Raise

См. Другие «Шпаргалки» по VBA и бесплатные загрузки в формате PDF.

Обработка ошибок VBA

Обработка ошибок VBA относится к процессу прогнозирования, обнаружения и устранения ошибок времени выполнения VBA. Процесс обработки ошибок VBA происходит при написании кода до того, как на самом деле возникнут какие-либо ошибки.

Ошибки времени выполнения VBA — это ошибки, возникающие во время выполнения кода. Примеры ошибок времени выполнения включают:

  • Ссылка на несуществующую книгу, лист или другой объект
  • Неверные данные напр. ссылка на ячейку Excel, содержащую ошибку
  • Попытка разделить на ноль

Заявление об ошибке VBA

Большая часть обработки ошибок VBA выполняется с помощью О заявлении об ошибке. Оператор On Error сообщает VBA, что делать в случае возникновения ошибки. Есть три О сообщениях об ошибках:

  • При ошибке GoTo 0
  • При ошибке Возобновить Далее
  • При ошибке GoTo Линия

При ошибке GoTo 0

При ошибке GoTo 0 является настройкой VBA по умолчанию. Вы можете восстановить этот параметр по умолчанию, добавив следующую строку кода:

Когда возникает ошибка с При ошибке GoTo 0, VBA прекратит выполнение кода и отобразит стандартное окно сообщения об ошибке.

Часто вы добавляете При ошибке GoTo 0 после добавления При ошибке Возобновить Далее обработка ошибок (следующий раздел):

123456789 Sub ErrorGoTo0 ()При ошибке Возобновить ДалееActiveSheet.Shapes («Start_Button»). УдалитьПри ошибке GoTo 0’Запустить больше кодаКонец подписки

При ошибке Возобновить Далее

При ошибке Возобновить Далее сообщает VBA пропустить любые строки кода, содержащие ошибки, и перейти к следующей строке.

1 При ошибке Возобновить Далее

Примечание: При ошибке Возобновить Далее не исправляет ошибку и не устраняет ее иным образом. Он просто сообщает VBA действовать, как если бы строка кода, содержащая ошибку, не существовала. Неправильное использование При ошибке Возобновить Далее может привести к непредвиденным последствиям.

Прекрасное время для использования При ошибке Возобновить Далее при работе с объектами, которые могут существовать, а могут и не существовать. Например, вы хотите написать код, который удалит фигуру, но если вы запустите код, когда фигура уже удалена, VBA выдаст ошибку. Вместо этого вы можете использовать При ошибке Возобновить Далее чтобы сообщить VBA об удалении формы, если она существует.

123 При ошибке Возобновить ДалееActiveSheet.Shapes («Start_Button»). УдалитьПри ошибке GoTo 0

Обратите внимание, что мы добавили При ошибке GoTo 0 после строки кода, содержащей потенциальную ошибку. Это сбрасывает обработку ошибок.

В следующем разделе мы покажем вам, как проверить, возникла ли ошибка, используя Err.Number, предоставляя вам более расширенные возможности обработки ошибок…

Err.Number, Err.Clear и перехват ошибок

Вместо того, чтобы просто пропустить строку, содержащую ошибку, мы можем отловить ошибку, используя При ошибке Возобновить Далее а также Err.Number.

Err.Number возвращает номер ошибки, соответствующий типу обнаруженной ошибки. Если ошибки нет, Err.Number = 0.

Например, эта процедура вернет «11», потому что возникает ошибка Ошибка времени выполнения ’11’.

1234567 Sub ErrorNumber_ex ()При ошибке Возобновить ДалееActiveCell.Value = 2/0MsgBox Err.NumberКонец подписки

Обработка ошибок с помощью Err.Number

Истинная сила Err.Number заключается в способности определить, произошла ли ошибка (Err.Number 0). В приведенном ниже примере мы создали функцию, которая будет проверять, существует ли лист, с помощью Err.Number.

12345678910111213141516171819 Sub TestWS ()MsgBox DoesWSExist («тест»)Конец подпискиФункция DoesWSExist (wsName As String) As BooleanDim ws как рабочий листПри ошибке Возобновить ДалееУстановить ws = Sheets (wsName)’Если ошибка WS не существуетЕсли Err.Number 0, тоDoesWSExist = FalseЕщеDoesWSExist = TrueКонец, еслиПри ошибке GoTo -1Конечная функция

Примечание. Мы добавили При ошибке GoTo -1 до конца, который сбрасывает Err.Number в 0 (см. два раздела ниже).

С участием При ошибке Возобновить Далее а также Err.Number, вы можете воспроизвести «Попробуй поймать» функциональность других языков программирования.

При ошибке GoTo Линия

При ошибке GoTo Линия сообщает VBA «перейти» к помеченной строке кода при обнаружении ошибки. Вы объявляете оператор Go To следующим образом (где errHandler — это метка строки, к которой нужно перейти):

1 При ошибке GoTo errHandler

и создайте метку строки следующим образом:

Примечание. Это тот же ярлык, который вы использовали бы с обычным заявлением VBA GoTo.

Ниже мы продемонстрируем использование При ошибке GoTo Линия Выйти из процедуры.

При ошибке Выход из подпрограммы

Вы можете использовать On Error GoTo Line для выхода из подпрограммы при возникновении ошибки.

Вы можете сделать это, поместив метку строки обработчика ошибок в конце вашей процедуры:

12345678 Sub ErrGoToEnd ()При ошибке GoTo endProc’Некоторый кодendProc:Конец подписки

или используя команду Exit Sub:

123456789101112131415 Sub ErrGoToEnd ()При ошибке GoTo endProc’Некоторый кодПерейти Пропустить ВыходendProc:Выйти из подводной лодкиskipExit:Еще немного кодаКонец подписки

Err.Clear, при ошибке GoTo -1 и сброс Err.Number

После обработки ошибки обычно следует удалить ее, чтобы предотвратить проблемы с обработкой ошибок в будущем.

После возникновения ошибки, оба Err.Clear а также При ошибке GoTo -1 можно использовать для сброса Err.Number до 0. Но есть одно очень важное отличие: Err.Clear не сбрасывает саму ошибку, а только сбрасывает Err.Number.

Что это обозначает? С использованиемErr.Clear, вы не сможете изменить настройку обработки ошибок. Чтобы увидеть разницу, проверьте этот код и замените При ошибке GoTo -1 с участием Err.Clear:

123456789101112131415161718192021 Sub ErrExamples ()При ошибке GoTo errHandler:»Ошибка, определяемая приложением»Ошибка (13)Выйти из подводной лодкиerrHandler:’Очистить ошибкуПри ошибке GoTo -1При ошибке GoTo errHandler2:Ошибка «Несоответствие типа»Ошибка (1034)Выйти из подводной лодкиerrHandler2:Отладка.Ошибка печати ОписаниеКонец подписки

Обычно я рекомендую всегда использовать При ошибке GoTo -1, если у вас нет веской причины использовать Err.Clear вместо.

VBA при ошибке MsgBox

Вы также можете отобразить окно сообщения при ошибке. В этом примере будут отображаться разные окна сообщений в зависимости от того, где возникла ошибка:

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx ()Dim errMsg как строкаПри ошибке GoTo errHandler’Этап 1errMsg = «Произошла ошибка на этапе копирования и вставки.»‘Err.Raise (11)’Этап 2errMsg = «Произошла ошибка на этапе проверки данных.»Err.Raise (11)’Этап 3errMsg = «Произошла ошибка на этапе построения прибылей и убытков и копирования.»Err.Raise (11)’Этап 4errMsg = «Произошла ошибка при попытке зарегистрировать импорт на странице настройки»Err.Raise (11)GoTo endProcerrHandler:MsgBox errMsgendProc:Конец подписки

Здесь вы должны заменить Err.Raise (11) своим реальным кодом.

VBA IsError

Другой способ обработки ошибок — проверить их с помощью функции VBA IsError. Функция IsError проверяет выражение на наличие ошибок, возвращая ИСТИНА или ЛОЖЬ в случае возникновения ошибки.

123 Sub IsErrorEx ()MsgBox IsError (Диапазон («a7»). Значение)Конец подписки

Если ошибка VBA

Вы также можете обрабатывать ошибки в VBA с помощью функции Excel IfError. Доступ к функции IfError должен осуществляться с помощью Класс WorksheetFunction:

1234567 Sub IfErrorEx ()Dim n As Longn = WorksheetFunction.IfError (Range («a10»). Value, 0)MsgBox nКонец подписки

Это выведет значение диапазона A10, если значение является ошибкой, вместо этого будет выведено 0.

Типы ошибок VBA

Ошибки времени выполнения

Как указано выше:

Ошибки времени выполнения VBA — это ошибки, возникающие во время выполнения кода. Примеры ошибок времени выполнения включают:

  • Ссылка на несуществующую книгу, лист или другой объект
  • Неверные данные напр. ссылка на ячейку Excel, содержащую ошибку
  • Попытка разделить на ноль

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

Ошибки синтаксиса

Ошибки синтаксиса VBA это ошибки при написании кода. Примеры синтаксических ошибок:

  • Неправильное написание
  • Отсутствие или неправильная пунктуация

Редактор VBA выделяет множество синтаксических ошибок красным цветом:

В редакторе VBA также есть опция «Автоматическая проверка синтаксиса»:

Когда этот флажок установлен, редактор VBA сгенерирует окно сообщения, предупреждающее вас об ошибках синтаксиса после ввода строки кода:

Лично меня это очень раздражает, и я отключил эту функцию.

Ошибки компиляции

Прежде чем пытаться запустить процедуру, VBA «скомпилирует» процедуру. Компиляция преобразует программу из исходного кода (который вы видите) в исполняемую форму (вы не видите).

Ошибки компиляции VBA — это ошибки, препятствующие компиляции кода.

Хорошим примером ошибки компиляции является отсутствие объявления переменной:

Другие примеры включают:

  • Для без Следующий
  • Выбирать без Конец Выбрать
  • Если без Конец, если
  • Вызов процедура этого не существует

Ошибки синтаксиса (предыдущий раздел) — это подмножество ошибок компиляции.

Отладка> Компиляция

Ошибки компиляции появятся при попытке запустить процедуру. Но в идеале вы должны выявить ошибки компиляции до попытки запустить процедуру.

Сделать это можно, скомпилировав проект заранее. Для этого перейдите в Отладка> Скомпилировать проект VBA.

Компилятор «перейдет» к первой ошибке. Как только вы исправите эту ошибку, снова скомпилируйте проект. Повторяйте, пока все ошибки не будут исправлены.

Вы можете сказать, что все ошибки исправлены, потому что Скомпилировать проект VBA будет неактивным:

Ошибка переполнения

В Ошибка переполнения VBA происходит, когда вы пытаетесь поместить значение в слишком большую переменную. Например, Целочисленные переменные может содержать только значения от -32 768 до 32 768. Если вы введете большее значение, вы получите ошибку переполнения:

Вместо этого вы должны использовать Длинная переменная для хранения большего числа.

Другие термины ошибок VBA

Ошибка перехвата VBA

В отличие от других языков программирования, в VBA нет Заявление о вылове. Однако вы можете воспроизвести оператор Catch, используя При ошибке Возобновить Далее а также Если Err.Number 0, то. Это описано выше в разделе Обработка ошибок с помощью Err.Number.

Ошибка игнорирования VBA

Чтобы игнорировать ошибки в VBA, просто используйте При ошибке Возобновить Далее утверждение:

1 При ошибке Возобновить Далее

Однако, как упоминалось выше, вы должны быть осторожны при использовании этого оператора, поскольку он не исправляет ошибку, он просто игнорирует строку кода, содержащую ошибку.

VBA Throw Error / Err.Raise

Чтобы устранить ошибку в VBA, вы используете Err.Raise метод.

Эта строка кода вызовет ошибку времени выполнения ’13’: Несоответствие типов:

Перехват ошибок VBA

Перехват ошибок VBA это просто еще один термин для обработки ошибок VBA.

Сообщение об ошибке VBA

А Сообщение об ошибке VBA выглядит так:

Когда вы нажмете «Отладка», вы увидите строку кода, которая выдает ошибку:

Обработка ошибок VBA в цикле

Лучший способ обработки ошибок в цикле — использовать При ошибке Возобновить Далее вместе с Err.Number чтобы определить, произошла ли ошибка (не забудьте использовать Err.Clear чтобы сбрасывать ошибку после каждого появления).

Пример ниже разделит два числа (столбец A на столбец B) и выведет результат в столбец C. В случае ошибки результатом будет 0.

12345678910111213141516 Подтест ()Тусклая ячейка как диапазонПри ошибке Возобновить ДалееДля каждой ячейки в диапазоне («a1: a10»)’Установить значение ячейкиcell.Offset (0, 2) .Value = cell.Value / cell.Offset (0, 1) .Value’Если Cell.Value — Error, то по умолчанию 0Если Err.Number 0, тоcell.Offset (0, 2) .Value = 0Err.ClearКонец, еслиСледующийКонец подписки

Обработка ошибок VBA в Access

Все приведенные выше примеры работают в Access VBA точно так же, как и в Excel VBA.

123456789101112131415161718 Функция DelRecord (от формы как)’эта функция используется для удаления записи в таблице из формыПри ошибке GoTo заканчиваетсяС frmЕсли .NewRecord Тогда.ОтменитьФункция выходаКонец, еслиКонец сС помощью frm.RecordsetClone.Bookmark = frm.Bookmark.Удалитьfrm.RequeryКонец сФункция выходаокончание:КонецКонечная функция

Понравилась статья? Поделить с друзьями:
  • При ошибке 404 используется кастомный шаблон
  • При оформлении листка нетрудоспособности ошибки и опечатки тест
  • При оформлении листка временной нетрудоспособности ошибки и опечатки
  • При оформлении загранпаспорта через госуслуги выдает ошибку
  • При отправке формы произошла ошибка пфр сзв тд