
Практическая работа №15.
Тема: VBA. Функции пользователя.
Немного теории.
Также как и макросы, функции пользователя являются эффективным инструментом при работе с данными в электронных таблицах. Главное отличие функций пользователя от макросов в том, что функцией в качестве результата возвращается значение (например, текстовое или числовое). С точки зрения создания функций пользователя (по сравнению с макросом) особой разницы нет. Однако функцию нельзя записать как макрос в окне приложения Excel.
Пример 1.
Создание функции в редакторе VBA.
Для того, чтобы добавить в проект новую функции. Пользователя, следует предварительно выбрать объект (модуль, лист, книга) в который эта функция будет добавляться. Удобно записывать функции в отдельный модуль. В любом случае, для автоматической вставки инструкций начала и окончания функции в окне редактора VBA выбирают команду Insert → Procedure (см. рис. 1):
Рис. 1. Вставка процедуры или функции в модуль проекта.
Рис. 2. Вид диалогового окна настроек параметров процедур и функций.
После чего откроется диалоговое окно Add Procedure (рис. 2), где в поле Name введите SumProd (для нашего случая), переключатель Type установите в положение Function (создание функций), остальные элементы оставьте как есть (переключатель Scope – в положении Public для доступности функции, возле опции All Local variables as Statics – флажок не ставить, для того чтобы можно было переходить в режим локальных статических переменных).
В результате в модуль добавляется конструкция, состоящая из инструкций начала и окончания функции пользователя. В них присутствует ключевое слово Function (вместо Sub для процедур) и указано название функции, см. рис. 3.
Между инструкциями начала и окончания функции вводится программный код, определяющий алгоритм её вычисления. Как правило, в скобках после названия функции указываются также и ее аргументы.
В качестве примера создадим очень простую функцию, которая имеет два значения аргумента, а в качестве значения функции будет возвращаться сумма этих аргументов, если первый аргумент меньше второго, и произведение аргументов, если указанное условие не выполняется. Наиболее простой вариант программного кода функции (с указанием типа аргументов) в окне редактора VBA см. в листинге 1:
Рис. 3. Вид диалогового окна модуля проекта с инструкциями начала и окончания программного кода функции.
Листинг 1. Программный код функции SumProd ( )
Public Function SumProd (x As Integer, y As Integer)
Dim s As Integer
If x < y Then s = x + y Else s = x * y
SumProd = s
End Function
Здесь основу функции составляет однострочный условный оператор If, который проверяет условие x < y (переменные x и y указаны в качестве аргументов функции). Если условие выполнено, то локальной переменной s присваивается значение, равное сумме аргументов функции (инструкция s = x + y после ключевого слова Then). В противном случае эта переменная равна произведению аргументов (инструкция s = x * y после ключевого слова Else). Инструкцией SumProd = s значение локальной переменной возвращается как значение функции.
Проверим работу функции.
Для этого:
1) Запустите программу MS Excel и выполните команду: Разработчик → Код → Visual Basic. Если вы хотите, чтобы окно Project – VBA Project и окно Properties располагались отдельно друг от друга, в окне MS Visual Basic выполните команду: Window → Cascade.
2) Вставьте в проект модуль с помощью команды: Insert → Module. Далее выполните команду: Insert → Procedure.
В диалоговом окне Add Procedure установите опции как на рис. 2. В результате в модуль добавилась конструкция, состоящая из начала и окончания функции пользователя (см. рис. 3).
3) Введите программный код функции SumProd (x,y) как указано в листинге 1. Вид окна модуля проекта после выполнения указанных действий см. рис. 4. Откомпилируйте код функции, выполнив команду: Debug → Compile VBAProject.
4)
Проверим работу функции. Перейдите в
окно рабочего документа Excel
(нажмите пиктограмму
в левом верхнем углу окна MS
Visual
Basic).
В ячейки B4:B5
введите целочисленные значения для
аргументов функции, а в ячейку E6
введите формулу: =
SumProd
(B4;B5).
Причем при вводе функции появляется
как обычно подсказка, и в списке доступных
функций есть также и созданная нами
функция пользователя, см. рис. 5.
5) В ячейку Е4 введите формулу: = В4 + В5 для вычисления суммы аргументов, а в ячейку Е5 введите формулу: = В4*В5 для вычисления произведения аргументов. В ячейку В6 введите формулу: = ЕСЛИ(В4<B5;”Да”;”Нет”), которая проверяет условие того, что первый аргумент (ячейка В4) меньше второго аргумента (ячейка В5). Если условие выполнено, возвращается значение Да, в противном случае - значение Нет. Вид окна документа с представленными результатами вычислений, см. рис. 6.
При значении аргументов 1 и 2 вычисляется их сумма. Если первый аргумент существенно увеличить (в ячейку В4 введите, например, число 5), получается произведение двух чисел, см. рис. 7.
Рис. 4. Окно редактора VBA c программным кодом функции SumProd.
Рис. 5. При вводе функции в контекстной справке приведена и функция пользователя.
Рис. 6. Результат вычислений с использованием созданной функции SumProd.
Рис. 7. Результат вычислений с использованием созданной функции SumProd после изменении аргументов функции (значение аргументов также изменилось).
Понятно, что определить такого рода функцию можно и без применения возможностей VBA. Тем не менее, иногда бывает удобно определить специальную функцию пользователя, нежели каждый раз вводить громоздкие формулы.
Пример 2.
Вычисление факториала.
По
определению, факториал – это произведение
чисел от 1 до заданного числа включительно:
n!
= 1·2·3…·n,
где n
> 0,
.
По определению: 0!
= 1.
Например, при n
= 4,
n!
= 1·2·3·4 = 24.
В
виде реккурентной формулы n
факториал
запишется в виде:
.
Вычислять факториал можно разными
способами. Рассмотрим два из них: 1) с
использованием оператора цикла; 2)
рекурсивный вызов функции.
Примечание 1: следует отметить, что в Excel есть встроенная функция ФАКТР( ) для вычисления факториалов. Вычисляемые на основе функций пользователя значения будем сравнивать с теми, что вычислены на основе использования функции ФАКТР( ).
В функции пользователя Fact1( ) факториал числа-аргумента функции вычисляется последовательным перемножением натуральных чисел в операторе цикла. Программный код функции Fact1( ) приведен в листинге 2: