Главная страница

Программирование VBA. Федеральное агентство по образованию государственное образовательное учреждение высшего профессионального образования


Скачать 2.93 Mb.
НазваниеФедеральное агентство по образованию государственное образовательное учреждение высшего профессионального образования
АнкорПрограммирование VBA.pdf
Дата24.04.2017
Размер2.93 Mb.
Формат файлаpdf
Имя файлаПрограммирование VBA.pdf
ТипУчебное пособие
#4339
страница9 из 13
1   ...   5   6   7   8   9   10   11   12   13
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

97 1:
MsgBox "Выполнен переход на строку 1"
2:
MsgBox "Выполнен переход на строку 2"
End Sub
1   ...   5   6   7   8   9   10   11   12   13


написать администратору сайта