Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Создание пользовательских п ÒÉÌÏÖÅÎÉÊ ÓÒÅÄÓÔÁÍ...doc
Скачиваний:
6
Добавлен:
18.11.2019
Размер:
2.02 Mб
Скачать

Возврат значения функции

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

function name=expression

Если значение явно не присваивается, то оно устанавливается по умолчанию в соответствии с типом возвращаемого значения: 0 – для числовых типов, строку нулевой длины для строковых переменных, Empty для типа Variant и Nothing для ссылок на объекты.

Замечание

Если тип возвращаемого функцией значения зависит от обстоятельств, то используйте для возвращаемого значения тип Variant.

Примеры

  1. Функция переводит температуру, заданную в шкале Цельсия, в шкалу Фаренгейта.

Function far(t as single)

far = 1.8 * t + 32

End Function

Оператор MsgBox far(37) высветит значение 98.6 по Фаренгейту, которое эквивалентно 37 градусам по Цельсию.
  1. Функция возвращает количество выделенных ячеек, если тип выделения объект Range. Если выделен объект другого типа, например, встроенная диаграмма, то возвращаемое значение – символьная строка с сообщением о некорректности выделения.

Function ReturnCount() As Variant

If TypeName(Selection) = "Range" Then

ReturnCount = Selection.Count 'количество выделенных ячеек

Else

ReturnCount = "Некорректное выделение"

End If

End Function

Public Sub type_selection()

Range("A1:C5").Select

Range("D1") = ReturnCount

Worksheets("Лист4").Shapes(Worksheets("Лист4").Shapes.Count).Select

'выделен последний графический объект на листе Лист4

Range("D2") = ReturnCount

End Sub

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

В вызывающей процедуре вычисленное функцией значение сохраняется на активном листе в ячейках D1 (количество ячеек в интервале A1:C5) и D2 (сообщение о некорректности выделения).

Использование процедур-функций на рабочем листе

Созданные пользователем функции можно использовать не только в процедурах VBA, но и на рабочем листе MS Excel как обычные встроенные функции.

При построении формулы с помощью мастера функций пользовательские функции можно найти в категории Определенные пользователем (User Defined).

Пример

Создать функцию расчета выплат, учитывая, что налог составляет 13% и, если зарплата превышает 300 $, то в страховой фонд дополнительно взимается 5%.

Function salary_em_(ByVal ho As Long, ByVal ra As Long) As Double

Dim Fund As Long

salary_em = ho * ra

If salary_em > 300 Then

Fund = salary_em * 0.05

End If

salary_em = salary_em – Fund – salary_em*0.13

End Function

В рассмотренной выше вызывающей процедуре salary_employee вместо оператора вызова процедуры salary_em_proc io, h, r можно записать оператор, распечатывающий рассчитанную выплату как MsgBox io & " salary " & salary_em(h, r).

Функцию salary_em можно использовать как в процедурах VBA, так и на рабочем листе как пользовательскую функцию.

На рисунке в ячейку E3 введены отработанные часы, а в ячейку F3 – ставка оплаты за час. В ячейке G3 рассчитана выплата по формуле =salary_em(E3;F3).

внимание

  • Разделитель между аргументами при записи функций в ячейках рабочего листа русифицированной версии MS Excel – точка с запятой (;), тогда как в процедурах VBA это всегда запятая (,).

ЗамечаниЕ

  • Не рекомендуется включать в пользовательские функции операторы, выполняющие какие-либо действия с объектами таблиц, так как при использовании функции на рабочем листе может возникнуть ошибка.

Для действий с объектами таблиц применяйте вызываемые процедуры.