- Как написать функцию на VBA Access 2003
- Что такое пользовательские функции VBA и зачем их пишут
- Примеры написания функций VBA Access
- Пишем локальную функцию VBA
- Пишем глобальную функцию VBA
- _access, _waccess _access, _waccess
- Синтаксис Syntax
- Параметры Parameters
- Возвращаемое значение Return Value
- Комментарии Remarks
- Универсальное текстовое сопоставление функций Generic-Text Routine Mappings
- Требования Requirements
- Пример Example
- Автоматизация Microsoft Access с помощью Visual C
- Сводка
- Автоматизация и ADO.NET
- Распространенные задачи автоматизации
- Открытие базы данных в Access
- Печать или предварительный просмотр отчета Access
- Отображение и изменение формы Access
- Диалоговые окна безопасности Access
- Диалоговые окна предотвращения паролей базы данных
- Предотвращение использования диалоговых окон входа в систему безопасности
- Автоматизация среды Access
- Создание полного примера проекта Visual C# 2005 или Visual C# .NET
- Ссылки
Как написать функцию на VBA Access 2003
Продолжаем осваивать 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 перед названием функции.
Теперь все сохраняем, открываем нашу форму, жмем, старт и получаем наше сообщение:
Как видите, мы получили тот результат, который хотели, т.е. мы передавали в качестве параметра дату «19.06.2014» и получили соответствующий результат.
Пишем глобальную функцию VBA
Для того чтобы написать такую функцию создадим модуль, например «test_func» а там уже напишем нашу функцию. Для того чтобы создать модуль, открываем Access и на панели объектов выбираем «Модули» и жмем «Создать».
Затем вставляем наш код, с одним изменением, перед названием функции пишем Public, и у Вас должно получится вот такая картина:
Теперь осталось изменить код вызова нашей новой глобальной функции, для этого меняем код обработки события нажатия кнопки на нашей тестовой форме, на вот такой:
Сохраняем и проверяем, результат будет таким же, но его нам вернула уже совсем другая функция.
Как видите, все нет так уж и сложно, функция конечно простая, но Вы можете писать функции для собственных нужд, которые будут более сложными. Я всем советую весь повторяющийся код выносить в функции, так как это будет намного лучше, как для работы с этим кодом, так и просто для восприятия. Надеюсь, сегодняшняя статья помогла Вам разобраться с вопросом «Как написать функции на VBA Access?». Удачи в программировании на VBA.
_access, _waccess _access, _waccess
Определяет, доступен ли файл только для чтения или нет. Determines if a file is read-only or not. Существуют более безопасные версии этих функций; см. раздел _access_s, _waccess_s. More secure versions are available; see _access_s, _waccess_s.
Синтаксис Syntax
Параметры Parameters
путь path
Путь к файлу или каталогу. File or directory path.
mode mode
Атрибут чтения и записи. Read/write attribute.
Возвращаемое значение Return Value
Если файл имеет заданный режим, все функции возвращают значение 0. Each function returns 0 if the file has the given mode. Функция возвращает значение-1, если именованный файл не существует или не имеет заданного режима. в этом случае errno задается, как показано в следующей таблице. The function returns -1 if the named file does not exist or does not have the given mode; in this case, errno is set as shown in the following table.
Значение Value | Описание Description |
---|---|
EACCES | Доступ запрещен: настройка разрешений файла не допускает указанный доступ. Access denied: the file’s permission setting does not allow specified access. |
ENOENT | Имя файла или путь не найдены. File name or path not found. |
EINVAL | Недопустимый параметр. Invalid parameter. |
Дополнительные сведения об этих и других кодах возврата см. в разделе _doserrno, errno, _sys_errlist и _sys_nerr. For more information about these and other return codes, see _doserrno, errno, _sys_errlist, and _sys_nerr.
Комментарии Remarks
При использовании с файлами Функция _access определяет, существует ли указанный файл или каталог, и содержит атрибуты, заданные в параметре mode. When used with files, the _access function determines whether the specified file or directory exists and has the attributes specified by the value of mode. При использовании с каталогами _access определяет, существует ли указанный каталог. в операционных системах Windows 2000 и более поздних версий все каталоги имеют доступ на чтение и запись. When used with directories, _access determines only whether the specified directory exists; in Windows 2000 and later operating systems, all directories have read and write access.
значение режима mode value | Проверяет файл на Checks file for |
---|---|
00 00 | Существование Existence only |
02 02 | Только на запись Write-only |
04 04 | Только для чтения Read-only |
06 06 | Чтение и запись Read and write |
Эта функция проверяет только то, является ли файл или каталог доступным только для чтения; параметры безопасности файловой системы не проверяются. This function only checks whether the file and directory are read-only or not, it does not check the filesystem security settings. Для этого требуется токен доступа. For that you need an access token. Дополнительные сведения о безопасности файловой системы см. в разделе Токены доступа. For more information on filesystem security, see Access Tokens. Для использования этой функции предназначен класс ATL, см. раздел Класс CAccessToken. An ATL class exists to provide this functionality; see CAccessToken Class.
_waccess — это версия _access для расширенных символов; Аргумент пути к _waccess является строкой расширенных символов. _waccess is a wide-character version of _access; the path argument to _waccess is a wide-character string. в противном случае _waccess и _access ведут себя одинаково. _waccess and _access behave identically otherwise.
Эта функция проверяет свои параметры. This function validates its parameters. Если параметр path имеет значение null или режим не указывает допустимый режим, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров. If path is NULL or mode does not specify a valid mode, the invalid parameter handler is invoked, as described in Parameter Validation. Если выполнение может быть продолжено, функция устанавливает параметр errno в значение EINVAL и возвращает –1. If execution is allowed to continue, the function sets errno to EINVAL and returns -1.
По умолчанию глобальное состояние этой функции ограничивается приложением. By default, this function’s global state is scoped to the application. Чтобы изменить это, см. раздел глобальное состояние в CRT. To change this, see Global state in the CRT.
Универсальное текстовое сопоставление функций Generic-Text Routine Mappings
Процедура Tchar.h Tchar.h routine | _UNICODE и _MBCS не определены _UNICODE and _MBCS not defined | _MBCS определено _MBCS defined | _UNICODE определено _UNICODE defined |
---|---|---|---|
_taccess | _access _access | _access _access | _waccess _waccess |
Требования Requirements
Подпрограмма Routine | Обязательный заголовок Required header | Необязательные заголовки Optional headers |
---|---|---|
_access _access | ||
_waccess _waccess | или or |
Пример Example
В следующем примере используется _access для проверки файла с именем crt_ACCESS. C, чтобы определить, существует ли он и разрешена ли запись. The following example uses _access to check the file named crt_ACCESS.C to see whether it exists and whether writing is allowed.
Автоматизация Microsoft Access с помощью Visual C
Сводка
В этой статье показано, как автоматизировать Microsoft Access с помощью Microsoft Visual C# 2005 или Microsoft Visual C# .NET. В темах и примере кода показано, как выполнить следующие действия:
- Откройте базу данных в Access.
- Печать или предварительный просмотр отчета Access.
- Отображение и изменение формы Access.
- Не используйте диалоговые окна при открытии защищенной паролем базы данных или при включении безопасности на уровне пользователей.
- Автоматизация выполнения Access.
Автоматизация и ADO.NET
Разработчик может работать с базой данных Microsoft Access из Visual C# 2005 или Visual C# .NET с помощью двух отдельных технологий: Automation и Microsoft ADO.NET.
ADO.NET — это предпочтительная технология, если вы хотите работать с объектами данных, например с таблицами и запросами в базе данных Access. Используйте автоматизацию только в том случае, если вам нужны функции Microsoft Access для конкретных приложений, например возможность распечатать или просмотреть отчет Access, чтобы отобразить форму Access или вызвать макросы Access.
В этой статье рассказывается, как автоматизировать доступ. В этой статье не обсуждается ADO.NET. Для получения сведений о ADO.NET щелкните номера статей, приведенные ниже, чтобы просмотреть статьи базы знаний Майкрософт:
306636 как подключиться к базе данных и выполнить команду с помощью ADO 2005 и Visual c# 2005, а также с помощью ADO.NET и Visual c# .NET
314145 как заполнить объект DataSet из базы данных с помощью Visual C# .NET
307587 как обновить базу данных из объекта DataSet с помощью visual c# 2005 или Visual c# .NET
Автоматизация — это технология модели компонентных объектов (COM). Автоматизация позволяет приложениям, написанным на таких языках, как Visual C# .NET, программно управлять другими приложениями. При автоматизации приложения Microsoft Office фактически запускается экземпляр этого приложения в памяти, а затем вызывается объектная модель приложения для выполнения различных задач в этом приложении. В приложении Access и других приложениях Microsoft Office практически все действия, которые можно выполнить вручную через пользовательский интерфейс, также можно выполнить программным путем с помощью автоматизации.
Доступ к этим программным функциям предоставляется через объектную модель. Объектная модель — это коллекция классов и методов, которая выступает в качестве аналога для логических компонентов Access. Чтобы получить доступ к объектной модели из Visual C# .NET, можно установить ссылку проекта на библиотеку типов.
Распространенные задачи автоматизации
Открытие базы данных в Access
При автоматизации Microsoft Access перед выполнением необходимых действий, таких как печать отчетов, необходимо открыть базу данных. Чтобы открыть базу данных в экземпляре автоматизированного доступа, используйте методы Опенкуррентдатабасе или Опенакцесспрожект объекта Application. В Access одновременно можно открыть только одну базу данных. Для работы с другой базой данных можно использовать метод Клосекуррентдатабасе перед открытием другой базы данных.
Вы также можете использовать метод System. Runtime. InteropServices. Marshal. Биндтомоникер ( у базы данных), чтобы открыть базу данных в экземпляре Access. Если база данных уже открыта в экземпляре Access, Биндтомоникер возвращает объект Application этого экземпляра. В противном случае Биндтомоникер запускает новый экземпляр Access и открывает указанную базу данных.
Опенкуррентдатабасе является предпочтительным методом для открытия базы данных, так как вы указываете экземпляр автоматизации Access, который вы автоматизируем. Кроме того, можно указать аргументы для управления способом открытия базы данных, например:
Печать или предварительный просмотр отчета Access
Чтобы просмотреть или распечатать отчет Access, вызывается метод ОткрытьОтчет объекта DoCmd. При вызове команды ОткрытьОтчет один из передаваемых аргументов определяет, будет ли отчет просматривается на экране, или отправляется ли он на принтер:
Обратите внимание, что аргумент View определяет, отображается ли отчет в Access, или отправляется ли он на принтер. Аргумент WhereCondition может ограничивать набор записей отчета, если используется допустимое предложение WHERE SQL (без слова WHERE.) Обратите внимание, что можно использовать System. Reflection. Missing. Value, чтобы пропустить все необязательные параметры объекта.
Если вы просматриваете отчет, не забудьте задать свойство Visible объекта Application, чтобы доступ отображался на экране. Таким образом, пользователь может просматривать отчет в окне Access.
Существует другой способ печати отчета или других объектов в базе данных. Используйте метод PrintOut объекта DoCmd. В этом примере вы выбираете отчет «сотрудники» в окне базы данных, а затем вызывается распечатка для печати выбранного объекта. Метод PrintOut позволяет указать аргументы, соответствующие диалоговому окну «Печать» в Access:
В некоторых случаях для печати отчета можно использовать как ОткрытьОтчет, так и метод печати. Предположим, вы хотите напечатать несколько копий отчета по сотрудникам, но только для определенного сотрудника. В этом примере сначала используется ОткрытьОтчет, чтобы открыть отчет о сотрудниках в режиме предварительного просмотра с помощью аргумента WhereCondition, чтобы ограничить записи определенным сотрудником. Затем распечатка используется для печати нескольких копий активного объекта:
В Access 2002 появился объект Printer. Этот объект можно использовать для более легкого настройки параметров принтера Access, чем в предыдущих версиях Access. Пример использования объекта Printer в Access для печати отчета щелкните номер статьи ниже, чтобы просмотреть статью в базе знаний Майкрософт:
284286 способ сброса изменений объекта Application. Printer
Отображение и изменение формы Access
Visual C# .NET обладает мощными возможностями форм. Однако иногда вы хотите, чтобы пользователь мог просматривать форму, которая была разработана ранее в Access. Кроме того, у вас может быть форма в базе данных Access, предоставляющая условия для запроса или отчета, и необходимо открыть эту форму, прежде чем вы сможете выполнить предварительный просмотр или печать отчета. Чтобы открыть и отобразить форму Access, вызывается метод OpenForm объекта DoCmd:
Теперь вы можете редактировать элементы управления в форме.
Диалоговые окна безопасности Access
При автоматизации доступа может быть предложено ввести имя пользователя или пароль или и то, и другое, при попытке открыть базу данных. Если пользователь введет неправильную информацию, в коде произойдет ошибка. В некоторых случаях может потребоваться исключить эти диалоговые окна, а вместо этого указать имя пользователя и пароль программным способом, чтобы код автоматизации мог выполняться без прерывания.
Существует два типа безопасности в Microsoft Access: защищенные паролем базы данных и безопасность на уровне пользователей с помощью файла рабочей группы (System. mdw). Если вы пытаетесь открыть базу данных, защищенную паролем, появится диалоговое окно с запросом пароля базы данных. Безопасность на уровне пользователя отличается от защищенной паролем базы данных. При активации безопасности на уровне пользователя в Access отображается диалоговое окно входа с запросом имени пользователя и пароля, прежде чем пользователь сможет открыть любую базу данных в Access.
Диалоговые окна предотвращения паролей базы данных
Если вы открываете базу данных, защищенную паролем, диалоговое окно можно не использовать, указав пароль для метода Опенкуррентдатабасе:
Ниже приведен пример, в котором для Оакцесс ранее был задан экземпляр Access, у которого нет открытой базы данных. Этот код предоставляет пароль для базы данных, чтобы избежать появления диалогового окна:
ODB. Close фактически не закрывает базу данных в Access. Он только закрывает подключение DAO к базе данных, созданной с помощью объекта DBEngine. После использования метода Опенкуррентдатабасе соединение DAO больше не требуется. Обратите внимание на то, что код освобождает объекты oDB и Одбенгине. Эти объекты необходимо использовать для корректного завершения работы Access после завершения кода.
Предотвращение использования диалоговых окон входа в систему безопасности
Если в Access включена защита на уровне пользователей, пользователю предлагается диалоговое окно входа в систему с запросом имени пользователя и пароля. Имя пользователя и пароль не могут быть указаны с помощью объектной модели Access. Таким образом, если вы хотите избежать диалогового окна входа при автоматизации доступа, необходимо сначала запустить файл Msaccess. exe и указать параметры командной строки/user и/ПВД, чтобы указать имя пользователя и пароль. После этого можно использовать Жетактивеобжект или Биндтомоникер для получения объекта Application из запущенного экземпляра Access, чтобы можно было продолжить автоматизацию.
Автоматизация среды Access
Выпуск Microsoft Office Developer Edition включает инструменты разработчика Microsoft Office (MOD). С помощью MOD разработчики Access могут создавать и распространять приложения Access для пользователей, не имеющих розничной версии Access. Когда пользователь устанавливает приложение Access на компьютере, на котором не установлена розничная версия Access, устанавливается версия Access для среды выполнения. Среда выполнения Access установлена и регистрируется как розничная версия. Исполняемый файл также называется Msaccess. exe. Во время выполнения Access приложение Access можно запустить на клиентском компьютере, но среда Access не позволяет пользователю разрабатывать новые приложения или изменять макет существующих приложений.
Во время выполнения Access необходимо запустить базу данных. В связи с этим требованием, если необходимо автоматизировать среду выполнения Access, необходимо запустить файл Msaccess. exe и указать базу данных, которую необходимо открыть. После того как вы получите объект Application с помощью Жетактивеобжект или Биндтомоникер, вы можете автоматизировать среду Access. Если не использовать этот подход при попытке автоматизации среды выполнения Access, при попытке создания экземпляра экземпляра будет выведено следующее сообщение об ошибке:
Сбой выполнения сервера System. Runtime. InteropServices. Комексцептион (0x80080005).
Создание полного примера проекта Visual C# 2005 или Visual C# .NET
Чтобы использовать следующий пошаговый пример, убедитесь, что установлена учебная база данных Northwind. По умолчанию Microsoft Access 2000 устанавливает учебные базы данных по следующему пути:
C:\Program Files\Microsoft Оффице\оффице\самплес
Microsoft Access 2002 использует следующий путь:
C:\Program Files\Microsoft Office\Office10\Samples
Microsoft Office Access 2003 использует следующий путь:
Чтобы убедиться, что учебная база данных Northwind установлена в Access 2002 или Access 2003, в меню Справка выберите пункт Примеры баз данных, а затем щелкните учебная база данных Northwind.
Закройте все экземпляры Access, выполняемые в данный момент.
Запустите Microsoft Visual Studio .NET.
В меню Файл выберите команду Создать, а затем выберите Проект. Выберите приложение Windows из типов проектов Visual C#. По умолчанию форма Form1 создана.
Note (Примечание ) Необходимо изменить код в Visual Studio 2005. По умолчанию Visual C# добавляет одну форму в проект при создании проекта Windows Forms. Форма называется Form1. Два файла, представляющие форму, называются Form1.cs и Form1.designer.cs. Вы пишете код в Form1.cs. Файл Form1.designer.cs — это место, в котором конструктор Windows Forms записывает код, который реализует все действия, выполненные путем перетаскивания элементов управления с панели инструментов.
Для получения дополнительных сведений о конструкторе Windows Forms в Visual C# 2005 посетите следующий веб-сайт Microsoft Developer Network (MSDN):https://msdn.microsoft.com/en-us/library/ms173077.aspx
Добавьте ссылку на библиотеку объектов Microsoft Access. Для этого выполните следующие действия:
- On the Project menu, click Add Reference.
- На вкладке COM найдите объект библиотека объектов Microsoft Access и нажмите кнопку Выбрать.
Note (Примечание ) В Visual Studio 2005. Нажмите кнопку выбрать.
Note (Примечание ) В состав Microsoft Office 2003 входят основные сборки взаимодействия (PIA). Microsoft Office XP не включает PIA, но их можно скачать.
В диалоговом окне Добавление ссылок нажмите кнопку ОК, чтобы принять выбранные параметры.
Note (Примечание ) Если вы ссылаетесь на библиотеку объектов Access 10,0 и получаете сообщение об ошибке при попытке добавить ссылку.
В меню Вид выберите пункт Панель элементов, чтобы открыть панель элементов.
Добавление пяти элементов управления переключателем и одного элемента управления «Кнопка» в форму Form1.
Выберите все элементы управления переключателем, а затем задайте для свойства Size значение 150, 24.
Добавьте обработчики событий для события загрузки формы и для события Click элемента управления «Кнопка»:
В представлении конструктора для Form1.cs дважды щелкните элемент Form1.
Обработчик события Load для формы создается и отображается в Form1.cs.
В меню Вид выберите конструктор, чтобы переключиться в режим конструктора.
Дважды щелкните элемент Button1.
Обработчик события нажатия кнопки создается и отображается в Form1.cs.
В Form1.cs замените приведенный ниже код.
Добавьте следующий код в директивы using в Form1.cs:
Нажмите клавишу F5 для построения и запуска программы. Отображается форма Form1.
Нажмите кнопку Печать отчета, а затем нажмите Go!. Print_Report процедура печатает отчет из базы данных Northwind.
Щелкните Предварительный просмотр отчета, а затем нажмите Go!. Процедура Preview_Report предварительно просматривает отчет из базы данных Northwind. Закройте экземпляр Access, когда все будет готово к продолжению.
Нажмите кнопку Показать форму, а затем нажмите кнопку Go!. Процедура Show_Form отображает форму диалогового окна «Метки клиентов» из базы данных Northwind. Кроме того, она задает для группы переключателей в форме значение «особая страна» и выбирает «USA» из списка. Закройте экземпляр Access, когда все будет готово к продолжению.
Выберите Печать отчета (безопасность), а затем нажмите кнопку Go!. В Print_Report_Securityной процедуре показано, как автоматизировать доступ и как избежать появления диалогового окна входа в систему, если включена защита на уровне пользователей. В этом примере предполагается, что для входа в систему по умолчанию передается пустой пароль администратора пользователей. Затем код печатает отчет в базе данных Northwind.
Щелкните Предварительный просмотр отчета (среда выполнения), а затем нажмите Go (перейти). В Preview_Report_Runtimeной процедуре показано, как автоматизировать среду выполнения Access для предварительного просмотра отчета в базе данных Northwind. Если розничная версия Access установлена, процедура по-прежнему будет работать правильно. Закройте экземпляр Access, когда все будет готово к продолжению.
Ссылки
Для получения дополнительных сведений посетите следующий веб-сайт MSDN: Разработка Microsoft Office с помощью Visual https://msdn.microsoft.com/en-us/library/aa188489(office.10).aspxStudio для получения дополнительных сведений щелкните приведенные ниже номера статей базы знаний Майкрософт:
317109 приложение Office не завершает работу после автоматизации от клиента Visual Studio .NET
316126 как использовать Visual C# для автоматизации запущенного экземпляра приложения Office