Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС лекция.docx
Скачиваний:
5
Добавлен:
01.09.2019
Размер:
67 Кб
Скачать

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

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

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

К управляющим структурам VBA относятся:

- условные операторы IF... Then... Else ...; оператор выбора Select Case; цикл с конечным числом повторений FOR ... NEXT. цикл с условием DO ... LOOP,

цикл, FOR Each ... Next позволяющий повторять некоторые действия со всеми объектами семейства;

оператор With, позволяющий выполнять множество действий с одним объектом .без необходимости каждый раз указывать имя объекта.

5.1 Условный оператор IF

Эта управляющая структура используется для выбора той или иной ветви выполнения программы на основании некоторого условия. Имеет два синтаксиса: однострочный и многострочный.

5.1.1 Однострочный синтаксис IF

If условие Then команда1 [Else команда2]

Сначала проверяется условие и при его истинности выполняется команда1, а при ложности команда2.

Условие - представляет собой любое выражение или функцию, истинность которых будет оцениваться. Условие может быть одного из следующих типов:

оператор сравнения переменной с каким-либо значением, переменной или функцией;

Х>5 aob Z=lnt(X)

переменная, принимающая значение логического типа;

Dim F As Boolean

If F Then

любая функция, возвращающая значение логического типа.

If IsNumeric(A) Then MsgBox "Вы ввели число" Else MsgBox "Это не число"

Функция IsNumeric(ebipa)KeHue) возвращает Истину, если выражение является числом, иначе - Ложь.

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

Вычислить Z. Z - cos(x), если Х>0 и Z = 1, иначе. Sub Вычисление_г()

Dim X As integer, Z As Double X = 1пр1ЛВох("Введите X") IF X>0 Then Z =Cos(x) ElseZ=1 MsgBox "Z = " &Z

End Sub

Если необходимо проверить несколько условий или в ответ Но истинность (ложность) условия необходимо выполнить несколько действий, используют многострочный (блочный) синтаксис оператора IF.

5.1.2 Многострочный синтаксис оператора IF

If условие 1 Then [операторы1]

[Elself условие _п Then [elseif операторы] . ..

[Else

[else операторы]] End If

Используется для анализа нескольких условий, на каждое из которых может быть свой отклик. Данная синтаксическая конструкция еще называется блочной и обязательно заканчивается End tf.

t щ

j При использовании блочного оператора if строго следите за формой его написания.

Пример: Покупатель приобретает товар по определенной цене. В зависимости от количества

купленных товаров предоставить покупателю плавающую систему скидок: при количестве > 10, скидка составит 5%; >25, скидка -10%; >50,скидка -15%.

Составим блок-схему решения данной задачи, обозначив количество товара символом К Реализация на VBA:

Sub Покупка() Dim К As Byte Dim Скидка As Double Const Цена As Currency = 500 K= lnputB0x("CK0nbK0 товара приобретено?")

If К > 50 Then

Скидка = 0.15 Elself К > 25 Then

Скидка = 0.1 Elself К > 10 Then

Скидка = 0.05 Else

Скидка = 0 End If

MsgBox "Покупатель заплатит " & Цена * К * (1- Скидка) & " руб." End Sub

5.1.3 Вложенные операторы IF

Однострочный и блочный синтаксис оператора IF могут комбинироваться. Снтаксис:

If условие! Then

Иусловие2 Then [операторы2] Else

[else операторы]] ■■■

End "if

[Else

[else _ операторы]] End If

Например, необходимо вычислить значение выражения Y=sin(X)/X. В этой задаче сделаем проверку, является ли X числом и не равно ли X нулю. Блок-схема для решения данной задачи:

I

Т

Сообщение!

Y=sin(X)/X

Сообщение2

Реализация на VBA:

Sub Вычислить_У() Dim X As Variant, Y As Double X = 1пр|ЛВох("Введитс X")

ПИ ■ ' ' ■ О У

If IsNumeric(X) Then

If X <> 0 Then

Y = Sin(X) / X MsgBox "Y= " & Y Else

MsjSoy "X не должен равняться 0 I" End If Else

MsgBox "Вы ввели не число" End If

Т

Сообщение!

Y=sin(X)/X

Сообщение2

Реализация на VBA:

Sub Вычислить_У() Dim X As Variant, Y As Double X = 1пр|ЛВох("Введитс X")

ПИ ■ ' ' ■ О У

If IsNumeric(X) Then

