Смекни!
smekni.com

Пользовательские функции рабочего листа Visual Basic (стр. 2 из 2)

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 Здесь и далее, если не указана денежная единица, то имеются в виду некие условные единицы.