- •Свойства размещения и размера элемента:
- •Текстовое поле - TextBox
- •Кнопка Command Button. Свойства:
- •Понятие программного кода
- •Окно программного кода
- •Процедуры
- •Структура процедуры
- •Создание процедуры
- •Вызов процедур на исполнение
- •Практическое задание №1
- •Типы данных, которыми оперирует vba
- •Переменные
- •Объявление переменных
- •Массивы
- •Пользовательские типы данных
- •Операторы присваивания
- •Комментарии
- •Операции vba
- •Математические функции vba
- •Строковые функции
- •Функции даты и времени
- •Преобразование типов данных
- •Создание и применение процедур и функций.
- •Передача процедуре величин
- •Использование списка поименованных аргументов
- •Создание и применение функций
- •Операторы тела функции
- •Управление выполненем программы
- •Логические функции
- •If Выражение_1 Then
- •If Выражение_2 Then
- •If Выражение_3 Then
Логические функции
Для расширения возможностей простых операторов логического сравнения, в 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