Visual Basic for Applications (VBA) – это событийно-ориентированный язык программирования и часть семейства средств разработки Visual Basic. Хотя VBA можно рассматривать как находящуюся ниже розничной версии VB и выше VBScript в иерархии VB, на самом деле VBA является важным элементом розничной версии VB, обеспечивая подавляющее большинство языковых элементов, используемых в VB. При размещении в VB VBA обеспечивает языковую поддержку и интерфейс для форм, элементов управления, объектов, модулей и технологий доступа к данным. При размещении в других приложениях, таких как Word или Excel, VBA, используя технологию, называемую автоматизацией, обеспечивает средства взаимодействия и доступа к объектной модели основного приложения, а также к объектным моделям других приложений и компонентов.
Для того чтобы настраивать сложные приложения, такие как Excel, Word, Access и все большее число других приложений от Microsoft и других поставщиков, VBA позволяет разработчику предоставлять решения, использующие преимущества сложных компонентов, которые были опробованы и протестированы. VBA – это клейкий язык: язык, который взаимодействует с различными объектами, составляющими приложение, через объектную модель хост-приложения. VBA - это средство, с помощью которого приложения могут стать расширяемыми, а ActiveX (или OLE-автоматизация) обеспечивает интерфейс между VBA и его хост-приложением. Именно эта поддержка автоматизации OLE делает VBA выдающимся инструментом для быстрой разработки надежных приложений Windows.
Основные возможности и назначение VBA
VBA имеет все функции и операторы, необходимые для создания надежных приложений Windows, независимо от того, выполняются ли они с помощью Visual Basic или хост-приложения. Задачи, которые вы можете выполнять с помощью VBA, включают (но не ограничиваются ими):
- Создание экземпляров объектов OLE (ActiveX) в вашем коде;
- Создание классов (многократно используемые пользовательские программные объекты);
- Связывание с базами данных ODBC, такими как Access и SQL Server;
- Интеграция с API обмена сообщениями (MAPI) для создания приложений Exchange/Mail;
- Интеграция с интернет и интранет-решениями;
- Создание пользовательских диалоговых окон и форм;
- Хранение и получение данных из реестра Windows;
- Обнаружение и устранение ошибок;
- Включение элементов управления ActiveX в интерфейс приложения;
- Передача данных между приложениями с поддержкой VBA с минимумом программирования и суеты;
- Управление вторым приложением с поддержкой VBA из первого приложения с поддержкой VBA;
- Управление приложениями Office; теоретически, 100% функциональности продуктов Office предоставляется в виде объектов, свойств и методов. То есть все, что вы можете сделать с помощью интерфейса приложения, можно сделать и программным образом;
- Автоматизация всего, что можно сделать с помощью клавиатуры, мыши или меню.
Есть также одна вещь, которую вы не можете сделать напрямую с языком VBA: вы не можете выводить данные на принтер. Итак, как вы печатаете из приложения VBA? При размещении в стороннем приложении VBA может управлять собственными функциями печати приложения; при использовании в VB VBA может управлять объектом VB Printer.
Объектные модели
VBA – это отдельный язык, хотя при сравнении кода, взятого из программы VBA, написанной для Word, с программой, написанной для Access или Visual Basic, вы могли бы подумать, что читаете код с двух совершенно разных языков. Это связано с тем, что VBA взаимодействует с объектной моделью приложения, и большую часть времени код, который вы пишете, ссылается на объекты, уникальные для хост-приложения. Чтобы продемонстрировать это, во фрагментах кода VBA, показанных в примере ниже, общий код VBA показан обычной разметкой, объектный код, уникальный для приложения, выделен жирным шрифтом, а переменные – курсивом.
Фрагмент кода из программы Excel VBA:
Как видно из этого примера, ссылочная объектная модель играет важную роль в создании программ на основе VBA. Объектная модель описывает приложение и функции, которыми вы можете управлять. Затем вы используете VBA для доступа и изменения свойств объектной модели, обработки событий, инициируемых объектами в модели, и вызова методов объектов.
Программная структура
В своей простейшей форме Visual Basic для приложений – это язык склеивания. Это означает, что как разработчик VB или VBA вы концентрируетесь на интерфейсе и взаимодействии между объектами и элементами управления в приложении, склеивая различные элементы приложения, записывая процедуры для выполнения программных задач и добавляя код для обработки событий. Программы Visual Basic в основном ориентированы на события (например, пользователь, нажимая кнопку, запускает большинство процедур, которые вы напишете).
С точки зрения разработчика, одна из наиболее важных характеристик приложения, управляемого событиями, заключается в том, что по большей части различные элементы программы не являются взаимозависимыми. Разделы вашей программы могут быть написаны в полной изоляции от остальных. Процедуры могут быть добавлены, удалены или отключены, не обязательно оказывая неблагоприятного воздействия на все приложение. Это не означает, что приложение Visual Basic не структурировано; отнюдь не так. Прежде чем приступить к написанию вашего VB-приложения, у вас должен быть четкий план взаимодействия различных элементов вашего будущего приложения.
За последние несколько лет разработчики VB получили возможность быстро расширяющейся среды разработки, которая теперь может создавать настраиваемые элементы управления, а также DLL-библиотеки ActiveX и EXE-файлы, которые выполняются либо как клиентские серверы, либо как удаленные серверы.
Устройство VB-программ
Любая программа на VB, будь то размещенное приложение VBA или исполняемый файл VB, представляет собой набор модулей, содержащих код, объекты графического интерфейса пользователя и классы. Эта статья концентрируется на языковых элементах VBA, поскольку они касаются как размещенного VBA, так и розничной версии VB. Пользовательские интерфейсы VBA и VB (будь то Word, Excel, Project или форма VB) все события запуска, которые обрабатываются кодом, создаются с использованием языка VBA. Поэтому модули кода в вашей программе представляют наибольший интерес.
Код Visual Basic можно разделить на три категории:
- Код, который вы пишете для обработки таких событий, как нажатие пользователем кнопки; эти процедуры называются обработчиками событий.
- Пользовательские процедуры, где вы создаете основной функционал вашего приложения.
- Процедуры свойств, используемые в модулях формы и класса.
Все элементы языка Visual Basic работают одинаково хорошо во всех трех типах процедур. Например, нет никаких ограничений на тип кода, который вы можете написать в рамках определенного типа процедуры. Вам, как разработчику, решать, куда и как идти.
Использование обработчиков событий для вызова функций и методов
Мы бы порекомендовали вам сохранить код в ваших обработчиках событий до абсолютного минимума, используя их просто для вызова методов внутри класса или для вызова функций в проекте. Вы обнаружите, что вашему коду становится легче следовать, его повторное использование максимально увеличено, а время обслуживания проекта сокращено.
Следующее событие Click от командной кнопки с именем cmdSave демонстрирует этот минималистский подход к обработке событий:
Поскольку весь код для фактического сохранения сведений содержится в функции SaveDetails, эту функцию можно вызывать из любой точки формы или проекта.
Объявление переменных и констант
VBA поддерживает стандартный тип данных, а это означает, что, в отличие от многих других языков программирования, VBA допускает неявное объявление переменных. Как только вы используете имя переменной или константы в своем коде, VBA выполняет всю необходимую работу по выделению пространства памяти и т. д. И переменная уже считается объявленной.
Тем не менее, хорошей практикой программирования (и она сэкономит вам бесконечные часы сожалений) станет явное объявление любых переменных и констант, которые вы хотите использовать, при помощи операторов Dim, Private или Public. Их синтаксис:
Если вам нужно объявить несколько переменных, вы можете сделать это в одной строке, разделив их запятыми, как в следующем выражении Dim:
Путем явного объявления переменных таким образом вы можете уменьшить количество ошибок в коде, вызванных орфографическими ошибками (наверное, наиболее распространенные из ошибок программирования). После объявления имя переменной становится доступным в раскрывающемся списке завершения оператора IntelliSense. А это значит, что вы никогда не должны иметь переменную с ошибкой!
Массивы
Создание массива называется определением массива (dimensioning the array – то есть определением его размера). Отдельные элементы данных в массиве называются элементами, а число, используемое для доступа к элементу, называется индексом. Самые низкие и самые высокие номера индекса известны как границы (bounds или boundaries). В VBA существует четыре типа массивов: фиксированные или динамические, а также одномерные или многомерные.
К примеру, если говорить о фиксированных массивах, то: большую часть времени мы заранее знаем, сколько значений нам нужно сохранить в массиве. Поэтому мы можем измерить его до подходящего размера или количества элементов, прежде чем получить к нему доступ, используя оператор Dim, подобный следующему:
Эта строка кода создает массив myArray с шестью элементами. Почему шесть? Все массивы VBA начинаются с местоположения 0, поэтому этот оператор Dim создает массив, расположение которого варьируется от myArray (0) до myArray (5).
Динамические же используются тогда, когда у нас нет предварительных знаний об этом, и нам нужен способ расширить наш массив, если потребуется. Например, одно удобное использование массива состоит в том, чтобы хранить ввод от пользователя и позволять пользователю вводить столько элементов данных, сколько он или она хочет. Поэтому наше приложение не может знать, как заранее определить размеры массива. Мы можем справиться с этой ситуацией, объявив и используя динамический массив. Динамические массивы позволяют увеличивать количество элементов массива с помощью оператора ReDim, чтобы изменить размер массива во время работы программы.