Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

Универсальны обработчик ошибок для VBA

06.06.2014, 19:27

Глобальный обработчик ошибок. Если отключить обработчик ошибок в одной из процедур, будет ли он работать в других?
Есть какой то код Sub main On error goto ErrorLine ‘тут какой-то код call fng_1 ‘тут.

Как в VBA-коде установить обработчик события для подчинённой формы?
Привет, друзья! Конкретно меня интересует событие BeforeUpdate для подчинённой формы (Subform).

Обработчик ошибок для всего проекта
Как создать обработчик ошибок для всего проекта? Ну, то есть, можно создать спецальную форму.

Обработчик ошибок
Обрабатывает ли оператор on error ошибки типа compile error (к примеру syntax error) или только.

06.06.2014, 20:082

Решение

06.06.2014, 20:20 [ТС]306.06.2014, 20:384

На любую строку можно вернуться так:

Visual Basic
06.06.2014, 20:53 [ТС]5

Только метки? Что-нибудь типа next -1 нету?

Добавлено через 4 минуты
Может определить строку, в которой ошибка, а потом вернуться к (номер строки с ошибкой -1)?

06.06.2014, 22:176

ставиш метку, перед сомнительной строчкой
но при этом в процедуре долна быть объявленна инструкция
On Error GoTo метка

или так
on error resume next
x=x/0
if err then

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

Добавлено через 6 минут
вот пример, ошибка-метка

Visual Basic
07.06.2014, 17:577

На самом деле в VB поддерживается возможность, о которой мало кто знает: строки можно нумеровать целыми числами. И есть неописанная функция Erl, которая в обработчике ошибок возвращает номер ошибочной строки:

— обычно это бессмысленно.

Visual Basic
07.06.2014, 19:17 [ТС]8
07.06.2014, 20:259
08.06.2014, 08:53 [ТС]10
Visual Basic
08.06.2014, 09:0111

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

и begin, но оно будет игнориться .. ну это твоё конечно дело

08.06.2014, 15:4112

Решение

Vol4_OK, делай вот так:

Visual Basic
08.06.2014, 15:41
08.06.2014, 15:41

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

Обработчик ошибок
Всем привет! Наверняка же кто-то уже писал универсальный обработчик ошибок? Типа: . invoke.

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

Обработчик ошибок
error_reporting(E_ALL); // функция обработки ошибок function myErrorHandler($errno, $errstr.

Обработчик ошибок
Привет, а где можно ли както задать обработчик ошибок? Например у нас есть подключение к бд.

11. Типы ошибок в программах. Перехват ошибок времени выполнения

Лабораторная работа 11.1 Перехват ошибок времени выполнения

Обработка ошибок в макросах VBA в Excel, ошибки времени выполнения (run-time errors)

Подготовка:

1. Создайте новый файл Excel и сохраните его как C:ErrorHandling. xls .

2. В ячейку A1 этого файла введите значение «Результат деления:».

3. Щелкните правой кнопкой мыши по любой панели инструментов или меню и в открывшемся списке доступных панелей инструментов выберите Элементы управления.

4. На панели инструментов Элементы управления нажмите кнопку Режим конструктора (верхняя левая кнопка) и в этом режиме поместите на лист Excel новую кнопку. Для этого нужно щелкнуть по объекту Кнопка на панели инструментов Элементы управления и на листе определить местонахождение и размеры этой кнопки.

5. Щелкните по созданной вами кнопке правой кнопкой мыши и в контекстном меню выберите Свойства. Определите для нее свойства по вашему усмотрению.

6. В режиме конструктора щелкните по кнопке правой кнопкой мыши и в контекстном меню выберите Исходный текст. Откроется редактор кода Visual Basic с созданной процедурой для события Click данной кнопки. Поместите в него следующий код :

Private Sub CommandButton1_Click()

Dim nNum1 As Integer

Dim nNum2 As Integer

Dim nResult As Integer

nNum 1 = InputBox («Введите первое число»)

nNum 2 = InputBox («Введите второе число»)

nResult = nNum1 / nNum2

7. Вернитесь на ваш лист Excel , выйдите из режима конструктора (щелкнув по кнопке Выход из режима конструктора на панели инструментов Элементы управления) и нажмите на созданную вами на листе кнопку. Убедитесь, что если вводить допустимые значения для делимого и делителя, то код работает правильно и выводит результат деления в ячейку B2.

Задание:

Измените эту программу таким образом, чтобы обеспечить защиту от ввода пользователем недопустимых значений (например, строковых значений делимого и делителя или значения делителя, равного 0).

Не обязательно оставлять код по приему значений от пользователя и выполнению деления в обработчике события Click вашей кнопки. Этот код при желании можно перенести во внешние процедуры или функции.

Решение:

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