If X <> 0 Then

Y = Sin(X) / X MsgBox "Y= " & Y Else

MsjSoy "X не должен равняться 0 I" End If Else

MsgBox "Вы ввели не число" End If

;/;?.•- - любое имя массива, использующее допустимый идентификатор имени; S?i - измерение массива. Если размерность массива больше единицы, то Subscripts разделяются запятыми.

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

Uvv-:i-r - определяет нижний диапазон допустимых индексов для массива (необязательный аргумент); . - определяет верхний предел для индексов массива (обязательный аргумент).

Примеры правильного объявления массивов:

I НИ Si.riii:,; - одномерный статический строковый массив, включающий 10 элементов; ,) - динамический массив;

То 1) As luteг - двумерный статический массив целых чисел, включающий

6*8=48 элементов.

При объявлении массивов следует помнить, что включение оператора Subscripts в объявлении массива создает статический массив с фиксированным числом элементов, пропуск оператора Subscripts в объявлении массива создает динамический массив, а установка директивы компилятора Option Base влияет на общее число элементов в массиве.

Использование массивов

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

Нижеприведенный листинг показывает элементарное объявление и использование массива (в качестве элементов массива используется факториал номера элемента массива): ^

;/;?.•- - любое имя массива, использующее допустимый идентификатор имени; S?i - измерение массива. Если размерность массива больше единицы, то Subscripts разделяются запятыми.

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

Uvv-:i-r - определяет нижний диапазон допустимых индексов для массива (необязательный аргумент); . - определяет верхний предел для индексов массива (обязательный аргумент).

Примеры правильного объявления массивов:

I НИ Si.riii:,; - одномерный статический строковый массив, включающий 10 элементов; ,) - динамический массив;

То 1) As luteг - двумерный статический массив целых чисел, включающий

6*8=48 элементов.

При объявлении массивов следует помнить, что включение оператора Subscripts в объявлении массива создает статический массив с фиксированным числом элементов, пропуск оператора Subscripts в объявлении массива создает динамический массив, а установка директивы компилятора Option Base влияет на общее число элементов в массиве.

Использование массивов

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

Нижеприведенный листинг показывает элементарное объявление и использование массива (в качестве элементов массива используется факториал номера элемента массива): ^

Sab example QIC)

Dim i As Integer, SUK As Integer, SUH2 As Integer

SUM = 0: SUH2 = 0

For i ■ 1 To 10 Step 2 3UH = Stm + i

For i = 10 To 1 Step -2

SUM2 = 3UK2 + i Naxt i

MsgBox "Сумма нечетных чисел от 1 до 10 равна " s 3TJM « vtoCr £ "Сумма четных чисел от 1 до. 10 равна " & SUM2

Сумма Нечетных чисел от 1 до 10 равна 25 Сумма четных чисел от 1 до 10 равна 30

Обратите внимание' Мри уменьшении счетчика цикла For..Next цикл выполняется, пока переменная счетчика больше или равна конечному значению, а когда счетчик цикла увеличивается, цикл выполняется, пока переменная счетчика меньше или равна конечному значению.

Цикл For Each.. Next

Цикл For Each..Next не использует счетчик цилка. Циклы For Each..Next выполняются столько раз, сколько имеется элементов в определенной группе, такой как коллекция объектов или массив (которые будут рассматриваться позже). Проще говоря, цикл For Each..Next выполняется один раз для каждого элемента в группе.

Синтаксис

- переменная, используемая для итерации по всем элементам в определенной группе это объект коллекции или массив

; - один, несколько или ни одного оператора VBA (тело цикла).

Цикл For Each..Next всегда выполняется столько раз, сколько имеется элементов в определенной группе.

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

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

Sab example QIC)

Dim i As Integer, SUK As Integer, SUH2 As Integer

SUM = 0: SUH2 = 0

For i ■ 1 To 10 Step 2 3UH = Stm + i

For i = 10 To 1 Step -2

SUM2 = 3UK2 + i Naxt i

MsgBox "Сумма нечетных чисел от 1 до 10 равна " s 3TJM « vtoCr £ "Сумма четных чисел от 1 до. 10 равна " & SUM2

Сумма Нечетных чисел от 1 до 10 равна 25 Сумма четных чисел от 1 до 10 равна 30

Обратите внимание' Мри уменьшении счетчика цикла For..Next цикл выполняется, пока переменная счетчика больше или равна конечному значению, а когда счетчик цикла увеличивается, цикл выполняется, пока переменная счетчика меньше или равна конечному значению.

