Foreversoft.ru

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

Vba обработка ошибок

Типы ошибок в VBA

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

Далее мы поговорим о каждом из трёх типов ошибок VBA подробно.

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

Компилятор VBA рассматривает ошибки компиляции как недопустимые и выделяет их в коде ещё до того, как дело дойдёт до запуска макроса.

Если при написании кода допущена синтаксическая ошибка, то редактор VBA сигнализирует об этом немедленно: либо при помощи окна с сообщением, либо выделяя ошибку красным цветом, в зависимости от статуса режима Auto Syntax Check.

Примечание: При включённом режиме Auto Syntax Check каждый раз, при появлении в редакторе Visual Basic во введённом коде синтаксической ошибки, будет показано соответствующее сообщение. Если же этот режим выключен, то редактор VBA продолжит сообщать о синтаксических ошибках, просто выделяя их красным цветом. Опцию Auto Syntax Check можно включить/выключить в меню Tools > Options редактора Visual Basic.

В некоторых случаях ошибка компиляции может быть обнаружена при выполнении компиляции кода, непосредственно перед тем, как макрос будет выполнен. Обычно ошибку компиляции несложно обнаружить и исправить, потому что компилятор VBA даёт информацию о характере и причине ошибки.

Например, сообщение “Compile error: Variable not defined” при попытке запустить выполнение кода VBA говорит о том, что происходит попытка использовать или обратиться к переменной, которая не была объявлена для текущей области (такая ошибка может возникнуть только если используется Option Explicit).

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

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

Примером такой ошибки может служить попытка выполнить деление на ноль. В результате будет показано сообщение “Run-time error ’11’: Division by zero“.

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

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

В случае если код сложнее, чем в нашем примере, то, чтобы получить больше информации о причине возникновения ошибки VBA, можно проверить значения используемых переменных. В редакторе VBA для этого достаточно навести указатель мыши на имя переменной, или можно открыть окно отслеживания локальных переменных (в меню редактора View > Locals Window).

Коды различных ошибок выполнения расшифрованы на сайте Microsoft Support (на английском). Наиболее часто встречающиеся ошибки VBA перечислены в этой таблице:

5Недопустимый вызов процедуры (Invalid procedure call)
7Недостаточно памяти (Out of memory)
9Индекс вне заданного диапазона (Subscript out of range)

Эта ошибка возникает при попытке обратиться к элементу массива за пределами заданного размера массива – например, если объявлен массив с индексами от 1 до 10, а мы пытаемся обратиться к элементу этого же массива с индексом 11.

11Деление на ноль (Division by zero)
13Несоответствие типа (Type mismatch)

Эта ошибка возникает при попытке присвоить переменной значение не соответствующего типа – например, объявлена переменная i типа Integer, и происходит попытка присвоить ей значение строкового типа.

53Файл не найден (File not found)

Иногда возникает при попытке открыть не существующий файл.

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

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

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

В этом коде производится попытка открыть файл Excel с именем Data. Если файл не найден, то пользователю будет предложено поместить этот файл в нужную папку. После того, как пользователь сделает это и нажмёт ОК, выполнение кода продолжится, и попытка открыть этот файл повторится. При желании вместо попытки открыть нужный файл, выполнение процедуры Sub может быть прервано в этом месте при помощи команды Exit Sub.

Логические ошибки

Логические ошибки (или баги) возникают в процессе выполнения кода VBA, но позволяют ему выполняться до самого завершения. Правда в результате могут выполняться не те действия, которые ожидалось, и может быть получен неверный результат. Такие ошибки обнаружить и исправить труднее всего, так как компилятор VBA их не распознаёт и не может указать на них так, как это происходит с ошибками компиляции и выполнения.

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

Редактор Excel VBA предоставляет набор инструментов отладки, которые помогут найти и исправить логические ошибки в коде VBA. В данной статье мы не будем рассматривать подробно эти инструменты. Любознательный пользователь может найти обзор инструментов отладки VBA на сайте Microsoft Help & Support (на английском).

Обработка ошибок Visual Basic

Подробнее о объектеErr Visual Basic

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

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

ErrorTrap:
‘программный код следует далее

Поскольку необходимо исключить возможность «вылета» из программы в процедуре обработки ошибок, неплохой идеей является использование оператора Exit в строке, непосредственно перед меткой фрагмента по перехвату ошибок.
Команда On Error GoTo может находиться в любом месте процедуры обработки события, функции или процедуры Sub. Обычно там же размещается и программный код для обработки ошибок. Единственным исключением является тот случаи, когда процедура вызывается в рамках другой процедуры. Тогда Visual Basic сначала проверяет наличие фрагмента по обработке ошибок сначала в текущей процедуре, а затем в «вышестоящей».
После того, как программист начинает пользоваться обработкой ошибок при помощи On Error GoTo, в его приложениях исчезают ошибки во время выполнения. (Но это не защищает от ошибок в операционной системе Windows) В любом случае команда On Error GoTo должна передавать управление на участок кода, который идентифицирует проблему и, возможно, решает ее.
Если ошибку можно исправить, то оператор Resume используется для возврата к месту в программе, где она случилась. Однако невозможно исправить ошибку, не зная о вызвавшей ее причине. Это можно сделать, используя функцию Err и объект Err. Он представляет собой целое значение, которое можно присваивать переменной. Например, если написать

то значением переменной ErrorNumber будет номер ошибки.
Visual Basic может идентифицировать более 80 ошибок во время выполнения. (Информацию об этом необходимо искать в электронной документации в разделе «trappable errors»). Ниже приведено два примера.

Код ошибкиОбъяснение
57Ошибка ввода вывода (например, попытка печати при выключеном принтере).
68Устройство недоступно (устройство не существует или недоступно в данный момент).

Способ использования данной информации очень прост. Предположим, процедура обработки события использует принтер. Где-нибудь внутри процедуры перед оператором печати необходимо разместить строку

On Error GoTo PrinterCheck

Теперь перед оператором End Sub необходимо добавить следующий код:

Exit sub
PrinterCheck:
ErrorNumber = Err. Number
Beep
Select Case ErrorNumber
Case 25
MsgBox «Your printer may be off-line.»
Case 27
MsgBox «Is there a printer available?» Case Else
M$ = «Please tell the operator (= program author?) that»
M$ = M$ & vbCrLf ‘= Chr$(10) + Chr$(13) New Line
M$ = M$ & «error number » & ErrorNumber & » occurred.»
MsgBox M$
End
End Select
М$ = «If the error has been corrected click on OK.»
M$ = M$ & vbCrLf
M$ = M$ & «Otherwise click on Cancel.»
Continue = MsgBox(M$, vbOKCancel)
If Continue = vbOK Then Resume Else End

Идея данного обработчика ошибок очень проста, а оператор Select Case подходит в данном случае идеально. В каждом отдельном случае программа проверяет тип ошибки и предлагает возможные рекомендации по ее исправлению. Если достигнут оператор Case Else, то на экране появляется номер ошибки. В любом случае после цикла по обработке ошибок пользователю предлагается возможность выбора при помощи информационной панели с двумя кнопками. Возможно, понадобится написать общую процедуру для анализа ошибок. Тогда фрагмент по обработке ошибок в процедуре будет передавать управление выше. После этого такую процедуру можно использовать для перехвата и обработки ошибок во многих различных проектах.
Перехват ошибок не является панацеей. Например, трудно что-либо сделать, если возникает сбой жесткого диска или в принтере отсутствует бумага.
Вариант команды Resume позволяет пропустить оператор, в котором возникла ошибка. Если использовать

Visual Basic начинает обрабатывать оператор, находящийся непосредственно после текущего. Можно даже использовать

On Error Resume Next

для автоматического пропуска любого программного кода, вызывающего ошибку. (Это приведено не случайно, хотя в данной главе не применяется.)
Кроме того, можно возобновить работу программы с любой строки кода, на которую указывает метка. Для этого используется следующий оператор:

Обычно в Visual Basic метки применяются только для обозначения фрагментов по обработке ошибок. Несмотря на это, для совместимости с предыдущими версиями BASIC введен оператор безусловного перехода GoTo, но нужда в нем возникает очень редко.
Команды Resume и Resume Next ведут себя по-разному при возврате назад в том случае, когда ошибка произошла в другой процедуре. Вспомним, что такое имеет место, когда одна процедура вызывается из другой и в ней отсутствует фрагмент по обработке ошибок: В обоих случаях Visual Basic не переходит к исходной процедуре. В случае оператора Resume происходит повторный вызов процедуры. В случае Resume Next Visual Basic начинает выполнять программу с первого (после вызова процедуры) оператора. То есть не происходит возврата к исходной процедуре.
Предположим, что цепочка взаимосвязанных процедур удлинилась: Процедура1 вызывает Процедуру2, а та, в свою очередь, ФункциюЗ. Допустим, что ошибка происходит в момент выполнения ФункцииЗ, но обработчик ошибок есть только у Процедуры1. Если в данном фрагменте присутствует оператор Resume, то Visual Basic переходит к оператору, вызывающему Процедуру2. Поскольку такой подход на самом деле очень громоздкий, то лучше всегда полагаться только на обработчики ошибок, находящиеся в текущей процедуре. Если одна процедура вызывает другую, то у нее необходимо отключить фрагмент по обработке ошибок.
Существует еще одна функция для обработки ошибок, Erl (Error Line). Если программист отчаялся найти строку, в которой возникает ошибка, a Visual Basic не останавливается на данной строке, нужно проделать следующее:

  • Добавить номера строк перед каждым оператором в процедуре.
  • Добавить оператор Debug.Print Eri в фрагмент по обработке ошибок.

При разработке программ часто необходимо протестировать функционирование обработчика ошибок. Visual Basic включает в себя оператор

Error (номер кода ошибки)

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

On Error GoTo 0

(хотя значение 0 в общем-то не очень и необходимо). Похожим образом можно изменить ссылку на другой обработчик ошибок, используя другой оператор On Error GoTo. Необходимо убедиться, что между обработчиками ошибок присутствует оператор Exit. Visual Basic использует последний оператор On Error GoTo для того, чтобы решить, куда двигаться далее.

Подробнее о объекте Err

Для того чтобы обеспечить более централизованную обработку ошибок, когда это необходимо, Visual Basic использует специальный объект Err, свойства которого можно анализировать после возникновения ошибки. Ранее мы видели, как работает свойство Number (Err.Number), выдающее номер ошибки.

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

После того как выполняется оператор Resume или On Error, все свойства объекта Err сбрасываются в 0 или сводятся к строке «». Свойства данного объекта инициализируются и после выхода из функции или процедуры. Кроме того, для этого можно использовать оператор

Примечание: Правильным является создание централизованного обработчика ошибок. Однако данной процедуре необходимо передавать текущее значение различных свойств объекта Err. Если вызвать объект Err из новой процедуры, все его значения будут инициализированы.

Если необходимо генерировать ошибку для тестовых целей, можно использовать метод Raise объекта Err. Его синтаксис следующий:

Совет: Можно использовать метод Raise для определения собственных типов ошибок.

Если необходимо вывести описание текущей ошибки, используется оператор

НОВОСТИ ФОРУМА
Рыцари теории эфира
01.10.2019 — 05:20: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]69vJGqDENq4[/Youtube][/center]
[center]14:36[/center]
Osievskii Global News
29 сент. Отправлено 05:20, 01.10.2019 г.’ target=_top>Просвещение от Вячеслава Осиевского — Карим_Хайдаров.
30.09.2019 — 12:51: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Ok]376309070[/Ok][/center]
[center]11:03[/center] Отправлено 12:51, 30.09.2019 г.’ target=_top>Просвещение от Дэйвида Дюка — Карим_Хайдаров.
30.09.2019 — 11:53: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]VVQv1EzDTtY[/Youtube][/center]
[center]10:43[/center]

интервью Раввина Борода https://cursorinfo.co.il/all-news/rav.
мой телеграмм https://t.me/peshekhonovandrei
мой твиттер https://twitter.com/Andrey54708595
мой инстаграм https://www.instagram.com/andreipeshekhonow/

[b]Мой комментарий:
Андрей спрашивает: Краснодарская синагога — это что, военный объект?
— Да, военный, потому что имеет разрешение от Росатома на манипуляции с радиоактивными веществами, а также иными веществами, опасными в отношении массового поражения. Именно это было выявлено группой краснодарцев во главе с Мариной Мелиховой.

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

Правильная обработка ошибок в 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 отменить всю обработку ошибок.

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 («Введите второе число:»)

Читать еще:  Код ошибки транспорта 0x80040217
Ссылка на основную публикацию
Adblock
detector