If condition Then
[statements ]
[ Else
[elsestatements ]]
End If
Приведенный выше пример со скидкой можно записать в следующей эквивалентной блочной структуре:
If Money > 1000 Then
Discount = 0.05
Else
Discount = 0
End If
или
If Money > 1000 Then
Discount = 0.05
End If
Дерево условий может оказаться гораздо более сложным, чем просто проверка одного условия. В этом случае оператор If….Then….ElseIf, который позволяет проверять множественные условия. Следующий пример показывает порядок проверки условий.
If condition-1 Then
[Statements]
[ElseIf condition-2 Then
[elseifstatements]
[Else
[elsestatements]]
End If
Первым поверяется условие condition-1. Если оно имеет значение True, то выполняются инструкции Statements и далее работа программы продолжится со строки, которая следует за ключевым словом End If. Если условие condition-1 возвращает значение False, то проверяется условие condition-2 и т.д., пока не встретится условие, возвращающее значение True, или не встречается ключевое слово Else.
Пользовательская функция с двумя условиями
Посмотрим для функции
в стандартном модуле пользовательскую функцию (листинг 3).Листинг 4. Пользовательская функция с двумя условиями (вариант 1).
Function Y(x)
If x < 0.5 Then
Y=(1+Abs(0.2-x))/(1+x+x^2)
Else
Y=x^(1/3)
End If
End Function
Конечно, ту же самую можно было бы запрограммировать с использованием двух операторов If. Но хотя этот код содержит меньше строк, он менее предпочтительнее (листинг 4).
Пользовательская функция с тремя условиями
Создадим в стандартном модуле пользовательскую функцию (листинг 5).для функции
Листинг 5. Пользовательская функция с двумя условиями (вариант 1).
Function Z(x)
Select case x
Case Is < 0.2
Z=1+ Log(1 + Abs(x))
Case Is <= 0.8
Z=(1+x^(1/2))/(1+x)
Case Else
Z=2*Exp(-2*x)
End Select
End Function
Эту функцию можно запрограммировать с использованием оператора If.
Листинг 6. Пользовательская функция с двумя условиями (вариант 2).
Function функцияZ1(x)
If x < 0.2 Then
функцияZ1 = 1 + Log(1 + Abs(x))
ElseIf x > 3.8 Then
функцияZ1 = 2 * Exp(-2 * x)
Else
функцияZ1 = (1 + x ^ (1 / 2)) / (1 + x)
End If
End Function
Область видимости переменной
В программе все идентификаторы (в частности, имена переменных и функций) имеют определенную область видимости (scope). Область видимости переменной определяет ту область кода, которая "знает" о существовании данной переменной.
Переменная, объединенная внутри функции, не может быть использована или обнаружена вне данной функции. Это означает, что пользователь может использовать то же самое имя переменной в другой функции, и VBA не перепутает их.
Таким образом, для каждой из рассмотренных выше функций нет нужды создавать свой стандартный модуль.
Их все можно расположить в одном модуле, и VBA не запутается.
Код нескольких пользовательских функций в модуле
Примечание. Редактор Visual Basic для облегчения визуального развития местоположения функций в модуле создает между ними разделительные линии. Для того чтобы эти разделительные линии отображались на экране, выберите команду Tools - Options. На экране отобразится диалоговое окно Options. На вкладке Editor в группе Window Settings установите флажок Procedure Separator.
Расчет комиссионных
Рассмотрим задачу: менеджеру по продажам необходимо разработать функцию, позволяющую рассчитывать комиссионные. Процент комиссионных зависит от объема проданного товара и начисляется по следующему правилу, представленному в таблице.
Объем продаж за неделю, руб. | Комиссионные, % |
от 0 до 9999 | 8 |
от 10000 до 19999 | 10 |
от 20000 до 39999 | 12 |
Более 40000 | 14 |
Построим для расчета комиссионных в стандартном модуле пользовательскую функцию (листинг 7).
Листинг 7. Расчет комиссионных
Function Комиссионные1(Продажи)
If Продажи <= 9999 Then
Комиссионные1 = Продажи * 0.08
ElseIf Продажи <= 19999 Then
Комиссионные1 = Продажи * 0.1
ElseIf Продажи <= 39999 Then
Комиссионные1 = Продажи * 0.12
Else
Комиссионные1 = Продажи * 0.14
End If
End Function
Усложним задачу. Будем считать, что комиссионные зависят от ставки, занимаемой менеджером. Если он принят в постоянный штат фирмы, то комиссионные начисляются по описанному выше закону. Если же он находится на испытательном сроке, то его комиссионные составляют 75% от номинала.
Для решения этой задачи к функции Комиссионные1 надо добавить еще один аргумент – Ставка, который и идентифицирует ставку менеджера. Если менеджер находится на испытательном сроке, то значение аргумента Ставка полагается равным 0, а если он зачислен в постоянный штат, то значение аргумента Ставка полагается равным 1. Тогда, функция Комиссионные2 примет вид, представленный в листинге 8.
Листинг 8. Расчет комиссионных с учетом ставки менеджера
Function Комиссионные2(Продажи, Ставка)
Select Case Продажи
Case Is <= 9999
Оплата = Продажи * 0.08
Case Is <= 19999
Оплата = Продажи * 0.1
Case Is <= 39999
Оплата = Продажи * 0.12
Case Else
Оплата = Продажи * 0.14
End Select
If Ставка = 0 Then
Комиссионные2 = 0.75 * Оплата
Else
Комиссионные2 = Оплата
End If
End Function
1 Здесь и далее, если не указана денежная единица, то имеются в виду некие условные единицы.