Цикл For Each.. Next

Цикл For Each..Next не использует счетчик цилка. Циклы For Each..Next выполняются столько раз, сколько имеется элементов в определенной группе, такой как коллекция объектов или массив (которые будут рассматриваться позже). Проще говоря, цикл For Each..Next выполняется один раз для каждого элемента в группе.

Синтаксис

- переменная, используемая для итерации по всем элементам в определенной группе это объект коллекции или массив

; - один, несколько или ни одного оператора VBA (тело цикла).

Цикл For Each..Next всегда выполняется столько раз, сколько имеется элементов в определенной группе.

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

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

Sab example QIC)

Dim i As Integer, SUK As Integer, SUH2 As Integer

SUM = 0: SUH2 = 0

For i ■ 1 To 10 Step 2 3UH = Stm + i

For i = 10 To 1 Step -2

SUM2 = 3UK2 + i Naxt i

MsgBox "Сумма нечетных чисел от 1 до 10 равна " s 3TJM « vtoCr £ "Сумма четных чисел от 1 до. 10 равна " & SUM2

Сумма Нечетных чисел от 1 до 10 равна 25 Сумма четных чисел от 1 до 10 равна 30

Обратите внимание' Мри уменьшении счетчика цикла For..Next цикл выполняется, пока переменная счетчика больше или равна конечному значению, а когда счетчик цикла увеличивается, цикл выполняется, пока переменная счетчика меньше или равна конечному значению.

Цикл For Each.. Next

Цикл For Each..Next не использует счетчик цилка. Циклы For Each..Next выполняются столько раз, сколько имеется элементов в определенной группе, такой как коллекция объектов или массив (которые будут рассматриваться позже). Проще говоря, цикл For Each..Next выполняется один раз для каждого элемента в группе.

Синтаксис

- переменная, используемая для итерации по всем элементам в определенной группе это объект коллекции или массив

; - один, несколько или ни одного оператора VBA (тело цикла).

Цикл For Each..Next всегда выполняется столько раз, сколько имеется элементов в определенной группе.

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

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

Sufc exarapie_02(j

Dim Fctr 1(1 To 10) As Single Dim i As Integer

Fctr1(1) " 1

For i = 2 To 10

Fctr1 (i) = Fctrl{i - 1) * i Next i

MsgBox ("Последний элемент массива - " € Fctrl(lO))

При помощи вложенных циклов довольно легко можно организовать инициализацию двумерного массива:

-Juto example 02 О

Dim Dbi_Array(5, 7) As Single Dim i As Integer, j Аз Integer

For i=l To 5

Ff i: i = 1 To 7

Db _Array(i, j) = InputBox("Ввод целого числа для" " элемента (" £ i £ " , " £ j £ ")", _ "Ввод элементов массива для строки " £

Next j Next i

End Sub

Изменение размерное! и динамическою массива

Могут сложиться обстоятельства, при которых точно неизвестно, сколько элементов потребуется в массиве. В VBA имеется возможность при помощи оператора ReDim переопределять размерность массива, а во время объявления не указывать его размерность.

Синтаксис ReDim:

- имя существующего массива; sut -r. - размерность существующего массива;

: - любой тип VBA. Необходимо использовать отдельный оператор As Туре для каждого массива, который определяется;

Р ?.:••. - необязательный аргумент. Его использование приводит к тому, что данные уже имеющиеся в массиве, сохраняются после изменения его размерности.

Примеры правильного использования оператора Re Dim:

Dim Ллгау Mojh!\0 As у-ащ - одномерный строковый динамический массив

RcL'irn Аущ JVk>na}.{2^) - устанавливет размерность динамического массива равную 29 элементам RvDim Дггцу Mosu^ri "1 о 30' - изменяет размер массива до 30 элемента

ReDim Preserve Апц Month*! Т а 31) - изменяет размер массива до 31 элемента, сохраняя содержимое

Dim ШШ> As Single - объявляет динамический массив

Re Он-» Array j>BI (2. 9} - делает массив двумерным

Re Dim AjraywL>Bj.(3: о - изменяет размер двумерного массива

г.-;<чч7Ч Jo У \ То : }-изменяет последний размер массива, сохраняя содержимое

Обратите внимание! Можно изменять только последнее измерение многомерного массива, когда используется ключевое слово Preserve.