Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VBA учебник для ДИ и всех групп обучения.doc
Скачиваний:
4
Добавлен:
13.08.2019
Размер:
471.04 Кб
Скачать

Логические функции

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

Функция

Описание

Not

Отрицание

And

Логическое “И”

Or

Логическое “ИЛИ”

Xor

Отрицание “ИЛИ”

ПРИМЕР: Результат логического выражения (1=1) And (2>1) - True, так как оба условия справедливы.

Результат логического выражения (1=1) Xor (1>2) - False, так как только одно из условий справедливо, а функция отрицает такую возможность.

Одноблочная структура If-Then

Отличие одноблочного оператора If-Then от простейшего оператора If состоит в том, что после ключевого слова Then ничего не пишется, а первый оператор из блока записывается со следующей строки. Окончание блока операторов обязательно следует обозначить с помощью оператора End If.

If Выражение Then

Блок операторов

End If

ПРИМЕР:

If A > B Then

A = B C = B*A Z = Exp(B + C)

End If

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

Многоблочная структура If-Then-ElseIf

Многоблочная структура операторов If-Then позволяют существенно расширить возможности одноблочной структуры. Они используются в тех случаях, когда необходимо отслеживать выполнение одного из нескольких условий сравнения. Общий вид такой структуры

If Выражение_1 Then

Блок операторов_1

Else

If Выражение_2 Then

Блок операторов_2

Else

If Выражение_3 Then

Блок операторов_3

и т д

Else Блок операторов_4 End If Когда встречается многоблочная структура If-Then, то VBA определяет результат логического Выражения_1. Если он равен True, то Блок операторов_1 выполняется, если результат False, данный блок пропускается и осуществляется переход к строке логического сравнения Выражения_2.

Далее таким же способом производится проверка результата логического сравнения Выражения_2 и Выражения_3.

Если ни одно из условий логического сравнения Выражение_1, Выражения_2 и Выражение_3 не имеют результата True, выполняется Блок операторов_4 условия Else, которое можно воспринимать как условие “Иначе”. Это необязательный оператор, он используется только в тех случаях, когда программа должна сделать определенные действия, если из перечисленных условий ни одно не выполняется.

ПРИМЕР:

If Pay > 1000 Then

Bonus = Pay / 100

Else

If Pay > 10000 Then

Bonus = Pay / 90

Else

If Pay > 100 000 Then

Bonus = Pay / 80

Else

If Pay > 1000 000 Then

Bonus = Pay / 70

Else

Bonus = Pay / 200

End If

Блок условия Else будет выполняться, если Pay <= 1000.

Вычисляемые циклы

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

Циклическая структура For-Next

Синтаксис структуры For-Next имеет вид:

Блок кода

Exit For Next Счетчик_Цикла

ПРИМЕР For i = 1 То 10 Step 2 ' Будут рассчитываться значения i = 1, 3, 5, 7, 9

Y = x * i Next For j = 99 То 20 Step –5 ' В порядке убывания j = 99, 94, 89 и т.д. до 24

F = (j + 3) * (j – 1) * 0.523 If F > 1500 Then Exit For Next j

Счетчик_цикла – имя переменной, предназначенной для счета количества шагов цикла. Ее значение должно представлять целое число.

Поскольку значение переменной Счетчик_Цикла любом месте блока кода цикла, следует помнить, что такие изменения могут привести к зависанию программы или возникновению ошибок, которые трудно найти. По возможности изменений Счетчика_Цикла в теле цикла следует избегать. Переменные Начало и Конец задают начальное и конечное значения Счетчика_цикла, а Шаг – величину наращивания ее значения после каждого выполнения цикла. Когда в программе встречается цикл For-Next, Счетчик_цикла получает значение Начало, затем выполняется блок кода вплоть до оператора Next. Пусть Шаг - положительное число, тогда значение Счетчика_цикла увеличивается на величину Шаг и сравнивается со значением Конец. Если значение Счетчика_цикла больше, чем значение Конец, то цикл прерывается и управление передается оператору, следующему за оператором Next. Если значение Счетчика_цикла меньше или равно значению Конец, то блок кода цикла выполняется еще раз. Так продолжается до тех пор, пока значение Счетчика_цикла не станет больше значения Конец.

Оператор Exit For используется для дострочного прерывания цикла. Обычно ему предшествует оператор логического сравнения каких-либо величин. В этом случае также управление переходит к оператору, следующему за оператором Next.

Если зарезервированное слово Step и величина Шаг опущены, то величина Счетчик_цикла наращивается на единицу после каждого шага цикла.

Если величина Конец меньше величины Начало и величина Шаг -отрицательное число, то цикл считается по убывающей, а не по возрастающей

