Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VBA_lektsii.doc
Скачиваний:
8
Добавлен:
01.04.2025
Размер:
3.91 Mб
Скачать

7.1.6. Сохраняемые подпрограммы и функции

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

Sub ВызовСтатическойПодпрограммы()

СтатическаяПодпрограмма

СтатическаяПодпрограмма

End Sub

Static Sub СтатическаяПодпрограмма()

Dim Var1 As String

If Var1 = "" Then

Var1 = "Var1 ещё не статическая переменная "

Else

Var1 = " Var1 – статическая переменная."

End If

MsgBox Var1

End Sub

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

8. Управляющие структуры

Управляющие структуры VBA эквивалентны подобным структурам в других языках программирования, за исключение инструкции For-Each-Next.

Ниже перечислены основные управляющие структуры VBA.

Управляющая структура

Действие

If-Then-Else

Выполняет группу инструкций, если соблюдено некоторое условие

Select Case

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

For-Next

Выполняет группу инструкций заданное число раз

For-Each-Next

Выполняет действие над каждым объектом семейства или элементом массива

While-Wend

Выполняет группу инструкций, пока соблюдается некоторое условие

Do-Loop

Выполняет группу инструкций, пока соблюдается или не соблюдается некоторое условие

Функционально они делятся на две группы:

  • перехода и выбора (GoTo, If-Then-Else, Select Case);

  • повтора (For-Next, While-Wend, Do-Loop, For-Each-Next).

Рассмотрим подробнее действие этих структур.

8.1. Управляющая инструкция If-Then-Else

Условная инструкция If-Then-Else изменяет порядок выполнения программы в зависимости от результатов проверки некоторого условия.

Sub IfThenElse()

Dim Num1 As Integer

Num1 = GetRandomNumber

If Num1 = 7 Then

MsgBox "Поздравляю! Вы выиграли! Выпало число " & Num1 & "."

Else

MsgBox "Сожалею, но Вы проиграли. Выпало число " & _ Num1 & "."

End If

End Sub

Function GetRandomNumber()

GetRandomNumber = Int(10 * Rnd())

End Function

В процедуре IfThenElse вызов функции GetRandomNumber присваивает переменной Num1 случайное значение от 0 до 9. Затем в инструкции If происходит проверка условия: Num1 = 7. Если результат проверки равен True (Num1 равно 7), на экран выводится информационное окно с сообщением о выигрыше:

Если результат проверки равен False (Num1 не равно 7), на экран выводится другое окно – с сообщением о проигрыше:

Рассмотрим отдельные элементы инструкции If-Then-Else.

Элемент

Описание

If

Ключевое слово, отмечающее начало инструкции If-Then-Else

Num1 = 7

Условие для проверки. Первое условие всегда указано после ключевого слова If. Результатом проверки является одно из двух значений – True или False, которое и определяет порядок выполнения команд в инструкции If-Then-Else. Если условие соблюдено (True), управление передается инструкции, написанной сразу за ключевым словом If, следует до инструкции перед ключевым словом Else, а затем переходит к инструкции после ключевых слов End If. Если условие не выполнено (False), управление передается инструкции после ключевого слова Else и следует до ключевых слов End If

Then

Ключевое слово, отмечающее конец условия

MsgBox "Поздравляю! Вы выиграли! Выпало число " & Num1 & "."

Инструкция, выполняемая при положительном результате проверки

Else

Ключевое слово, отмечающее конец блока инструкций, выполняемых при положительном результате проверки, и начало блока инструкций, выполняемых при отрицательном результате проверки

MsgBox "Сожалею, но Вы проиграли. Выпало число " & Num1 & "."

Инструкция, выполняемая при отрицательном результате проверки

End If

Ключевые слова, отмечающие конец инструкции If-Then-Else

В инструкции If-Then-Else ключевое слово Else и следующий за ним блок инструкций не являются обязательными. Если эти элементы отсутствуют, при отрицательном результате проверки управление передается инструкции, стоящей после ключевых слов End If.

Как вы уже убедились на предыдущем примере, средствами If-Then-Else можно организовать выполнение инструкции в зависимости от соблюдения определенного условия. Рассмотрим другой вариант ее использования, на этот раз с ключевым словом ElseIf. Программа IfThenElseIf отображает запрос на ввод пароля. Если пароль введен правильно, программа предоставляет пользователю определенные возможности работы с рабочей книгой и сообщает ему об этом.

Sub IfThenElseIf()

Dim Password As String

Password = Get Password

If Password = "level1" Then

For Each Sheet In ActiveWorkbook.Sheets

Sheet.Visible = True

Sheet.Unprotect

Next

MsgBox "У Вас есть доступ ко всем листам этой книги."

Elself Password = "level2" Then

ActiveWorkbook.Worksheets(l). _

Visible = True

ActiveWorkbook.Worksheets(1). _

Unprotect

MsgBox "У Вас есть доступ только к 1-му листу книги."

Elself Password = "level3" Then

ActiveWorkbook.Worksheets(l).Visible = True

MsgBox "Вам доступен для чтения первый лист."

Else

MsgBox "Пароль введен неверно. Попробуйте ещё раз!"

End If

End Sub

Function GetPassword()

GetPassword = LCase(InputBox _

("Введите пароль:", "Password"))

End Function

ЗАМЕЧАНИЯ. 1. Во 2-й строке функции GetPassword используется встроенная функция LCase, которая преобразует все буквы переданной в нее строки в строчные.

2. Чтобы не отображать символы пароля на экране при его вводе, придется сконструировать форму с текстовым полем. Подробнее см. пример создания формы для ввода пароля на с. 141.

В программе IfThenElseIf ключевое слово Elself с последующим условием используется дважды. Новое условие вносит в порядок выполнения команд дополнительные изменения, если проверка первого условия закончилась неудачей. Первое условие указано сразу за ключевым словом If. В нем проверяется равенство переменной Password строке "level1". Если переменная не равна строке, VBA переходит к первому ключевому слову Elself, где проверяет следующее условие – равенство переменной Password строке "level2". Начиная с этого момента, программа использует только новое условие, «забывая» о старом. Если равенства опять нет, управление переходит к следующему ключевому слову Elself и т.д.

Просматривая IfThenElseIf, вы, вероятно, обратили внимание на несколько интересных моментов. В блоке, начинающемся сразу за ключевым словом If, помещен цикл For-Each-Next. В этом цикле перебираются все листы активной рабочей книги, с каждой из которых выполняются два действия: свойству Visible присваивается значение и вызывается метод Unprotect. Первое действие позволяет пользователю выделить лист, второе снимает с листа защиту паролем. У метода Unprotect есть один аргумент – строка с паролем. Но в данном случае пароль для защиты листов мы не использовали, поэтому Unprotect вызван без аргументов. В других блоках программы свойство Visible и метод Unprotect вызываются выборочно, в зависимости от введенного пароля.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]