Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual Basic.doc
Скачиваний:
24
Добавлен:
21.02.2016
Размер:
15.63 Mб
Скачать

7.3 Створення функцій користувача

Можливості мови VBA зручно використовувати для створення функцій, які автоматизують розрахунки і не належать до комплекту стандартних функцій Microsoft Excel. Наприклад, можна самостійно розробити функцію для розрахунку суми реалізації товару клієнту з урахуванням кількості проданих товарів, знижки постійним клієнтам і інших факторів. Звернутися до такої функції можна буде за допомогою майстра функцій Microsoft Excel, після визначення всіх необхідних аргументів, за допомогою функції, що створено засобами VBA, можна буде отримати потрібний результат.

Для створення нової функції потрібно:

  • активізувати вікно редактору VBA;

  • додати до проекту новий модуль командою меню InsertModule (зверніть увагу на те, що до дерева елементів проекту буде додано нову гілку Modules, до якої додаються модулі проекту – у нашому випадку Module1);

  • у вікні коду модуля слід ввести нову функцію.

Функції у VBA створюються як і в середовищі Visual Basic 6.0. Створення функції може починатися із визначення статусу функції, далі повинно слідувати зарезервоване слово Function після якого визначається ім’я функції та у круглих дужках список аргументів функції. Після списку аргументів може бути визначено тип значення, яке повертає функція. Параметрами функції є дані, які визначатимуться як аргументи функції. Це можуть бути адреси чарунок, числа, блоки чарунок. Синтаксис функцій такий:

[Public | Private ] Function <ім’я функції> [(список аргументів)] [As тип]

[оператори] [ім’я функції = вираз]

End Function

Необов’язковий параметр Public дає можливість застосовувати функцію для всіх модулів, використовувати функцію при роботі з іншими робочими книгами при умові, що книгу, у проекті якої створено функцію, розчинено. Необов’язковий параметр Private обмежує застосування функції лише процедурами одного і того ж модуля.

Обов’язковим параметром є ім’я функції, після імені визначається список аргументів. У списку аргументів параметри функції відокремлюються комами, можуть зазначатися лише іменами, а можна визначати імена аргументів і їх типи (наприклад, X As Integer).

Необов’язковий параметр [As тип] визначає тип значення, яке повертає функція (Integer, String, Byte або ін.). Якщо даний параметр пропущено, то функція повертає значення типу Variant. Обов’язково в середині функції привласнити імені функції значення, яке вона повинна повертати.

При розробці функції можна застосовувати оператори привласнення, умовний оператор If, оператор циклу For . . . Next, інші оператори мови Visual Basic Після створення функції можна активізувати робочу книгу Microsoft Excel і за допомогою майстра функцій помістити у будь-яку чарунку формулу із застосуванням нової функції. Створену таким способом функцію буде віднесено до категорії функцій Определенные пользователем.

Розглянемо простий приклад створення функції користувача, у якій аргументом функції є адреса чарунки. Наприклад, потрібно розробити функцію, за допомогою якої можна прискорити розрахунок прибуткового податку, який вираховується із заробітної плати співробітників. Прибутковий податок обчислюється так:

якщо нарахована заробітна плата менш або рівно 17 грн. (мінімум, що не оподатковується), то прибутковий податок не сплачується;

якщо нарахована заробітна плата менш або рівно 85 грн., то від суми, що перевищує 17 грн., сплачується 10% як прибутковий податок;

якщо нарахована заробітна плата менш або рівно 170 грн., то від суми, що перевищує 85 грн., сплачується 15% плюс податок від 85 грн. як прибутковий податок;

якщо нарахована заробітна плата більше 170 грн., то від суми, що перевищує 170 грн., сплачується 20% податок від 170 грн. як прибутковий податок.

Для створення функції потрібно завантажити табличний процесор Excel, перейти до редактору VBA (команда меню СервисМакросРедактор Visual Basic), виконати команду меню InsertModule для додавання до проекту нового модуля, у вікні коду модуля ввести код функції:

Function ПРИБПОД(x)

If x <= 17 Then

n = 0

Else

If x <= 85 Then

n = (x - 17) * 0.1

Else

If x <= 170 Then

n = (x - 85) * 0.15 + 6.8

Else

n = (x - 170) * 0.2 + 19.55

End If

End If

End If

ПРИБПОД = n

End Function

Функція має ім’я ПРИБПОД, приймає для обробки значення одного аргументу, яке поміщається в змінну х. У тілі функції здійснюється аналіз значення змінної х: якщо х менше або рівно 17, то змінній n привласнюється значення 0, інакше якщо х менше або рівно 85, то змінній n привласнюється значення (x - 17) * 0.1 – 10% від нарахованої заробітної плати мінус 17, інакше якщо х менше або рівно 170, то змінній n привласнюється значення (x - 85) * 0.15 + 6.8, інакше змінна n дорівнюватиме (x - 170) * 0.2 + 19.55 – податок з суми, що перевищує 170 грн. Далі імені функції привласнюється значення змінної n – значення, яке відповідає суму розрахованого прибуткового податку.