Логически прерываемые циклы (ЛПЦ)

Логически прерываемые циклы – это повторяемые структуры, которые повторяются, только если выполняется некоторое условие.

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

Таким образом, ЛПЦ используются в тех случаях, когда количество шагов цикла заранее неизвестно. ЛПЦ применяются также для создания цикла обработки события. Он содержит вызовы процедур, проверяющих факт наступления события (запись текста в ячейку таблицы, директивы меню). Если событие наступило, то вызывается процедура его обработки. Цикл продолжается до тех пор, пока не будет вызвано условие завершения работы программы. Применение циклов Do-Loop.

Цикл Do-Loop является наиболее универсальным из логически прерываемых циклов. Существуют четыре конфигурации этого цикла:

условие True в начале, Do While Условие

Блок кода Exit Do Блок кода

Loop условие True в конце, Do

Блок кода

Exit Do Блок кода Loop While Условие

условие False в начале Do Until Условие

Блок кода Exit Do Блок кода

Loop

условие False в конце. Do Блок кода

Exit Do Блок кода Loop Until Условие

Зарезервированные слова While и Until определяются логику условия.

While указывает, что цикл будет выполняться до тех пор, пока Условие принимает значение True.

Until указывает, что цикл будет выполняться до тех пор, пока Условие принимает значение False.

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

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

ПРИМЕР: Определить условие выхода из ЛПЦ

C=120

Do Loop Until c<100

C=C-1

Loop

Правильный ответ C = 99

Доступ к ячейкам рабочих листов.

Для записи и получения данных из ячеек таблиц могут быть использованы три метода - Range, Cells и Offset.

Метод Range позволяет оперировать адресами ячеек, к которым необходимо обращаться. Адрес имеет тот же вид, что и при работе с Excel в обычном режиме, т.е. буква в адресе указывает на определенный столбец, цифра в адресе - на конкретный номер строки.

Метод Range позволяет обращаться как к отдельной ячейке, так и к диапазонам ячеек.

ПРИМЕР: ActiveWorkSheet.Range("D7").Value = 1000

Записать в ячейку D7 число 1000.

ActiveWorkSheet.Range("A1","C3").Value = 1

Во все ячейки диапазона A1 - C3 записать единицу

WorkSheets("Февраль").Range("E3:S4").Value = 12

Во все ячейки диапазона E3 - S4 записать 12

WorkSheets("Февраль").Range("E15:S17, D25:D28", ).Value = 0.075

В указанные ячейки двух несмежных диапазонов записать значение 0.075.

Union(WorkSheets("Январь").Range("A100"), _

WorkSheets("Февраль").Range("A10:I7")).Value = 11.11

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

Следует, однако, различать метод Range и объект Range. Так как метод Range, примененный к объекту Range, задает смещение, и ссылка на адрес ячейки становится относительной.

ПРИМЕР: ActiveWorkSheet.Range("A2").Range("C2")

В этом случае к адресу ячейки A2 следует добавить смещение - два столбца вправо и одна строка вниз. Результирующий адрес ячейки будет С3.

Метод Cells использует значения двух аргументов и возвращает объект Range, указывающий на адрес определенной ячейки. Первый аргумент задает номер строки, второй - номер столбца.

ПРИМЕР: WorkSheets("Январь").Сells(1,2). Value = 15

В ячейку B1 записать число 15.

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

WorkSheets("Январь").Сells(1,"B"). Value = 15

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

ПРИМЕР:

For I=1 to 17

For J = 2 to 4

ActiveWorkSheet.Cells(i, j).Value = i*j

Next J

Next I

В этом случае будет задействован диапазон ячеек B1 - D1.

В некоторых случаях удобно в качестве аргумента метода Range использовать значение, возвращаемое методом Cells

ПРИМЕР: i =3: j = 2

ActiveWorkSheet.Range(Cells(i, j)).Value = 0

Адрес рабочей ячейки - B3.

Совместное использование метода Cells и метода Range, приводит как и в случае с объектами Range, к смещению адреса ячейки. Метод Range задает адрес крайней слева и сверху ячейки, относительно которой отсчитывается смещение для определения адреса рабочей ячейки.

ПРИМЕР: ActiveWorkSheet.Range("B7").Cells(3,2).Value = 12

Адрес рабочей ячейки - С9

Метод Offset действует так же, как и метод Cells, однако адрес рабочей ячейки при его использовании будет всегда относительным относительно заданного объекта Range. Индексы строки и колонки при использовании метода Offset всегда будут на единицу меньше индексов, используемых методом Cells, указывающих на ту же ячейку (cм. предыдущий пример)

ПРИМЕР: ActiveWorkSheet.Range("B7").Offset(2,1) .Value = 0

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