Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на BASIC / Visual Basic / Учебно-методическое пособие по изучению Visual Basic for Applications (VBA).doc
Скачиваний:
207
Добавлен:
02.05.2014
Размер:
1.55 Mб
Скачать

Часть 4. Изменения порядка выполнения операторов в vba

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

Изменение порядка выполнения операторов не всегда связано с реакцией на возникающие в процессе работы программы проблемы. Если вам необходимо, чтобы пользователь процедуры делал некоторый выбор по поводу последующего действия процедуры, можно использовать функцию InputBox для получения текстового ввода от пользователя или использовать функцию MsgBox, давая возможность пользователю делать выбор щелчком на командной кнопке в окне сообщения. После получения пользовательского выбора процедура должна

67

выполнить действие, соответствующее этому выбору.

При использовании VBA-операторов изменения порядка выполнения операторов определяется условие или набор условий, при которых VBA выполняет ту или иную ветвь (branch) кода процедуры. Поскольку такие операторы влияют на последовательность выполнения программы, их часто называют операторами управления потоком (flow control) или операторами управления программой (program control), но на практике они более известны как операторы условного и безусловного перехода (conditional и unconditional branching).

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

Из этой части вы узнаете об операторах условного и безусловного перехода.

Лабораторная работа № 4. Операторы условного и безусловного

перехода

Цель занятия: Знать операторы условного и безусловного перехода.

Уметь использовать MsgBox для обеспечения возможности

выбора Материалы к занятию: MS Excel 2003.

Простой выбор

Простейшими VBA-операторами изменения порядка выполнения кода являются операторы If…Then и If…Then…Else. Оператор If…Then позволяет VBA выбрать единственную альтернативную ветвь выполнения процедуры. Связанный с ним оператор If...Then...Else дает возможность VBA выбирать из двух альтернативных ветвей кода процедуры на основе оценки того, является ли указанное условие равным True.

Оператор If…Then имеет две различные формы синтаксиса. Простая форма – это однострочный оператор If…Then:

If Condition Then Statements

Condition – любое логическое выражение, a Statements – один, несколько или ни одного оператора VBA; все операторы должны помещаться в одной и той же строке. При выполнении подобного оператора VBA сначала оценивает логическое выражение, представленное с помощью Condition; если это логическое выражение равно True, то выполняется оператор (или операторы) после ключевого слова Then до конца строки. Затем VBA возобновляет выполнение кода с первого оператора после строки, содержащей оператор If…Then. Если логическое выражение, представленное с помощью Condition, равно False, то выполняется первый оператор в строке после строки, содержащей оператор If…Then, без выполнения альтернативной ветви.

68

Задание 1. Напишите процедуру, использующую однострочный оператор If…Then.

Для этого:

ь введите процедуру (листинг 9):

Листинг 9 – Использование однострочного оператора If…Then

1 Sub List4_9 ()

2 Dim temperature As Single 3

  1. temperature = CSng(InputBox("Введите число", "Исходные данные"))

  2. If temperature > 100 Then MsgBox "Слишком горячо!"

6 End Sub

Можно включать несколько операторов VBA в одну строку, отделяя каждый из них двоеточием (:), как показано в следующем примере:

Statements1 : Statements2 : … : StatementsN

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

Вторая форма синтаксиса оператора If…Then называется блоком (block) оператора If. В блоке оператора If…Then условие и операторы записываются в отдельных строках, как показано в следующей синтаксической форме:

If Condition Then

Statements End If

ключевые слова End If указывают VBA, что достигнут конец альтернативной ветви операторов. Ключевые слова End If должны появляться в отдельной строке, хотя в эту строку можно включать конечный комментарий.

Изображение оператора If…Then (однострочная и блочная форма) на блок-схеме:

Condition

True

False

Statements

Упражнение 1

Напишите процедуру, использующую блочный оператор If…Then.

Оператор If…Then дает возможность задавать одну альтернативную ветвь операторов в процедуре. Однако часто бывает необходимо выбрать одну из двух различных ветвей операторов в зависимости от определенного условия. Для этого VBA предоставляет операторы If…Then…Else и If…Then…ElseIf.

VBA-оператор If…Then…Else имеет две формы: однострочную и блочную. Синтаксис однострочного оператора If…Then…Else следующий:

69

If Condition Then Statements Else ElseStatements

Condition – любое допустимое логическое выражение. Statements – один или несколько операторов VBA. Все операторы и ключевые слова однострочного If…Then…Else должны находиться в одной и той же строке. При выполнении однострочного оператора If…Then…Else VBA сначала оценивает логическое выражение, представленное с помощью Condition; если это выражение равно True, VBA выполняет операторы (представленные с помощью Statements) между ключевыми словами Then и Else и возобновляет выполнение кода с первого оператора после строки, которая содержит If…Then…Else. Если логическое выражение, представленное с помощью Condition, равно False, VBA выполняет операторы после ключевого слова Else до конца строки (представленные с помощью ElseStatements) и продолжает выполнение кода с первого оператора после строки, содержащей If…Then…Else.

Задание 2. Напишите процедуру, использующую однострочный оператор If…Then…Else.

Для этого:

ь введите процедуру (листинг 10):

Листинг 10 – Использование однострочного оператора If…Then…Else

1 Sub List4_10 ()

2 Dim Ves As Single 3

  1. Ves = CSng(InputBox("Введите число", "Исходные данные"))

  2. If Ves > 100 Then MsgBox "Тяжело!" _

7 Else MsgBox "Не так тяжело!"

8 End Sub

В этом примере, если значение переменной Ves больше 100, то условное выражение равно True и VBA выполняет оператор MsgBox для отображения сообщения "Тяжело!". Если переменная Вес содержит число, равное или меньшее 100, то рассматриваемое условие равно False и VBA выполняет оператор MsgBox после ключевого слова Else для отображения сообщения "Не так тяжело!".

Блок операторов If...Then...Else легче читать и понимать и, поскольку можно располагать операторы в разных строках внутри блока оператора If…Then…Else, он не имеет ограничения по размеру и числу операторов, которые можно помещать в альтернативные ветви. Блок оператора If…Then…Else имеет следующий синтаксис:

If Condition Then

Statements Else

ElseStatements End If

Изображение оператора If…Then…Else (однострочная и блочная форма) на блок-схеме:

70

IFalse^True

ElseStatements Statements

Оператор If…Then… Else выбирает одну или другую ветвь, но никогда не выбирает обе ветви одновременно.

Сложный выбор

При необходимости принятия более сложных решений можно помещать оператор IfThen или IfThenElse внутрь другого оператора If…Then или IfThenElse, что называется вложением операторов (nesting). Вложение означает помещение одного типа структуры управления выполнением кода внутрь другой

Задание 3. Напишите процедуру, содержащую вложенные операторы

If…Then…Else.

Для этого:

^введите процедуру (листинг 11):

Листинг 11 - Вложенные операторы IfThenElse

1 Sub List4 11 ()

  1. ' Определение скидки (в %) в зависимости от

  2. ' количества продаваемого товара

  3. Dim IStr As String

  4. Dim IntNum As Variant 6

7 IntNum = Application.InputBox(

  1. Prompt:="Введите количество товара",

  2. Title:="Исходные данные", Type:=1) _

10 If Not (TypeName(IntNum) = "Boolean") Then

11 If IntNum > 1000 Then

12 IStr = "10"

13 Else

14 If IntNum > 500 Then

15 IStr = "6"

16 Else

17 IStr = "0"

18 End If

  1. End If

  2. MsgBox "Скидка " & IStr & "%"

21 Else

22 MsgBox "Количество не указано"

23 End If

24 End Sub

71

Аргументы в строках 8, 9 Prompt, Title, Type являются именованными аргументами функции Application.InputBox. Написанная так процедура будет работать только в Excel, так как она использует метод Application.InputBox. Этот метод применен для того, чтобы не дать пользователю во время работы функции InputBox ввести что-либо, кроме числа (необязательный аргумент Type:=1 говорит о том, что вводить можно только численные значения). VBA отображает сообщение об ошибке, если пользователь вводит не число (рис. 17), и ожидает до тех пор, пока пользователь не введет численное значение или не выберет кнопку Cancel.

Рис. 17 Если пользователь, не вводя данные в окне функции Application.InputBox, щелкнет на кнопке OK, VBA также выдаст сообщение об ошибке (рис. 18).

Microsoft Excel

Ошибка в формуле,

ля получения дополнительных сведений нажмите кнопку "Справка". Чтобы получить помощь по использованию функции, выберите команду "Функция" (меню "Вставка"), Старайтесь не использовать вне формул знак равенства (=) и минус (-) или ставьте перед ними одиночную кавычку (').

ОК

! Справка

Рис. 18 Если пользователь использует «спасительную» кнопку Cancel, чтобы отказаться от ввода, программа (в строке 10) проверит результат ввода, который при щелчке на кнопке Cancel имеет тип Boolean, и выберет необходимую ветвь оператора If…Then…Else (выполнится оператор в строке 23).

VBA предоставляет сокращенную версию оператора If…Then…Else, являющуюся сжатым эквивалентом вложенных операторов If…Then…Else, показанных в листинге 11. Такой краткой формой является оператор If…Then…ElseIf.

Оператор If…Then…ElseIf имеет следующий синтаксис:

If Condition1 Then

Statements1 ElseIf Condition2

ElseIf Statements2 [Else

ElseStatements3] End If

Изображение оператора If…Then…ElseIf на блок-схеме:

72

Statements1

Condition1 True

True

False Condition1

Statements2

Falsej

Statements3

Упражнение 2

Напишите процедуру, использующую оператор If…Then…ElseIf.

Для выполнения выбора из нескольких возможных ветвей кода можно вкладывать операторы If…Then…Else на много уровней вглубь, но уследить за ходом выполнения ветвей становится прогрессирующе труднее. Оператор If…Then…ElseIf имеет подобную проблему: когда имеется много операторов ElseIf, оператор If…Then…ElseIf становится трудно читать и сопровождать. К «счастью», VBA имеет условный оператор перехода для использования в случаях, когда необходимо выбирать из большого количества различных ветвей кода: оператор Select…Case. Оператор Select…Case имеет следующий синтаксис:

Select Case TestExpression Case ExpressionListl

statements1 Case ExpressionList2 statements2 … … … … … …

Case ExpressionListN

statementsN [Case Else

ElseStatements End Select

ТеstExpression – любое численное или строковое выражение. ExpressionListl, ExpressionList2, …, ExpressionListN – (каждый) представляют список логических выражений, отделенных запятыми. Statements1, statements2, …, statementsN и ElseStatements (каждый) представляют один, несколько или ни одного оператора VBA. В Select…Case можно включать столько операторов Case ExpressionList, сколько необходимо.

Блок – схема оператора Select…Case подобна блок – схеме оператора If…Then…ElseIf.

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

73

Expressionl, Expression2, …, ЕxpressionN

Выражения в ExpressionList могут быть любыми численными, строковыми или логическими выражениями. Выражение в ExpressionList может также определять диапазон значений при использовании оператора То:

Expression1 To Expression2

Для выбора ветвей на основе сравнения, является ли TestExpression больше, меньше или равным какому-либо значению, или на основе какого-либо другого реляционного сравнения, используйте следующий синтаксис:

Is ComparisonOperator expression

Задание 4. Напишите процедуру, содержащую вложенные операторы If…Then…Else.

Для этого:

ь введите процедуру (листинг 12):

Листинг 12 – Использование оператора Select…Case

1 Sub List4_12 ()

  1. ' Определение скидки (в %) в зависимости от

  2. ' количества продаваемого товара

  3. Dim IStr As String

  4. Dim IntNum As Variant 6

7 IntNum = Application.InputBox( _

  1. Prompt:="Введите количество товара", _

  2. Title:="Исходные данные", Type:=1)

10 If Not (TypeName(IntNum) = "Boolean") Then

11 Select Case IntNum

12 Case Is > 1000

13 IStr = "10"

14 Case Is > 500

15 IStr = "5"

16 Case Else

17 IStr = "0"

  1. End Select

  2. MsgBox "Скидка " & IStr & "%"

20 Else

21 MsgBox "Количество не указано"

22 End If

23 End Sub

Безусловный переход

Оператор безусловного перехода, пожалуй, самый спорный оператор во всех языках программирования. В ранних языках он являлся почти единственным средством организации циклических выполнений блоков кода. Сторонники структурного программирования посвящают много времени критике программ и

74

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

Оператор безусловного перехода всегда изменяет порядок выполнения операторов в процедуре или функции VBA. При этом VBA не проверяет никаких условий (отсюда термин безусловный (unconditional)), а просто переходит к выполнению кода с другого места.

VBA имеет только один оператор безусловного перехода: GoTo. Оператор GoTo имеет следующий синтаксис:

GoTo Name

выражение Name представляет любую допустимую метку или номер строки в той же процедуре или функции, которая содержит оператор GoTo. При выполнении оператора GoTo VBA немедленно переходит к выполнению оператора в строке, определенной с помощью Name. Метка строки (line label) – это особый тип идентификатора, который задает определенную строку по имени. Метки строк имеют следующий синтаксис:

Name:

выражение Name – любой допустимый идентификатор VBA. Метка строки может начинаться в любом столбце в строке, если она является первым непустым символом в строке. Номер строки (line number) – в основном, то же самое, что и метка строки, но он является просто номером, а не идентификатором. Использование номеров строк в процедурах VBA является крайне нежелательным, следует всегда использовать метку строки вместо них.

Использование MsgBox для обеспечения возможности выбора

До сих пор вы использовали оператор MsgBox с целью отображения сообщений для пользователя в диалоговых окнах с заголовками. Как уже отмечалось в частях 2 и 3, при помощи необязательного аргумента Buttons можно использовать VBA-процедуру MsgBox как функцию для получения выбора от пользователя в ответ на сообщения или вопросы, которые отображает ваша процедура. Для многих простых вариантов выбора использование функции MsgBox для получения ответа от пользователя является гораздо более легким, чем получение текстового ввода с помощью функции InputBox и последующий анализ этого текста для определения того, какой выбор сделал пользователь.

При включении аргумента Buttons с необходимыми круглыми скобками оператор MsgBox работает подобно функции и отображает окно сообщения, содержащее различные командные кнопки. Число и тип командных кнопок, отображаемых диалоговым окном MsgBox, задается с помощью аргумента Buttons. Buttons указывает также кнопку по умолчанию в диалоговом окне и, содержит ли это диалоговое окно стандартные значки Windows: Critical, Information, Exclamation или Question для предупредительных сообщений и запросов пользователя (табл. 20). MsgBox возвращает численный результат, указывающий, какую командную кнопку выбрал пользователь (табл. 21).

75

Таблица 20 – Аргументы-константы функции MsgBox

Константа (числовое значение)

vbOKOnly (0) vbOKCancel (1)

Назначение

Отображает только кнопку OK; то же самое происходит при

опускании аргумента Buttons

Отображает кнопки OK и Отмена (OK, Cancel)

vbAbortRetryIgnore Отображает командные кнопки Стоп, Повтор, Пропустить

(2) vbYesNoCancel (3)

(Abort, Retry, Ignore)

Отображает кнопки Да, Нет и Отмена (Yes, No, Cancel)

vbYesNo (4)

Отображает кнопки Да и Нет (Yes, No)

vbRetryCancel (5)

Отображает кнопки Повтор и Отмена (Retry, Cancel)

vbCritical (16)

Отображает в диалоге значок критического

предупредительного сообщения (Critical Message) Windows

(красный кружок)

vbQuestion (32)

Отображает значок запроса (Query icon) Windows ("?");

обычно используется, чтобы задать пользователю очень

важный вопрос или выдать предупредительное сообщение,

требующее ответа

vbExclamation (48)

Отображает значок ("!") предупреждения (Warning

Message); обычно используется для отображения важной

информации или предупреждения, не требующего ответа

vbInformation (64)

Отображает значок ("i") информации (Information Message);

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

кроме предупреждения

vbDefaultButton1

(0)

vbDefaultButton2

(256)

vbDefaultButton3

(512)

vbDefaultButton4

(768)

Первая командная кнопка в диалоговом окне является

кнопкой по умолчанию

диалоговом окне является

диалоговом окне является кнопкой по умолчанию Четвертая командная кнопка в диалоговом окне является кнопкой по умолчанию

Вторая командная кнопка в

кнопкой по умолчанию

Таблица 21 – Возвращаемые значения-константы функции MsgBox


Третья командная кнопка в

Константа

Значение

Означает, что пользователь выбирает кнопку

vbOK

1

OK

vbCancel

2

Отмена (Cancel)

vbAbort

3

Стоп (Abort)

vbRetry

4

Повтор (Retry)

vbIgnore

5

Пропустить (Ignore)

vbYes

6

Да (Yes)

vbNo

7

Нет (No)

Задание 4. Напишите процедуру, аргумента Buttons функции MsgBox.

76

демонстрирующую использования

Для этого:

ь введите процедуру (листинг 13):

Листинг 13 – Использование MsgBox и аргумента Buttons

1 Sub List4_13 ()

  1. ' Процедура демонстрирует MsgBox, используемую как функция

  2. Const mTitle = "Демонстрация кнопок MsgBox"

  3. Dim Resp As Integer 5

6 Resp = MsgBox(Prompt:="Выберите кнопку", _

  1. Title:=mTitle, _

  2. Buttons:=vbYesNoCancel + vbQuestion)

9 Select Case Resp

10 Case Is = vbYes

11 MsgBox Prompt:="Вы выбрали кнопку 'Да'", _

  1. Title:=mTitle, _

  2. Buttons:=vbInformation

14 Case Is = vbNo

15 MsgBox prompt:="Вы выбрали кнопку 'Нет'", _

  1. Title:=mTitle, _

  2. Buttons:=vbInformation

18 Case Is = vbCancel

19 MsgBox prompt:="Вы выбрали кнопку 'Отмена'", _

  1. Title:=mTitle, _

  2. Buttons:=vbCritical

22 End Select

23 End Sub

Процедура List4_13 () демонстрирует использование оператора MsgBox как функции, результаты различных аргументов Buttons и оценку значения, которое возвращает функция MsgBox. Диалоговое окно, в котором пользователю необходимо сделать выбор, представлено на рис. 19.

*l

Демонстрация кнопок MsgBox

Ь

Выберите кнопку

Да

Нет Отмена

Рис. 19 Результаты работы кода этой процедуры при всех трех (по отдельности, конечно) выборах представлены на рис. 20.

х

Демонстрация кнопо

взштвз ^

v

V

Бы выбрали кнопку 'Нет'

Вы выбрали кнопку 'Да'

ОК

Рис. 20 77


ОК

Как только пользователь выбирает командную кнопку в окне сообщения, VBA возвращает численное значение, соответствующее выбору пользователя. В строке 6 результат функции MsgBox присваивается переменной Resp. VBA использует различные значения в зависимости от того, какую командную кнопку выбрал пользователь: одно значение для обозначения кнопки Да, другое – для обозначения кнопки Нет и еще одно – для кнопки Отмена. В строке 9 начинается оператор Select Case, который оценивает значение, возвращаемое функцией MsgBox в строке 6 и сохраняемое в переменной Resp. Тестовое выражение для оператора Select Case – это сама переменная Resp, поэтому VBA сравнивает значение в переменной Resp, чтобы проверить, совпадает ли оно с каким-либо условием Case в операторе Select Case.

Использование оператора Exit

Для того чтобы процедура прекратила выполнение, используется форма VBA-оператора Exit. Оператор Exit имеет следующий синтаксис:

Exit Sub

Exit Sub используется для окончания процедуры. Использование оператора End

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

Sub ГлавнаяПроцедура()

Call Процедура1 'Вызов процедуры Процедура1

Call Процедура2 'Вызов процедуры Процедура2 End Sub Sub Процедура1()

' Код процедуры End Sub Sub Процедура2()

' Код процедуры End Sub

Обратите внимание на то, что в этих фрагментах кода процедуры не возвращают никаких результатов свой работы. Это может быть только в случае, когда эти процедуры по очереди обрабатывают какие-то общие данные, выполняя над ними определенные действия. Результатами этих действий могут быть либо сами преобразованные данные, либо новые (и тоже общие) данные.

Контрольные вопросы

1. Что такое условный и безусловный переход?

78

  1. Какие вы знаете инструкции условного перехода?

  2. Какие вы знаете инструкции безусловного перехода?

  3. Каким термином пользуются при описании ситуации, когда одну инструкцию If…Then или If…Then…Else размещают внутри другой инструкции?

  4. Сколько предложений ElseIf может содержать инструкция If…Then…Else?

  5. Сколько предложений Case можно включать в инструкцию Select…Case?

  6. Какой цели служит аргумент Buttons функции MsgBox?

  7. Для чего используется инструкция Exit Sub?

Соседние файлы в папке Visual Basic