Після створення функції можна перейти у вікно поточної робочої книги і за допомогою майстра функції створити формулу із застосуванням щойно створеної функції. Функцію можна обрати, розчинивши категорію Определенные пользователем. Таблиця із застосуванням функції ПРИБПОД може виглядати так:

Можна також створювати функції, аргументами яких є декілька чарунок, а також діапазон чарунок.

Якщо аргументом функції є діапазон чарунок, то VBA працює з ним як з масивом, індексація елементів якого починається з 1. Щоб дізнатися скільки рядків і стовпців міститься в діапазоні можна використовувати властивості Rows і Columns, які відповідають колекції, що складається з усіх рядків або стовпців діапазону. Оскільки кожна колекція характеризується властивістю Count – кількість елементів у колекції, то визначити загальну кількість рядків, колонок у діапазоні, що є аргументом функції, не складно.

Наприклад, якщо аргументом функції є діапазон з іменем Block, то можна помістити у змінні x і y значення кількості рядків і стовпців у блоці чарунок:

x = Block.Rows.Count

y = Block.Columns.Count

Щоб звернутися до чарунки, яка є верхнім лівим кутом блоку, потрібно зазначити ім’я діапазону та індекси елементів масиву Block(1, 1), чарунка, яка є правим нижнім кутом блоку, відповідає елементові масиву Block(x, y).

Для прикладу можна створити функцію, за допомогою якої менеджер на основі даних про реалізацію товарів у поточному періоді може швидко визначити розмір знижки, яка надається конкретному покупцеві. Тим покупцям, які протягом певного періоду придбали товарів більше або рівно ніж на 10 000 грн., надається знижка у розмірі 3%. Якщо покупець придбав товарів більше або рівно ніж на 5 000 грн., він може отримати знижку у 1,5%. Якщо покупець придбав товарів менше ніж на 5 000 грн., однак здійснив більше трьох операцій по закупівлі товару, він може розраховувати на знижку в 1%. Іншим покупцям знижка не надається. Для автоматизації визначення розміру знижки даному покупцеві можна створити таку функцію:

Function Zn(Покупець, УсіПокупці, СумиРеалізації)

N = УсіПокупці.Rows.Count

s = 0

k = 0

For i = 1 To N

If УсіПокупці(i, 1) = Покупець Then

k = k + 1

s = s + СумиРеалізації(i, 1).Value

End If

Next i

If s >= 10000 Then

Zn = 3

Else

If s >= 5000 Then

Zn = 1.5

Else

If k > 3 Then

Zn = 1

Else

Zn = 0

End If

End If

End If

End Function

Прокоментуємо функцію. Функція Zn містить три аргументи:

  • Покупець – адреса чарунки, у якій міститься назва покупця, розмір знижки для якого визначається;

  • УсіПокупці – блок чарунок електронної таблиці, у якому розташовані найменування покупців, блок чарунок включає чарунки одного стовпця та декількох рядків;

  • СумиРеалізації – блок чарунок електронної таблиці, у якому розташовані суми реалізації товарів по кожній операції, блок чарунок включає чарунки одного стовпця та декількох рядків.

Оскільки блоки чарунок, які є аргументами функції, містять по одній чарунці у стовпцях і декілька чарунок у рядках, потрібно визначити лише кількість чарунок у рядку хоча б одного з блоків (блоки повинні бути пропорційного розміру). Для цієї мети використовується змінна N, якій привласнюється значення УсіПокупці.Rows.Count – загальна кількість рядків у масиві чарунок з ім’ям УсіПокупці.

Змінним s – підсумкова сума реалізації та k – кількість операцій привласнюється значення 0.

Далі виконується обробка значень усіх чарунок масивів. Індексація елементів масивів здійснюється від 1 до N. Усередині циклу якщо назва чергового елементу масиву УсіПокупці співпадає зі значенням аргументу функції Покупець, то на 1 збільшується загальна кількість операцій і накопичується значення у змінній s – підсумкова сума реалізації. При розрахунку підсумку здійснюється звернення до чергового елементу масиву СумиРеалізації, а саме до значення властивості Value елементів – уміст чарунок електронної таблиці.

Після завершення роботи циклу в залежності від значень змінних s і k привласнюється нове значення імені функції Zn, це значення функція і повертатиме.

Під час роботи з електронною таблицею можна буде звернутися до майстра функцій, обрати функцію Zn з категорії Определенные пользователем, визначити, наприклад так, аргументи функції:

На листі робочої книги дані можуть виглядати таким чином:

Для наочності створено зведену таблицю, у якій містяться дані про загальну суму реалізації та кількість операцій по кожному клієнту. Для того, щоб не визначати розміри знижок вручну у чарунках E16, Е18, Е20 створено формули із застосуванням функції Zn. Зверніть увагу на те, що після створення формули з функцією у чарунці E16 перед копіюванням її потрібно відредагувати – змінити адреси чарунок у аргументах - діапазонах на абсолютні для того, щоб під час копіювання вони не змінювалися.