Так, например, может выглядеть решение с обработкой кода ошибки и повторным вызовом функцией самой себя:

Private Sub CommandButton1_Click()

Public Sub subPrepare()

Dim nReturnCode As Integer

Dim nAnswer As Integer

Select Case nReturnCode

MsgBox («Делить на ноль нельзя!»)

nAnswer = MsgBox(«Повторить?», vbYesNo)

If nAnswer = vbYes Then

MsgBox (» Нужно число !»)

nAnswer = MsgBox(«Повторить?», vbYesNo)

If nAnswer = vbYes Then

MsgBox (» Неизвестная ошибка «)

nAnswer = MsgBox(«Повторить?», vbYesNo)

If nAnswer = vbYes Then

On Error Resume Next

Dim nNum1 As Integer

Dim nNum2 As Integer

Dim nResult As Integer

nNum1 = InputBox(» Введите первое число «)

nNum 2 = InputBox («Введите второе число»)

nResult = CInt(nNum1) / CInt(nNum2)

Select Case Err.Number

А вот решение с обработкой кода ошибки и циклом:

Private Sub CommandButton1_Click()

Dim nNum1 As Variant

Dim nNum2 As Variant

Dim nResult As Integer

Dim nError As Integer

nNum1 = InputBox(» Введите первое число :»)

On Error Resume Next

If Err.Number = 13 Then

MsgBox (» Нужно число «)

On Error GoTo 0

Loop While (nNum1 = «»)

nNum2 = InputBox(» Введите второе число :»)

On Error Resume Next

If Err.Number = 13 Then

MsgBox (» Нужно число «)

ElseIf nNum 2 = 0 Then

MsgBox («Делить на ноль нельзя!»)

On Error GoTo 0

Loop While (nNum2 = «»)

nResult = nNum1 / nNum2

Еще один вариант решения вообще не допускает возникновения ошибок:

Private Sub CommandButton1_Click()

Dim nNum1 As Variant

Dim nNum2 As Variant

Dim nResult As Integer

nNum 1 = InputBox («Введите первое число:»)

If IsNumeric(nNum1 & «») Then Exit Do

MsgBox «Нужно число»

nNum 2 = InputBox («Введите второе число:»)

Правильная обработка ошибок в VBA (Excel)

Я работаю с VBA уже довольно давно, но я все еще не уверен в обработке ошибок.

хорошая статья одна из CPearson.com

однако мне все еще интересно, был ли способ, которым я раньше делал ошибки, / совершенно неправильным: блок 1

предложение if, потому что если это правда, оно будет выполнено, и если это не удастся, Goto перейдет в Else-part, так как Ubound массива никогда не должно быть нуля или меньше, без ошибки, этот метод работал довольно хорошо до сих пор.

если я правильно понял, это должно быть так: Блок 2

или даже такой: Блок 3

наиболее распространенным способом, который я вижу, является то, что ошибка «Catcher» находится в конце суб, и суб фактически заканчивается до «выхода суб», но, однако, это не немного запутанно, если суб довольно большой, если вы прыгаете вице наоборот, чтобы прочитать код?

блок 4

Должно ли это быть как в блоке 3 ?

Спасибо, что прочитали мой вопрос Приветствия skofgar

5 ответов

Я определенно не буду использовать Block1. Кажется неправильным, что блок ошибок в операторе IF не связан с ошибками.

блоки 2,3 & 4, я думаю, вариации на тему. Я предпочитаю использовать блоки 3 & 4 над 2 только из-за нелюбви к оператору GOTO; я обычно использую метод Block4. Это один из примеров кода, который я использую, чтобы проверить, добавлена ли библиотека Microsoft ActiveX Data Objects 2.8 и если не добавить или использовать более раннюю версию, если 2.8 не доступный.

у вас есть один действительно замечательный ответ от ray023, но ваш комментарий, что это, вероятно, перебор, подходит. Для «более светлой» версии.

блок 1 это, ИМХО, плохая практика. Как уже указывалось osknows, смешивание обработки ошибок с кодом нормального пути не является хорошим. Во-первых, если a новая ошибка возникает, когда есть условие ошибки в действительности вы будете не получите возможность справиться с этим (если вы звоните из обычной это также имеет обработчик ошибок, где выполнение будет «пузыриться»).

Блок 2 похоже на имитацию блока Try / Catch. Это должно быть хорошо, но это не путь VBA. Блок 3 является вариацией на блоке 2.

блок 4 — это голая версия пути VBA. Я бы сильно посоветуйте использовать его или что-то в этом роде, потому что это то, что ожидает любой другой программист VBA, наследующий код. Позвольте представить небольшое расширение, однако:

обратите внимание, что второй Resume . Это трюк, которому я научился недавно: это будет никогда выполнить в обычной обработке, так как Resume оператор отправит выполнение в другое место. Однако это может быть находкой для отладки. При получении уведомления об ошибке выберите отладка (или нажмите Ctl-Break, затем выберите отладка при получении сообщения «выполнение было прервано»). Следующий (выделенный) оператор будет либо MsgBox или следующий оператор. Используйте «Set Next Statement» (Ctl-F9), чтобы выделить голый Resume , нажмите клавишу F8. Это покажет вам ровно где произошла ошибка.

Что касается вашего возражения против этого формата «прыжки вокруг», а) это то, что программисты VBA ожидают, как указано ранее, & B) ваши подпрограммы должны быть достаточно коротким, чтобы не далеко прыгать.

две основные цели для обработки ошибок:

  1. ошибки ловушки вы можете прогнозировать, но не управлять пользователем от выполнения (например, сохранение файла в thumb drive когда thumb диски был удален)
  2. непредвиденные ошибки, пользователя с формой это сообщает им, в чем проблема есть. Таким образом, они могут передать это сообщение для вас, и вы, возможно, сможете чтобы дать им работу, пока вы работайте над исправлением.

Итак, как бы вы сделали это?

прежде всего, создайте форму ошибки для отображения при возникновении непредвиденной ошибки.

это может выглядеть примерно так (FYI: мой называется frmErrors):

обратите внимание на следующие надписи:

  • lblHeadline
  • lblSource
  • lblProblem
  • lblResponse

кроме того, стандартная команда кнопки:

нет ничего впечатляющего в коде для этой формы:

в основном, вы хотите знать, какую кнопку пользователь нажал, когда форма закрывается.

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

у вас могут быть ошибки, которые будут настроены только для вашего приложения. Это, как правило, будет краткий список ошибок специально только для вашего приложения. Если у вас еще нет модуля констант, создайте модуль, который будет содержать перечисление пользовательских ошибок. (Примечание: Office ‘ 97 не поддерживает перечисления.). Перечисление должно выглядеть примерно так:

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

теперь вы хорошо оснащены, чтобы ловить ошибки в вашей программе. Вы sub (или функция), должны выглядеть примерно так:

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

кстати, если вам когда-нибудь понадобится, чтобы я сделал логотип вашей компании, посмотрите на меня http://www.MySuperCrappyLogoLabels99.com

Я держу вещи простыми:
На уровне модуля я определяю две переменные и устанавливаю одну в имя самого модуля.

в каждой под / функции модуля я определяю локальную переменную

Я установил ThisRoutineName в имя sub или функции

затем я отправляю все ошибки в ERR_RTN: когда они происходят, но сначала я устанавливаю sLocalErrorMsg, чтобы определить, что такое ошибка, и обеспечить некоторую отладку информация.

в нижней части каждой под / функции я направляю логический поток следующим образом

затем у меня есть отдельный модуль, который я помещаю во все проекты под названием «mod_Error_Handler».

конечный результат-всплывающее сообщение об ошибке, сообщающее мне, в каком модуле, какой soubroutine и какое сообщение об ошибке конкретно было. Кроме того, он также вставит сообщение об ошибке Windows и код.

Блок 2 не работает, потому что он не сбрасывает обработчик ошибок, потенциально вызывая бесконечный цикл. Для правильной работы обработки ошибок в VBA вам нужно Resume инструкция для очистки обработчика ошибок. The Resume также активирует предыдущий обработчик ошибок. Блок 2 терпит неудачу, потому что новая ошибка возвращается к предыдущему обработчику ошибок, вызывая бесконечный цикл.

Блок 3 терпит неудачу, потому что нет Resume оператор, поэтому любая попытка обработки ошибок после этого будет неудача.

каждый обработчик ошибок должен быть завершен выходом из процедуры или Resume заявление. Маршрутизация обычного выполнения вокруг обработчика ошибок сбивает с толку. Вот почему обработчики ошибок обычно находятся внизу.

но вот еще один способ обработки ошибки в VBA. Он обрабатывает ошибку inline как Try/Catch in VB.net есть несколько подводных камней, но правильно управляемый он работает довольно мило.

ключ к этой работе-использовать Resume заявление сразу за другим On Error заявление. The Resume это в обработчике ошибок и отвлекает код EndTry1 метки. Вы должны немедленно установить другой On Error оператор, чтобы избежать проблем, как предыдущий обработчик ошибок будет «возобновить». То есть он будет активен и готов к обработке очередной ошибки. Это может привести к повторению ошибки и вводу бесконечного цикла.

чтобы избежать использования предыдущего обработчика ошибок снова, вам нужно установить On Error для нового обработчика ошибок или просто используйте On Error Goto 0 отменить всю обработку ошибок.

Читать еще:  Ошибка msi 1406
Ссылка на основную публикацию
Adblock
detector