Access как выполнить run vba приложение
Небольшую и несложную базу данных или приложение Access можно создать в СУБД Access без использования языков программирования SQL и Visual Basic. В СУБД Access имеется достаточно средств (различных мастеров и конструкторов) для визуального проектирования таблиц, запросов, форм и отчетов.
Для решения некоторых задач автоматизации приложений Access можно использовать макросы вместо языка программирования Visual Basic (например, при создании главной и подчиненной кнопочной формы). Но создание коммерческих баз данных в СУБД Access невозможно без применения визуального языка программирования Visual Basic и языка запросов SQL.
Для автоматизации действий над объектами в Microsoft Access и в других приложениях Microsoft Office применяются макросы и модули. Макросы - это небольшие программы на языке макрокоманд (языке сценариев). Модули - это наборы описаний и процедур на языке программирования VBА, т.е. модули - это объекты, содержащие программы на языке Visual Basic.
Основное назначение макросов и модулей — это создание удобного интерфейса приложения, в котором формы и отчеты открывались бы при нажатии кнопок в этих формах или на панелях инструментов. Модули являются более мощным средством создания программных расширений в среде Microsoft Office. Применение модулей требует от пользователей знаний основных принципов объектно-ориентированного программирования.
Программирование на VBA в СУБД Access используют в основном разработчики (программисты) в процессе создания приложений (различных баз данных), с которыми работают пользователи.
Для программирования в Access используется не приложение Visual Basic, а встроенная в Microsoft Office система программирования Visual Basic for Applications (VBA). Система программирования VBA является неотъемлемой частью приложений Microsoft Office и предназначена для визуального программирования в таких приложениях как Word, Excel, PowerPoint, Access и т.д. В VBA языком программирования является Visual Basic (VB), а инструментальная среда программирования реализована в виде редактора VB, который может активизироваться из любого приложения MS Office. Редактор Visual Basic является отдельным приложением, поэтому можно переключаться между приложениями Microsoft Office и редактором Visual Basic клавишами $Alt+F11$.
Готовые работы на аналогичную тему
Получить выполненную работу или консультацию специалиста по вашему учебному проекту Узнать стоимостьМодули
Система программирования VBA предназначена для написания кода программ модулей, которые хранят текст этих программ.
Модуль - это совокупность описаний, инструкций и процедур, сохраненных под общим именем. В Access существует два типа модулей: стандартные модули и модули класса. Основное содержание модулей — это процедуры на языке VBA.
Процедура - совокупность описаний и инструкций в модуле, которые выполняются как одна программная единица. В VBA существуют процедуры-подпрограммы Sub и процедуры- функции Function.
Стандартные модули содержат общие процедуры, которые не связаны с конкретным объектом (формой, отчетом). Стандартный модуль - это модуль, в который помещают процедуры Sub и Function, которые должны быть доступны для всех процедур в данном приложении. Стандартные модули могут использоваться другими приложениями Access, так как в общих процедурах нет ссылок на конкретные объекты данного приложения (формы, отчеты). Кроме общих процедур, в стандартных модулях могут содержаться глобальные переменные и функции, а также объекты, которые доступные из других объектов базы данных.
Модуль класса отличается от стандартного модуля тем, что, кроме процедур, он содержит описание объекта и используется для создания классов (объектов). Отдельные модули класса, расположенные на вкладке Модули окна базы данных, содержат описание класса (объекта), созданного пользователем. К модулям класса также относятся модули объектов (форм, отчетов), которые связаны с конкретными формами или отчетами и содержат процедуры обработки событий форм (отчетов) и их элементов управления.
Модуль объекта (формы, отчета) - это модуль класса, содержащий программы всех процедур обработки событий, возникающих в конкретном объекте (форме, отчете) или в его элементах управления.
Все процедуры событий для формы или отчета хранятся в модуле объекта (форме или отчете). Вновь созданная форма (отчет) не содержит модулей, но их можно создать несколькими способами. Таким образом, формы или отчеты связаны с созданными модулями объектов (форм, отчетов). Если процедура используется только формой или отчетом, то она хранится в коде формы или отчета. Если процедура используется во многих формах и отчетах, то она сохраняется в отдельном модуле.
Первый способ создания пустого модуля: выбрать Да в поле наличия модуля на вкладке Все в окне диалога Форма или Отчет (рис.1). Окно диалога вызывается командой Свойства из контекстного меню, находясь в конструкторе форм или отчетов.
Другой способ создания модуля выполняется кнопкой Программа на панели инструментов в режиме конструктора форм или отчетов. Если щелкнуть мышью на кнопке Программа, то запуститься редактор VB, в котором мы можем вводить текст программы соответствующего модуля (рис.2).
Третий способ осуществляется путем обработки некоторых событий связанных с формой или каким-либо элементом управления формы, находясь в режиме Конструктора форм или отчетов. Для этого необходимо открыть окно редактора Visual Basic, щелкнув на команду Программы в Построителе (рис.3). Построитель вызывается командой Обработка событий из контекстного меню объекта, например кнопки.
Для просмотра модулей класса, которые связаны с конкретными формами или отчетами и содержатся в модулях объектов, нужно выделить форму или отчет в окне базы данных на вкладке формы или отчеты и щелкнуть на пиктограмме Программа на панели инструментов в главном окне Microsoft Access. Чтобы создать отдельный модуль класса или стандартный модуль, нужно выбрать пункт Модуль класса или Модуль в меню Вставка. Стандартный модуль можно создать, например, путем преобразования макроса. Модули отображаются в окне базы данных на вкладке Модули. Для просмотра процедуры в стандартном модуле или в модуле класса нужно выделить требуемый модуль в окне базы данных на вкладке Модули и щелкнуть на пиктограмме Программа на панели инструментов в главном окне Microsoft Access или щелкнуть на кнопке Конструктор в окне базы данных. Откроется редактор Visual Basic, на панели редактора кода которого отображаются процедуры.
Объекты и события
В СУБД Access объектами являются таблицы, формы, запросы, окна, меню, кнопки, линии прокруток и т.д., в том числе и приложение Access. Для каждого объекта определены возможные события. Некоторые события возникают от действия пользователей (щелчков мыши, нажатия клавиш клавиатуры и др.), а другая часть событий происходят в результате свершения других событий, например открытия окна. Каждое событие проявляется в определенных действиях программы.
Вы можете использовать метод Run для выполнения указанной процедуры Microsoft Access или пользовательской функции или sub. Вариант.
Синтаксис
выражение: переменная, представляющая объект Application.
Параметры
Имя | Обязательный или необязательный | Тип данных | Описание |
---|---|---|---|
Процедура | Обязательный | String | Имя процедуры Function или Sub, которая будет запускаться. Если вы вызываете процедуру в другой базе данных, используйте имя проекта и имя процедуры, разделенные точкой в форме: "projectname. имя процедуры" |
Возвращаемое значение
Примечания
Этот метод полезен при управлении Microsoft Access из другого приложения с помощью автоматизации, ранее называемой автоматизацией OLE. Например, метод Run можно использовать из компонента ActiveX для выполнения процедуры Sub, определенной в базе данных Access.
Вы можете установить ссылку на библиотеку типа Access из любого другого компонента ActiveX и использовать объекты, методы и свойства, определенные в этой библиотеке в коде. Однако вы не можете установить ссылку на индивидуальную базу данных доступа из любого приложения, кроме Access.
Например, предположим, что вы определили процедуру с именем NewForm в базе данных с ее свойством ProjectName, задаваемым "WizCode". Процедура NewForm принимает аргумент строки. Вы можете вызвать NewForm следующим образом из Visual Basic:
Если другая процедура с тем же именем может находиться в другой базе данных, квалифицировать аргумент процедуры, как показано в предыдущем примере, с именем базы данных, в которой находится желаемая процедура.
Вы также можете использовать метод Run для вызова процедуры в ссылаемой базе данных Доступа из другой базы данных.
Пример
В следующем примере выполняется процедура Sub, определяемая пользователем, в модуле в базе данных Access из другого приложения, которое выступает в качестве компонента Active X.
Чтобы попробовать этот пример, создайте новую базу данных под названием WizCode.mdb и задайте свое свойство ProjectName WizCode. Откройте новый модуль в этой базе данных и введите следующий код. Сохраните модуль и закроите базу данных.
Вы установите ProjectName, выбрав средства > WizCode Properties из основного меню VBE.
После завершения этого шага запустите следующий код из Microsoft Excel или Visual Basic. Убедитесь, что вы добавили ссылку на библиотеку типов доступа, выбрав ссылки в меню Tools и выбрав объектную библиотеку Microsoft Access 12.0 в диалоговом окне Ссылки.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Вызов подпрограммы из кода другой процедуры Sub, расположенной в том же модуле или другом модуле одной рабочей книги (проекта VBA) осуществляется с помощью ключевого слова Call или без него по имени подпрограммы. Вызывающая процедура Sub может быть любой видимости, как Public, так и Private, а вызываемая, если расположена в том же модуле, может быть любой видимости, но если расположена в другом модуле, должна быть объявлена как Public.
Синтаксис вызова подпрограмм в пределах одной книги
[ Call ] ИмяПроцедуры [ (Аргументы) ]
- Call — необязательное ключевое слово;
- ИмяПроцедуры — обязательный компонент, имя вызываемой подпрограммы;
- Аргументы — необязательный компонент, список аргументов вызываемой процедуры Sub, разделенных запятой.
Вызов подпрограмм без аргументов в пределах одного модуля
Скобки рядом с именами вызываемых подпрограмм без аргументов не ставятся:
MsgBox "Процедура test2 (Private) вызвана с ключевым словом Call!" MsgBox "Процедура test3 (Public) вызвана без ключевого слова Call!"Вы можете скопировать приведенный код в свой модуль и посмотреть, запустив процедуру test1, как она последовательно запускает процедуры test2 и test3.
Вызов подпрограмм с аргументами в пределах одного модуля
При вызове процедур Sub с аргументами и ключевым словом Call, аргументы заключаются в скобки, без ключевого слова Call — аргументы не заключаются в скобки:
Вы можете разместить этот код в своем модуле и протестировать его.
Вызов подпрограмм из разных модулей одной книги
Правила, касающиеся использования оператора Call и заключения аргументов в скобки, верны и для вызова процедур Sub, находящихся в разных модулях. Единственным отличием является необходимость вместе с именем вызываемой подпрограммы указывать место ее расположения. Место расположения и имя подпрограммы разделяются точкой.
Вызываемая подпрограмма расположена в Стандартном модуле
- ИмяМодуля — уникальное имя стандартного модуля, отображаемое в проводнике проекта VBA.
Неуникальное имя процедуры возникает, когда создаются процедуры с одним именем в разных модулях. Если есть вероятность дублирования в дальнейшем имени подпрограммы и лишения ее уникальности, то лучше сразу вызывать ее с указанием имени стандартного модуля.
Вызываемая подпрограмма расположена в модуле книги, модуле листа, модуле формы
- ЭтаКнига — так и пишется, указывает на текущую книгу в которой расположены вызывающая и вызываемая подпрограммы.
- ИмяЛиста — уникальное имя листа, которое в проводнике проекта VBA указано без скобок (по умолчанию: Лист1, Лист2, Лист3 и т.д.).
- Имя ярлычка листа — дублирующее имя листа, которое в проводнике проекта VBA указано в скобках.
- ИмяФормы — уникальное имя пользовательской формы, отображаемое в проводнике проекта VBA.
Вызов процедур Sub из модулей разных книг
- ИмяКниги!ИмяМодуля.ИмяПроцедуры — обязательный компонент, полный адрес подпрограммы, заключен в двойные кавычки.
- ИмяКниги — имя рабочей книги Excel с расширением, в которой находится вызываемая подпрограмма, если имя содержит пробелы, оно заключается в одинарные кавычки — апострофы (‘Имя Книги’).
- ИмяМодуля — имя модуля для стандартного модуля (для уникальных имен вызываемых подпрограмм может не указываться), имя листа для модуля листа, словосочетание «ЭтаКнига» (без кавычек) для модуля книги.
- ИмяПроцедуры — имя вызываемой процедуры Sub.
- Арг1, Арг2, …, Арг30 — необязательные компоненты, аргументы вызываемой подпрограммы, максимальное количество которых ограничено 30 элементами.
Полный адрес вызываемой процедуры заключен в двойные кавычки, отделен от аргументов и аргументы друг от друга запятыми.
Полный адрес вызываемой процедуры
Может показаться сложным составить полный адрес вызываемой подпрограммы, но на самом деле все очень просто — Excel уже сделал это за нас.
Список макросов во всех открытых книгах
2. Найдите в списке вызываемую подпрограмму и кликните по ней. Ее полный адрес отобразится в поле «Имя макроса».
Один нюанс: в окне «Макрос» не отображаются процедуры с аргументами. Чтобы отобразить такую процедуру, закомментируйте аргументы, а после копирования и вставки раскомментируйте их.
Стоит не забывать о том, что если книга с вызываемой подпрограммой будет переименована, то полное имя вызываемой процедуры Sub изменится и везде, где оно присутствует в коде, его необходимо будет отредактировать.
Пример вызова подпрограмм из другой книги
Допустим, у нас есть рабочая книга Excel под именем «Книга1.xlsm» (или «Книга1.xls» в ранних версиях программы). В ней находятся вызываемые из другой книги процедуры Sub, перечисленные ниже.
В стандартном модуле «Module1»:
В модуле листа «Лист1»:
В модуле книги «ЭтаКнига»:
Для последовательного запуска этих подпрограмм можно вставить в любой модуль другой книги Excel следующую процедуру:
Application . Run "Книга1.xlsm!ЭтаКнига.Vyzov3" , 555 , 445Во второй строке кода пропущено имя стандартного модуля, так как имя подпрограммы оказалось уникальным, а в следующей строке этот же код продублирован, для примера, с именем модуля. В пятой строке — пример запуска процедуры Sub с двумя аргументами.
И еще раз напомню, что имя книги с пробелами заключается в одинарные кавычки (апострофы):
Если у вас есть процедуры, которые часто вызываются из других книг, поместите их в Личную книгу макросов, и они всегда будут доступны.
Заключение
В этой статье не рассмотрено добавление ссылок из одного проекта VBA на другой, которые позволяют работать с модулями и процедурами, находящимися в другом проекте так, как с находящимися в текущем. Причем книга, с которой установлена связь, может быть закрыта. Я предпочитаю работать с Личной книгой макросов, а при попытке, из любопытства, установить связь между двумя книгами, программа Excel, почему-то, отказала мне в этом и эксперименты закончились.
Если хотите поэкспериментировать со связанными книгами, откройте проект VBA, из которого надо установить связь с другой книгой, и выберите в главном меню «Tools» — «References…». В открывшемся окне «References — VBAProject» все открытые книги будут отображены одним словом — «VBAProject». Выделяйте по очереди строки с этим словом и внизу, в информационной рамке, смотрите, какой книге этот проект принадлежит. Поставьте галочку рядом с выбранным проектом и нажмите кнопку «OK». Если книга, с проектом которой устанавливается связь, закрыта, ее не будет в списке. В этом случае, нажмите на кнопку «Browse…», найдите, выбрав расширение, нужную книгу и откройте ее в проводнике. Связь будет установлена, и процедуры из связанных книг будут вызываться по имени с ключевым словом Call или без него, как будто они расположены в одной книге.
Объектная модель Access по своей архитектуре сильно отличается от объектных моделей Word и Excel. Возможно, это объясняется тем, что Access — не "родной", как Word и Excel, а приобретенный продукт третьей фирмы.
Один из немногих моментов, в котором программирование в Access похоже на программирование в Word и Excel — это наличие объекта Application, который находится на вершине иерархии объектной модели Access. Он точно так же может использоваться для программного запуска Access из других приложений, и его свойства и методы доступны из любой части кода. Запуск Access из другого приложения может выглядеть так:
Dim appAccess As Object
Set appAccess = CreateObject("Access.Application")
Можно программно запускать Access еще множеством разных способов — через объектную модель Windows Explorer, через командный интерпретатор операционной системы (в этом случае можно использовать интересные параметры командной строки Access — см. доп. материалы на компакт-диске), через текстовый ярлык *.mad, через API и т.п.
На практике программным образом запускать Access приходится достаточно редко — поскольку обычно удобнее всего оболочку приложения, запускающего Word, Excel и т.п. делать именно в Access. Открывать Access для доступа к данным базы данных в файле MDB не рекомендуется — для этой цели лучше использовать объекты ADO, более простые и удобные и менее ресурсоемкие.
Теперь — о свойствах и методах объекта Application. Как можно убедиться, их набор в Access мало похож на соответствующий набор в Word и Excel. Вначале — о наиболее важных свойствах:
- AutomationSecurity — позволяет определить уровень безопасности при открытии базы данных. По умолчанию используется значение msoAutomationSecurityByUI — использовать то, что настроено на графическом экране через меню Макрос -> Безопасность. Можно вообще запретить открытие файлов баз данных с макросами ( msoAutomationSecurityForceDisable), но чаще используется значение msoAutomationSecurityLow, которое позволяет открыть файл данных без лишних вопросов;
- BrokenReference — возможность проверить, есть ли разорванные ссылки (когда ваше приложение не может найти модуль dll или другую базу данных). Наличие конкретной ссылки можно проверить при помощи объекта Reference;
- CodeContextObject — очень полезное свойство, которое позволяет определить, из какого объекта базы данных (формы, отчета и т.п.) был запущен модуль/макрос. Это свойство можно, например, использовать для обнаружения источника ошибок;
- CodeData — еще одно важнейшее свойство. Оно позволяет получить доступ к коллекциям AllDatabaseDiagrams, AllFunctions, AllQueries, AllStoredProcedures, AllTables и AllViews. Правда, в этих коллекциях находятся одни и те же объекты AccessObject. Возможностей у них на первый взгляд не так много, но на самом деле при помощи этого объекта мы получаем возможность настраивать десятки свойств для таблиц, запросов, диаграмм и других объектов базы данных Excel. Пример применения свойства CodeData для получения информации о всех таблицах в базе данных может выглядеть так:
For Each oTable In CodeData.AllTables
- CodeProject — используется для тех же целей , что и CodeData , но предоставляет доступ к коллекциям программных модулей AllForms, AllReports, AllMacros, AllModules и AllDataAccessPages.
- свойство CommandBars возвращает коллекцию объектов CommandBar — то есть панелей инструментов Access. Эту коллекцию можно использовать для настройки пользовательского интерфейса приложения, построенного на основе Access.
- CurrentData действует аналогично CodeData и CodeProject. Это свойство позволяет получать доступ к тем же коллекциям, включая полученные с внешнего источника данных (SQL Server). Аналогично работает свойство CurrentProject.
- свойства CurrentObjectName и CurrentObjectType позволяют определить, какой объект на момент запуска процедуры находился в фокусе (из какого объекта был вызван данный код). Эти свойства, конечно, удобно использовать для проверок, когда один и тот же код может быть вызван разными способами. При этом свойство CurrentObjectType ведет себя несколько неожиданно. Оно возвращает значение из перечисления в обычных ситуациях, но если вызвавшего объекта уже нет (объектная ссылка установлена в Nothing) или информацию о нем получить не удалось, это свойство почему-то возвращает True.
- свойство DataAccessPages позволяет получить ссылку на одноименную коллекцию, в которой находятся объекты всех Web-форм базы данных (они называются страницами доступа к данным) — объектов DataAccessPage.
- свойство DBEngine позволяет получить ссылку на объект DBEngine, при помощи которого можно просмотреть или настроить свойства ядра Jet, на котором работает Access. Например, при помощи этого свойства можно сжать базу данных, настроить для нее пароль, определить используемую кодировку и т.п.
- свойство DoCmd позволяет получить доступ к еще одному очень важному объекту — DoCmd, при помощи которого можно выполнить множество важных операций. Фактически этот объект — основная "рабочая лошадка" Access с точки зрения VBA. Он будет рассмотрен в отдельном разделе. Сам объект DoCmd создавать нет необходимости — он и так всегда доступен через свойство объекта Application, например:
- свойство Forms позволяет вернуть ссылку на коллекцию объектов Form. От уже рассмотренной коллекции AllForms эта коллекция отличается двумя моментами:
- в ней находятся только открытые в настоящий момент формы;
- в ней находятся не объекты AccessObject, а объекты Form с гораздо богатым набором свойств и методов.
Методов у объекта Application также очень много (плюс часть методов достаточно искусственно перенесена в объект DoCmd). Ниже представлены самые важные из них:
- AccessError() — очень важное свойство для обработки ошибок. Оно позволяет получить описание тех ошибок, для которых стандартное Err.Description возвращает "Application-defined or object-defined error" — ошибок библиотек Access и DAO.
- метод BuildCriteria() позволяет очень быстро и удобно сконструировать критерий отбора записей, который может применяться в SQL-запросах, фильтрах для формы и отчетов, и т.п. Возвращает правильно сконструированное строковое значение.
- CloseCurrentDatabase() — возможность закрыть текущую базу данных без закрытия Access. Обычно применяется для того, чтобы затем открыть следующую базу данных без запуска нового экземпляра Access.
- CodeDb() — возвращает объект DAO.Database, представляющий базу данных, в которой в настоящее время выполняется код (обычно используется, когда у вас есть специальная библиотечная база данных с программными модулями, выполняющими различные операции с другими базами данных). Ссылку на такой же объект для текущей базы данных можно получить при помощи метода CurrentDb().
- CompactRepair() — возможность сжать/починить базу данных Access и вернуть код ошибки (можно также записать протокол). Сжимаемая/ремонтируемая база данных должна быть в настоящий момент закрыта.
- ConvertAccessProject() — возможность выполнить еще одну служебную операцию, на этот раз по преобразованию версии базы данных Access. Возможны варианты от acFileFormatAccess2 до acFileFormatAccess2002.
- метод CreateAccessProject() позволяет программным образом создать проект Access (программный интерфейс для доступа к SQL Server). Для того, чтобы его сразу создать и открыть, можно использовать метод NewAccessProject(), а чтобы просто открыть существующий — OpenAccessProject().
- CreateAdditionalData() — возможность создать объект AdditionalData, который можно использовать вместе с методом ExportXML() при экспорте родительской таблицы в файл XML. Применение этого объекта позволяет экспортировать набор таблиц.
- CreateControl() — возможность программным образом создать элемент управления на форме. Принимает множество параметров, которые определяют данный элемент управления. Для создания элемента управления в отчете используется метод CreateReportControl(). Удаление — при помощи соответственно DeleteControl() и DeleteReportControl().
- CreateForm() — возможность также программным образом создать форму Access (и получить ссылку на объект созданной формы). Затем можно настроить свойства этой формы, добавить для нее элементы управления и т.п. Создание таким же образом отчета можно произвести при помощи метода CreateReport().
- CreateGroupLevel() — возможность программным образом создать группировку в отчете (или отсортировать записи). Принимает имя отчета, столбец, по которому производится сортировка, формулы для создания верхнего и нижнего колонтитула групп.
- CreateNewWorkgroupFile() — возможность программным способом создать файл рабочей группы с разрешениями для пользователей. На графическом экране эту операцию можно выполнить из меню Сервис->Защита->Администраторрабочих групп.
- CurrentUser() — этот метод позволяет получить в виде строкового значения имя текущего пользователя базы данных. По умолчанию работа производится от имени пользователя Admin.
- методы, которые начинаются на D…, очень удобны для выполнения различных операций, не прибегая к коду SQL — напрямую из Access:
- DAvg(), DSum(), DCount(), DMax(), DMin() и т.п. позволяют применить агрегатные функции к столбцу (или набору записей) в таблице или представлении;
- DLookup() — исключительно удобный метод, который позволяет найти и вернуть нужное вам значение из таблицы или представления (включая двоичные объекты, например, шаблоны Word). Точно также принимает в качестве параметров имя таблицы или представления, имя столбца и фильтр. Если условию фильтра удовлетворяет несколько значений, то возвращается первое.
- DFirst() и DLast() — несмотря на свои названия, эти методы работают одинаково, возвращая случайное значение из столбца таблицы или представления.
- Echo() позволяет перерисовать экран Access и в качестве бесплатного приложения вывести текст в строку состояния.
- очень удобен во многих ситуациях метод Eval(). Он позволяет произвести над текстовой строкой операции, как будто эта текстовая строка встретилась в коде VBA. Этот метод возвращает значение типа Variant — чтобы уместились любые возвращаемые значения. Например,
вернет то, что возвращает эта функция. Eval() очень удобно использовать, чтобы избежать громоздких проверок и преобразований типов, например, когда мы принимаем разные значения, вводимые пользователем.
Читайте также: