Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика часть 1.doc
Скачиваний:
6
Добавлен:
16.04.2019
Размер:
290.3 Кб
Скачать

16.Изменение порядка выполнения операторов

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

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

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

Простейшими VBA-операторами изменения порядка выполнения кода являются операторы If … Then и If … Then … Else.

Оператор If … Then позволяет выбрать единственную альтернативную ветвь кода в процедуре или функции.

Синтаксис:

If условие Then оператор(ы),

где условие – любое логическое выражение;

оператор(ы) – один, несколько или ни одного оператора VBA.

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

Синтаксис:

If условие Then

оператор 1

оператор 2

….

Оператор n

End If

Выбор одной из двух различных ветвей операторов в зависимости от определенного условия обеспечивает оператор

If … Then … Else

и If … Then … ElseIf.

Синтаксис однострочного оператора If … Then … Else:

If условие Then оператор1 Else оператор2,

где условие – любое допустимое логическое выражение;

операторы – один или несколько операторов VBA, которые должны находиться в одной и той же строке.

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

Синтаксис:

If условие Then

Оператор1

Else

Оператор2

End If

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

Синтаксис:

Select Case выражение

Case условие_1

Оператор_1

Case условие_2

Оператор_2

…..

Case условие_N

Оператор_N

[Case Else

Оператор_N+1

End Select,

где выражение – любое численное или строковое выражение;

условие_1, условие_2, условие_N – (каждый) представляет список логических выражений, отделенных запятыми;

оператор_1, оператор_2, оператор_N, оператор_N+1 – (каждый) представляет один, несколько или ни одного оператора.

В Select Case можно включать столько операторов Case условия, сколько необходимо.

Примечание. Написание неоднострочных операторов в программах производится именно так (в столбец), либо редактор будет выдавать ошибку написания.

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

Оператор GoTo имеет следующий синтаксис:

GoTo метка

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

17.GOTO (англ. go to — «перейти к») — в некоторых языках программирования — оператор безусловного перехода (перехода к определённой точке программы, обозначенной номером строки либо меткой). В более широком смысле, под «GOTO» подразумевают любой такой оператор, даже если в рассматриваемом языке он называется по-другому. В компилируемых языках GOTO можно рассматривать как основную операцию по передаче управления из одной части программы в другую, поскольку компилятор переводит все остальные операторы перехода в форму, аналогичную GOTO.

Функциональность

В абсолютном большинстве языков программирования, поддерживающих его использование, оператор GOTO состоит из двух частей: собственно имени оператора и метки, маркирующей целевую точку перехода в программе, то есть имеет вид GOTO метка. Метка, в зависимости от правил языка, может быть либо числом (как, например, в классическом Бейсике), либо правильным идентификатором используемого языка программирования. Чтобы оператор перехода был корректным, необходимо наличие в тексте программы места, помеченного той же самой меткой, которая использована в данном операторе. Пометка может выглядеть по-разному, например, в языке Паскаль она имеет вид label: (то есть имя метки, за которым следует двоеточие), возможны и другие соглашения.

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

Оператор Exit (Visual Basic)HYPERLINK "/ru-ru/library/t2at9t47(v=VS.90).aspx"

Завершает процедуру или блок и передает управление оператору, следующему непосредственно после вызова процедуры или определения блока.

Exit { Do | For | Function | Property | Select | Sub | Try | While }

Exit Do

Немедленный выход из цикла Do, в котором находится этот элемент.Выполнение продолжается с инструкции, следующей за инструкцией Loop.Exit Do можно использовать только внутри цикла Do.При использовании вложенных циклов Do оператор Exit Do закрывает самый внутренний цикл и передает управление следующему уровню вложения.

Exit For

Немедленный выход из цикла For, в котором находится этот элемент.Выполнение продолжается с инструкции, следующей за инструкцией Next.Exit For можно использовать только внутри цикла For...Next или For Each...Next.При использовании вложенных циклов For оператор Exit For закрывает самый внутренний цикл и передает управление следующему уровню вложения.

Exit Function

Немедленный выход из процедуры Function, в которой находится этот элемент.Выполнение продолжается с инструкции, следующей за инструкцией, вызвавшей процедуру Function.Exit Function можно использовать только внутри процедуры Function.

Чтобы задать возвращаемое значение, можно присвоить значение имени функции в строке перед оператором Exit Function.Для присвоения возвращаемого значения и завершения функции в одном операторе можно воспользоваться Оператор Return (Visual Basic).

Exit Property

Немедленный выход из процедуры Property, в которой находится этот элемент.Выполнение продолжается с инструкции, которая вызвала процедуру Property, т. е. с инструкции, запрашивающей или задающей значение свойства.Exit Property можно использовать только внутри процедуры Get или Set свойства.

Чтобы задать возвращаемое значение в процедуре Get, можно присвоить значение имени функции в линии до оператора Exit Property.Для присвоения возвращаемого значения и завершения процедуры Get в одном операторе можно воспользоваться оператором Return.

В процедуре Set оператор Exit Property эквивалентен оператору Return.

Exit Select

Немедленный выход из блока Select Case, в котором находится этот элемент.Выполнение продолжается с инструкции, следующей за инструкцией End Select.Exit Select можно использовать только внутри инструкции Select Case.

Exit Sub

Немедленный выход из процедуры Sub, в которой находится этот элемент.Выполнение продолжается с инструкции, следующей за инструкцией, вызвавшей процедуру Sub.Exit Sub можно использовать только внутри процедуры Sub.

В процедуре Sub оператор Exit Sub эквивалентен оператору Return.

Exit Try

Немедленный выход из блока Try или Catch, в котором находится этот элемент.Выполнение продолжается с блока Finally, если он имеется; в противном случае — с инструкции, следующей за инструкцией End Try.Exit Try можно использовать только внутри блока Try или Catch, но не внутри блока Finally.

Exit While

Немедленный выход из цикла While, в котором находится этот элемент.Выполнение продолжается с инструкции, следующей за инструкцией End While.Exit While можно использовать только внутри цикла While.При использовании во вложенных циклах While, оператор Exit While передает управление циклу, находящемуся на один уровень выше цикла, в котором находится Exit While.

Оператор End

HYPERLINK "/ru-ru/library/0wt87xba(v=VS.90).aspx"

Немедленно прекращает выполнение.

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

Примечание

Оператор End резко останавливает выполнение кода, и не вызывает метод Dispose или Finalize, или любой другой код Visual Basic.Ссылки на объекты, хранящиеся в других программах, становятся недействительными.Если оператор End оказывается внутри блока Try или Catch, управление не передается в соответствующий блок Finally.

Оператор Stop приостанавливает выполнение, однако, в отличие от End, не закрывает файлы и не очищает переменные, если только не встречается в скомпилированном исполняемом файле (с расширением EXE).

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

Не следует часто применять оператор End, только когда требуется немедленно прекратить выполнение приложения.Обычные способы завершения процедуры (Оператор Return (Visual Basic) и Оператор Exit (Visual Basic)) не только аккуратно завершают процедуру, но также дают вызывающему коду возможность безопасного закрытия приложения.Для консольного приложения, например, можно просто использовать Return из процедуры Main.

Пример

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

VB

Sub Form_Load()

Dim answer As MsgBoxResult

answer = MsgBox("Do you want to quit now?", MsgBoxStyle.YesNo)

If answer = MsgBoxResult.Yes Then

MsgBox("Terminating program")

End

End If

End Sub

18Рекурсия — мощный метод программирования, который позволяет разбить задачу на части все меньшего и меньшего размера до тех пор, пока они не станут настолько малы, что решение этих подзадач сведется к набору простых операций. Что такое рекурсия? Рекурсия происходит, если функция или подпрограмма вызывает сама себя. Прямая рекурсия (direct recursion) выглядит примерно так:

Function Factorial(num As Long) As Long

Factorial = num * Factorial(num - 1)

End Function

В случае косвенной рекурсии (indirect recursion) рекурсивная процедура вызывает другую процедуру, которая, в свою очередь, вызывает первую:

Private Sub Ping(num As Integer)

Pong(num - 1)

End Sub

Private Sub Pong(num As Integer)

Ping(num / 2)

End Sub

Рекурсия полезна при решении задач, которые естественным образом разбиваются на несколько подзадач, каждая из которых является более простым случаем исходной задачи. Можно представить дерево в виде «ствола», на котором находятся два дерева меньших размеров. Тогда можно написать рекурсивную процедуру для рисования деревьев:

Private Sub DrawTree()

Нарисовать "ствол"

Нарисовать дерево меньшего размера, повернутое на -45 градусов

Нарисовать дерево меньшего размера, повернутое на 45 градусов

End Sub

Хотя рекурсия и может упростить понимание некоторых проблем, люди обычно не мыслят рекурсивно. Они обычно стремятся разбить сложные задачи на задачи меньшего объема, которые могут быть выполнены последовательно одна за другой до полного завершения. Например, чтобы покрасить изгородь, можно начать с ее левого края и продолжать двигаться вправо до завершения. Вероятно, во время выполнения подобной задачи вы не думаете о возможности рекурсивной окраски — вначале левой половины изгороди, а затем рекурсивно — правой. Для того чтобы думать рекурсивно, нужно разбить задачу на подзадачи, которые затем можно разбить на подзадачи меньшего размера. В какой то момент подзадачи становятся настолько простыми, что могут быть выполнены непосредственно. Когда завершится выполнение подзадач, большие подзадачи, которые из них составлены, также будут выполнены. Исходная задача окажется выполнена, когда будут все выполнены образующие ее подзадачи.