Продолжаем осваивать Access 2003, и пришло время поговорить о написании собственных функций на VBA. Мы рассмотрим немного теории, т.е. где создаются эти функции, для чего их пишут, а также как обычно попрактикуемся в этом, в принципе не сложном, деле.
Тему программирования на VBA Access 2003 мы уже немного затрагивали, например, рассматривали встроенные функции и если говорить вообще об Access 2003, то тут мы тоже преуспели, например, освоили группировку данных в отчете.
А сегодня, приступим к более интересной, как мне кажется, теме это написание своих функций на языке VBA.
Что такое пользовательские функции VBA и зачем их пишут
Это функции, которые пишет сам программист для упрощения остального кода программы.
Что здесь понимается под упрощением, и для чего вообще нужно писать такие функции, я решил объяснить по пунктам, так как это будет более понятно для начинающих, да и просто для восприятия:
- И в первом пункте сразу хотелось бы отметить это значительное сокращение кода. Например, Вам часто нужно выполнять какие-либо действия, код которых занимает, скажем, 10-20 и более строк, и вот представите, что Вы данный код будете повторять 2-3-10… раз в своем основном коде программы, другими словами количество строк основного кода возрастет в разы, а чем это грозит, рассмотрим во втором пункте;
- Если у Вас код очень большой, то его будет трудно в дальнейшем редактировать и к тому же если у Вас есть повторяющейся код, то тогда придется искать его и исправлять код во всех местах, что согласитесь первое, это очень нудно, а второе Вы можете просто забыть изменить код в каком-нибудь месте и программа не будет работать или что еще хуже, будет работать, но не правильно, за что Вас конечно начальство не похвалит;
- Про сокращение кода мы сказали, но также мы делаем его более наглядным и понятным. Другими словами, когда в коде мы встретим вызов той или иной функции, мы сразу поймем, что она делает, и будем меньше тратить время на разбор и понимание всего кода, а это принесет нам выгоду, так как мы будем более оперативно вносить изменения в функционал нашей программы, а вот за это начальство может нас похвалить.
Как и у любого языка программирования и среды программирования в VBA Access есть область видимости функции, например, мы, можем написать функцию которую можно будет вызвать только в пределах одного объекта (формы или отчета) или мы можем ее написать в области видимости всего проекта, т.е. функцию можно будет вызвать из любой формы или отчета. Мы сегодня рассмотрим оба варианта, соответственно на примерах.
Примеры написания функций VBA Access
И для начала давайте определимся, что за функцию мы будем писать, т.е. что она будет делать. Я предлагаю написать в качестве простого примера функцию, которая будет принимать один параметр с типом date и возвращать строку вида «19 Июня 2014г.». Как мне кажется достаточно простой пример, но вдруг кому-нибудь пригодится.
Пишем локальную функцию VBA
Как я уже сказал ранее, есть разные области видимости функций и сейчас мы напишем своего рода локальную функцию, которую можно будет запустить только из кода того объекта, где эта функция написана.
Для реализации нашего примера давайте создадим форму, добавим на нее кнопку, клик по которой будет вызывать нашу функцию. Думаю показывать, как создать форму не стоит, так как мы это уже неоднократно делали, единственное скажу, что я форму назвал «Тестовая форма», элемент кнопка назвал «start» с подписью «Старт»
Теперь запустим редактор кода VBA, это можно сделать путем нажатия кнопки на панели инструментом «Программа»
И вставляем код нашей функции и сразу же код ее вызова, т.е. код обработки события нажатия кнопки (весь код прокомментирован):
Private Function getStrDate(dt As Date) As String 'Объявляем вспомогательные переменные Dim d As String Dim m As String Dim y As String 'Получаем день d = Day(dt) 'Получаем месяц m = Month(dt) 'Определяем, какой именно месяц Select Case m Case 1: m = "Января" Case 2: m = "Февраля" Case 3: m = "Марта" Case 4: m = "Апреля" Case 5: m = "Мая" Case 6: m = "Июня" Case 7: m = "Июля" Case 8: m = "Августа" Case 9: m = "Сентября" Case 10: m = "Октября" Case 11: m = "Ноября" Case 12: m = "Декабря" End Select 'Получаем год y = Year(dt) 'Соединяем и возвращаем результат getStrDate = d & " " & m & " " & y & "г." End Function Private Sub start_Click() 'Выводим сообщение с текстом, который вернет нам наша функция MsgBox getStrDate("19.06.2014") End Sub
В итоге у Вас должно получится следующее:
То, что это функция локальная свидетельствует слово Private перед названием функции.
Теперь все сохраняем, открываем нашу форму, жмем, старт и получаем наше сообщение:
Как видите, мы получили тот результат, который хотели, т.е. мы передавали в качестве параметра дату «19.06.2014» и получили соответствующий результат.
Пишем глобальную функцию VBA
Для того чтобы написать такую функцию создадим модуль, например «test_func» а там уже напишем нашу функцию. Для того чтобы создать модуль, открываем Access и на панели объектов выбираем «Модули» и жмем «Создать».
Затем вставляем наш код, с одним изменением, перед названием функции пишем Public, и у Вас должно получится вот такая картина:
Теперь осталось изменить код вызова нашей новой глобальной функции, для этого меняем код обработки события нажатия кнопки на нашей тестовой форме, на вот такой:
MsgBox test_func.getStrDate("19.06.2014")
Сохраняем и проверяем, результат будет таким же, но его нам вернула уже совсем другая функция.
Как видите, все нет так уж и сложно, функция конечно простая, но Вы можете писать функции для собственных нужд, которые будут более сложными. Я всем советую весь повторяющийся код выносить в функции, так как это будет намного лучше, как для работы с этим кодом, так и просто для восприятия. Надеюсь, сегодняшняя статья помогла Вам разобраться с вопросом «Как написать функции на VBA Access?». Удачи в программировании на VBA.