Программирование VBA. Федеральное агентство по образованию государственное образовательное учреждение высшего профессионального образования
Скачать 2.93 Mb.
|
If…Then. При этом все инструкции долж- ны находиться на одной строке и разделяться двоеточием, как показано в приведенном ниже примере: Sub IfThenElse () Dim a As Single Dim b As Single Dim c As Single a = Range("A1").Value b = Range("A2").Value If b = 0 Then MsgBox "Деление невозможно!" Else c = a / b: MsgBox "c=" & c End Sub Пример блоковой формы: Sub IfThenElse1 () Dim a As Single 88 Dim b As Single Dim c As Single a = Range("A1").Value b = Range("A2").Value If b=0 Then MsgBox "Деление на ноль невозможно!" Else c = a / b MsgBox "c=" & c End If End Sub Инструкция If…Then... Else применяется в следующих случаях: 1. Нужно проверить на соответствие одному или нескольким ус- ловиям и в случае соответствия сделать какое-то действие: Option Compare Text –––––––––––––––––––––––––––––––––––––––––––––––––– Sub IfThenElse2() Dim КурсРаб As String If Range("a5").Value = "Неуд" Or Range("a5").Value = "" Then MsgBox "Небходимо защитить курсовую работу " End If End Sub 2. Нужно проверить на соответствие одному или нескольким ус- ловиям и в случае соответствия сделать какое-то действие, а в случае несоответствия выполнить другое действие: Sub IfThenElse3() Dim КурсРаб As String If Range("a5").Value = "Неуд" Or Range("a5").Value = "" Then MsgBox "Необходимо защитить курсовую работу" Else MsgBox "К экзамену по информатике допущен" End If End Sub Примечание На уровне стандартного модуля, в котором находится процедура IfThenElse2, помещена инструкция Option Compare Text. Инструкция Option Compare применяется на уровне модуля перед первой процедурой модуля для задания используемого по умолчанию способа сравнения строковых данных. Формат инструкции: Option Compare Binary | Text | Database Инструкция Option Compare указывает способ сравнения строк Bi- nary, Text или Database для модуля. Если модуль не содержит инструк- 89 цию Option Compare, то по умолчанию используется способ сравнения Binary. Инструкция Option Compare Binary задает сравнение строк на ос- нове порядка сортировки, определяемого внутренним двоичным пред- ставлением символов. В Microsoft Windows порядок сортировки опреде- ляется кодовой страницей символов. В следующем примере представлен типичный результат двоичного порядка сортировки: A < B < E < Z < a < b < e < z < Б < Л < Ш < б < л < ш Инструкция Option Compare Text задает сравнение строк без учета регистра символов на основе системной национальной настройки. Тем же символам, что и выше, при сортировке с инструкцией Option Compare Text соответствует следующий порядок: (A=a) < (B=b) < (E=e) < (Z=z) < (Б=б) < (Л=л) < (Ш=ш) Инструкция Option Compare Database может использоваться только в Microsoft Access. Пример В данном примере инструкция Option Compare используется для за- дания метода сравнения строковых данных, используемого по умолчанию. Option compare Binary ' т.е. "AAA" < "aaa" ' Устанавливает метод сравнения строковых данных Binary. Option compare Text ' т. е. "AAA" = "aaa". ' Устанавливает метод сравнения строковых данных Text. Для Option Compare Text буквы верхнего регистра эквивалентны буквам нижнего регистра, например, тексты Отлично и отлично не различаются. Option Compare Database можно использовать только в MS Access. 3. В случае, если первая проверка вернула False, нужно прове- рить на соответствие еще нескольким условиям (в этом случае удобно использовать ElseIf). Sub IfThenElse4() If Range("a6").Value >= 0.84 Then MsgBox "Ваша оценка """ & "Отлично" & """" ElseIf Range("A6") < 0.84 And Range("A6") >= 0.67 Then MsgBox " Ваша оценка """ & "Хорошо" & """" ElseIf Range("A6") < 0.67 And Range("A6") > 0.5 Then MsgBox " Ваша оценка """ & "Удовлетворительно" & """" Else MsgBox " Ваша оценка """ & "Неудовлетворительно" & """" End If End Sub Некоторые замечания по использованию If…Then... Else: ключевое слово Then должно находиться в одной строке с If и ус- ловием. Если вы перенесете его на следующую строку, будет вы- дано сообщение об ошибке; если разместить команду, которую нужно выполнить при истинно- сти проверяемого условия на одной строке с If и Then, то End If можно не писать: 90 если используется несколько команд или конструкции Else|ElseIf, то End If в конце нужно писать обязательно, иначе возникнет син- таксическая ошибка. для выражения If…Then рекомендуется использовать отступы для выделения блоков команд, иначе трудно будет читать код. операторы If…Then можно вкладывать друг в друга: If R = 5 Then MsgBox “Отлично” If R = 4 Then MsgBox “Хорошо” End If End If 2.12.4.2. Инструкция Select…Case Инструкция If…Then... Else может содержать большое количество выражений ElseIf и поэтому бывает трудной для проектирования и вос- приятия. В подобных случаях альтернативой этой инструкции может быть инструкция Select Case, которая легче для восприятия и лучше приспо- соблена для работы в ситуациях со многими выходами. Инструкция Select Case выполняет одну из нескольких групп инструкций в зависимости от значения некоторого выражения. Она имеет следующий формат: Select Case выражение [Case список_выражений-n [инструкции-n]] ... [Case Else [инструкции_еlsе]] End Select Формат инструкции Select Case содержит следующие элементы: Элемент инструкции Описание элемента Выражение Обязательный. Любое числовое или строковое выражение Список_выражений-n Обязателен в случае использования Case. Список (сраздели- телями) из одной или более следующих форм: выражение выражение To выражение Is оператор_сравнения выражение Ключевое слово To определяет диапазон значений, в котором меньшее значение должно быть перед ключевым словом To. Ключевое слово Is следует использовать с операторами сравнения для указания диапазона значений. Если этот аргу- мент не используется, автоматически подставляется ключе- вое слово Is. Инструкции-n Необязательный. Одна или более инструкций, выполняемых, если выражение совпадает с любым значением из Спи- сок_выражений-n. Инструкции_еlsе Необязательный. Одна или более инструкций, выполняемых, если Выражение не совпадает ни с каким Case - предложением список_выражений-n 91 Если выражение совпадает с любым из Case-выражений спи- сок_выражений-n , выполняются инструкции инструкции-n, следующие за этим Case-предложением (до следующего Case-предложения или по- следнего Case-предложения – до End Select). Управление выполнением программы передаётся инструкции, следующей за предложением End Select. Если выражение совпадает с список_выражений-n в нескольких Case-предложениях, выполняются инструкции, соответствующие перво- му совпадению. Предложение Case Else используется для указания группы инструкций инструкции_еlsе, которые следует выполнять, если ни в одном Case-предложении не нашлось совпадений. Конструкция Select Case допускает вложения. Инструкцию Case Else целесообразно использовать при выборе между тремя и более вариантами. Приведённая ниже процедура CaseSelect позволяет решить ту же задачу, которую решает процедура IfThenElse4. Sub CaseSelect() Select Case Range ("A6") Case Is >= 0.84 MsgBox "Ваша оценка """ & "Отлично" & """" Case 0.68 To 0.83 MsgBox " Ваша оценка """ & "Хорошо" & """" Case Is > 0.5 MsgBox " Ваша оценка """ & "Удовлетворительно" & """" Case Else MsgBox " Ваша оценка """ & "Неудовлетворительно" & """" End Select End Sub 2.12.4.3. Инструкция безусловного перехода GoTo Инструкция GoTo изменяет ход выполнения программы без провер- ки каких-либо условий, передавая управление на метку в коде. Формат ин- струкции GoTo: GoTo метка Обязательный аргумент метка может быть текстовым или числовым, при- чём текстовая метка должна обязательно начинаться с буквенного сим- вола. Метка заканчивается символом двоеточие (:). В приведённой ниже процедуре БезУслПереход на экран выводится число 10, если значение r = 1 и строка m20, в противном случае. Sub БезУслПереход () Dim r r = InputBox("Иллюстрация инструкции безусловного перехода") If r = 1 Then GoTo 10 Else GoTo m20 10: MsgBox 10 92 Exit Sub m20: MsgBox "m20" End Sub Использование GoTo удобно в очень редких случаях, например, ко- гда нам нужно добиваться от пользователя ввода правильного значения неизвестное число раз. Однако использование GoTo считается признаком плохого тона и категорически не рекомендуется, потому что код становит- ся трудночитаемым. Инструкцию GoTo можно заменить инструкцией орга- низации циклов, используя инструкцию If или Select Case, как это сделано в приведённой ниже процедуре УслОператор, реализующий тот же алго- ритм, что и процедура БезУслПереход: Sub УслОператор() Dim r r = InputBox("Иллюстрация инструкции условного перехода") If r = 1 Then MsgBox 10 Else MsgBox "m20" End Sub 2.12.4.4. Инструкции перехода к обработчику ошибок On Error Инструкция On Error делает доступным обработчик ошибок и опре- деляет его положение внутри процедуры и используется также для запре- та обработки ошибок. Она имеет следующий формат: On Error GoTo строка On Error Resume Next On Error GoTo 0 Инструкция On Error имеетследующие формы: On Error GoTo стро- ка Делает доступным обработчик ошибок, который начинается со строки, определённой аргументом строка. Этот аргумент может быть числом или буквенно-числовым. При возникно- вении ошибки управление выполнением программы переда- ётся на строку кода с меткой строка. Таким образом проис- ходит активизация обработчика ошибок. Метка строка долж- на находиться в той же процедуре, что и инструкция On Error. On Error Resume Next Указывает на то, что при возникновении ошибки управление выполнением программы передаётся на инструкцию, сле- дующую непосредственно за тем, в котором произошла ошибка. Эта инструкция позволяет продолжить выполнение программы, несмотря на возникновение ошибки времени вы- полнения (run-time). On Error Goto 0 Отключает пользовательский обработчик ошибок в данной процедуре. Эта инструкция не указывает метку 0 в качестве начала обработчика ошибки, даже если в процедуре дейст- вительно имеется такая метка. Пользовательские обработчики ошибок позволяют реагировать на ошибки во время работы пользователя, например, когда вместо числа пользователь вводит текстовое данное или вообще не вводит данное. 93 В приведённой ниже процедуре ПримерOnErrorGoto возникает ошиб- ка ввода до тех пор, пока не будет введено число, управление передаётся на метку Ошибка, и инструкция Resume возвращает управление инструк- ции Num = InputBox("Введите число"). Sub ПримерOnErrorGoto() Dim Num As Single On Error GoTo Ошибка Num = InputBox("Введите число") MsgBox "Введено число " & Num Exit Sub Ошибка: MsgBox "Число не введено " Resume End Sub В процедуре ПримерOnErrorResumeNext при возникновении ошибки ввода управление передаётся инструкции If,и на экран выводится сооб- щение "Число не введено". Sub ПримерOnErrorResumeNext() Dim Num As Single On Error Resume Next Num = InputBox("Введите число,не равное 0") If Num <> 0 Then MsgBox "Введено число " & Num Else MsgBox "Число не введено" End If On Error GoTo 0 End Sub В приведённой ниже процедуре ПримерOnErrorGoto_0 инструкция On Error GoTo 0 отключает пользовательский обработчик ошибок в данной процедуре и может быть использована для восстановления нормальной обработки ошибок перед выходом из процедуры. Sub ПримерOnErrorGoto_0() Dim Num As Single On Error GoTo 0 Num = InputBox("Введите число") MsgBox "Введено число " & Num Resume End Sub При возникновении ошибки ввода выводится следующее диалоговое окно, сообщающее о несоответствии типа данного введённому значению (“Пус- то” или “Не число”). 94 2.12.4.5. Инструкции прерывания выполнения блокаExit Имеются следующие варианты инструкции Exit: Инструкция Exit Do позволяет выйти из цикла Do…Loop. Инструкция Exit For позволяет выйти из цикла For…Next или For Each…Next. Инструкция Exit Function позволяет выйти из функции, в кото- рой имеется данная инструкция. Инструкция Exit Sub позволяет выйти из процедуры Sub, в ко- торой имеется данная инструкция. Пример Приведённая ниже процедура ПримерExit использует инструкцию Exit для выхода из циклов For...Next и Do...Loop и процедуры Sub. Символ двоеточие используется для разделения инструкций в одной строке кода. Sub ПримерExit () Dim I, MyNum Do ' Устанавливается бесконечный цикл. For I = 1 To 5 ' Цикл повторяется 5 раз. MyNum = Int(Rnd * 10) ' Генерируется случайное число. Select Case MyNum ' Определяется значение случайного числа. Case 3: MsgBox "Case 3": Exit For ' Если 3, то выход из For...Next. Case 2: MsgBox "Case 2": Exit Do ' Если 2, то выход из Do...Loop. Case 5: MsgBox "Case 5": Exit Sub ' Если 5, то выход из процедуры. End Select Next I Loop End Sub 2.12.4.6. Инструкция передачи управления выполнением проце- дуры подпрограмме внутри процедуры GoSub…Return Инструкция имеет следующий формат: GoSub метка [инструкции или процедура] метка [инструкции подпрограммы] Return 95 Инструкции GoSub и Return можно использовать в любом месте процедуры, но GoSub и соответствующая ему инструкция Return должны быть в одной и той же инструкции. Подпрограмма может иметь более од- ной инструкции Return. Пример В приводимой ниже процедуре ПримерGosub вводится с клавиатуры число и выполняется подпрограмма, имеющая метку Ппр1, если число по- ложительное, или подпрограмма, имеющая метку Ппр2, если число отри- цательное. Процедура завершается выполнением инструкции If Num > 0 Then MsgBox " Результат деления = " & Num. Sub ПримерGosub() Dim Num As Single Num = InputBox("Введите положительное число") If Num > 0 Then GoSub Ппр1 ' Подпрограмма Ппр1 выполняется, ' если пользователь вводит положительное число. Else GoSub Ппр2 End If If Num > 0 Then MsgBox "Результат деления = " & Num Exit Sub Ппр1: Num = Num / 2 Return 'Возврат из подпрограммы Ппр1 'в управление выполнением процедуры ПримерGosub. Ппр2: MsgBox "Введено отрицательное число " & Num Return End Sub 2.12.4.7. Инструкция передачи управления выполнением проце- дуры на одну из нескольких строк кода On…GoSub и On…GoTo Инструкции On…GoSub и On…GoTo предназначены для передачи управления выполнением программы на одну из нескольких определённых строк программы в зависимости от значения некоторого параметра Эти инструкции имеют следующий формат: On выражение GoSub список_назначений On выражение GoTo список _назначений Формат инструкций On…GoSub и On…GoTo содержит следующие элементы: 96 Элемент инструкции Описание элемента Выражение Обязательный. Любое числовое выражение, которое имеет целое значение от 0 до 255 включительно. Если выражение является нецелым числовым выражением, оно округляется до его оценки Список_назначений Обязательный. Список номеров строк или меток строк, разде- ляемых запятыми Замечания Значение элемента выражение определяет, к какой строке из элемента список_назначений выполняется переход. Если значение выражения меньше 1 или превышает число элементов списка, происходит одно из следующих событий: Если выражение то Равняется 0 Управление передается инструкции, следующей за On...GoSub или On...GoTo Превышает число элементов списка Управление передается инструкции, следующей за On...GoSub или On...GoTo Отрицательное Возникает ошибка Больше 255 Возникает ошибка В одном списке допускается совместное использование номеров и меток строк. Не существует практического ограничения на число меток и номеров строк, используемых с инструкциями On...GoSub... и On...GoTo. Однако при использовании большего число меток или номеров, чем может уместиться на одной строке, необходимо применять символ продолжения строки для распространения логической строки на несколько физических строк. Инструкция Select Case обеспечивает более структурированный и гибкий способ выполнения множественных ветвлений. Пример В данном примере инструкции On...GoSub и On...GoTo используются для перехода к подпрограммам и строкам с указанными метками. Sub OnGosubGoto() Dim №_стр, Строка, n Ввод: №_стр = InputBox("Введите номер метки/строки") If №_стр = "" Then GoTo Ввод On №_стр GoSub М1, М2 ' Управление возвращается сюда ' после выполнения On...GoSub On №_стр GoTo 1, 2 ' Управление не возвращается сюда ' после выполнения On...GoTo. Exit Sub М1: MsgBox "Выполнен переход на метку М1": Return М2: MsgBox "Выполнен переход на метку М2": Return |