35
В. М. Водовозов Управление базами данных Access на VBA Санкт-Петербург 2003

Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

  • Upload
    vodieu

  • View
    279

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

В. М. Водовозов

Управление базами данных Access на VBA

Санкт-Петербург 2003

Page 2: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

УДК 681.3.016 В.М.Водовозов. Управление базами данных Access на VBA. 32 с. Даны основные сведения об использовании Visual Basic for

Applications для создания модулей Access. Для всех, кто владеет основами Microsoft Access.

© В.М.Водовозов, 2003.

Page 3: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

Оглавление

Модели объектов Access .................................................................................3 Процедурное и структурное программирование в DAO .............................5 Процедурное и структурное программирование в ADO ...........................13 Визуальное программирование в Access.....................................................21 Меню...............................................................................................................31 Панели инструментов....................................................................................32 Начальная установка интерфейса ................................................................34

Модели объектов Access

Access представлен двумя уровнями компонентов: ядром базы данных Jet и системой управления базой данных Access. На уровне ядра находятся данные, то есть таблицы и запросы, а также файлы, хранящие компоненты системы управления. Для организации данных используется индексно-последовательный метод (ISAM), в соответствии с которым каждая запись имеет переменную длину и хранится на странице объемом до двух килобайт. Выборка данных поддерживается механизмом запросов SQL и программным доступом на VBA. Система управления Access обслуживает интерфейс пользователя (формы, отчеты, макросы, меню, панели, окна диалога) и процедуры VBA.

Первый уровень поддерживаются двумя моделями объектов. Первая из них базируется на библиотеках классов DAO (Data Access Objects), вторая � на библиотеках ADO (ActiveX Data Objects � ADODB, ActiveX Data Objects Extensions for DDL and Sequrity � ADOX, Microsoft Jet and Replication Objects � JRQ). ADODB обеспечивает приложению доступ к источнику данных с возможностью отбора и изменения данных. ADOX позволяет программно изменять структуру объектов источника данных и систему защиты баз данных. JRQ служит для создания, модификации и синхронизации реплик баз данных Access.

Второй уровень строится на библиотеке Access. Библиотека классов DAO ориентирована на работу с данными. Базовым

классом DAO является DBEngine, описывающий семейства Errors (Ошибки) и Workspaces (Рабочие области). Каждая рабочая область Workspace характеризуется классами Databases (Базы данных), Groups (Группы), Users (Пользователи). Наиболее часто используется семейство Recordset (Результирующие наборы записей) класса Database. Каждое множество Recordset основывается на записях таблицы или на описании запроса и позволяет находить, добавлять, изменять или удалять записи. Структуры таблиц базы данных хранятся в семействе класса TableDefs, в частности, в объектах его классов Fields (Поля), Indexes (Индексы). В семействе класса

Page 4: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

4

Relations (Связи) размещаются схемы данных таблиц. Структура запросов базы данных описывается семейством класса QueryDefs (Запросы) с объектами классов Fields (Поля), Parameters (Параметры).

На работу с данными рассчитана и модель ADO. Во главе этой модели стоит объект Connection (Соединение). Он описывает среду, в которой выполняется обмен данными. Источник данных управляется производным от Connection объектом Command (Команда), который командами SQL добавляет, удаляет, обновляет и считывает данные. Его семейство Parameters (Параметры) представляет переменные компоненты объекта Command. Другой производный от Connection объект � Recordset � накапливает считанные из источника данные. Его семейство Fields представляет поля таблиц Recordset. Поля характеризуются семействами свойств Properties. Встроенные свойства являются частью объекта ADO и всегда доступны, а динамические свойства существуют только в момент работы источника данных.

Библиотеку классов Access возглавляет класс Application (Приложение), описывающий семейства Forms, Reports, Modules, References, DataAccessPages, Controls и такие объекты как Screen, DoCmd, Module, Assistant, CommandBar�

В литературе часто используются сокращения: Признак Тип Объект Признак Тип Объект db Database База данных rpt Report Отчет tdf TableDef Таблица ctl Control Элемент qdf QueryDef Запрос txt TextBox Поле формы rst Recordset Набор записей cbo ComboBox Поле со списком fld Field Поле cmd Command

Button Кнопка

idx Index Индекс con Connection Связь frm Form Форма cmd Command Команда меню

Обращение к членам библиотек классов DAO и ADO и все обращения в запросах SQL выполняется по схеме:

имяКласса.имяОбъекта.Член

Имена длиной более одного слова заключаются в прямоугольные скобки. При ссылке на объект в активном окне базы данных или контейнера (объекта, содержащего адресуемый объект) имя класса иногда можно опускать. Для упрощения обращений к объектам используется оператор Set, ставящий в соответствие описываемому объекту объектную переменную.

Page 5: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

5

Процедурное и структурное программирование в DAO

В общем случае доступ к данным библиотек DAO организуется в три этапа. Сначала создается объект методом Create� его родителя. Затем устанавливаются его свойства, которые после сохранения объекта в базе данных останутся доступными только для чтения. В ряде случаев, кроме свойств, сразу же задаются и объекты-потомки, например, поля таблиц. В заключение объект добавляется в состав семейства методом Append этого семейства и сохраняется в памяти. Отдельные классы объектов создаются по упрощенной схеме.

Сеанс доступа к данным модели DAO описывает класс Workspace. Все действия в рамках сеанса определены правилами доступа пользователя, а их последовательность � транзакция � рассматривается как одно целое. В незащищенных базах данных открывается сеанс по умолчанию под именем Default Workspace для пользователя admin без пароля. При создании нового сеанса Workspace

DBEngine!CreateWorkspace _

(имяРабочейОбласти, Пользователь, Пароль [, Тип]) его не добавляют в семейство ввиду временного характера его существования.

Метод CreateDatabase используют для создания новых баз данных:

[рабочаяОбласть].CreateDatabase (имяБазыДанных, _ Язык, [Параметры] )

Здесь ранее созданная рабочаяОбласть служит ссылкой на объект Workspace, имяБазыДанных длиной до 255 символов представляет короткий или полный путь к файлу .MDB, Язык задается значением констант dbLangGeneral, dbLangCirillic, определяя порядок сортировки данных, а необязательные Параметры задают формат ядра Jet и необходимость шифрования. Базы данных автоматически добавляются в соответствующие семейства и сохраняются.

Для открытия базы данных используется метод OpenDatabase:

[базаДанных.] [рабочаяОбласть.]OpenDatabase (имяБазыДанных _ [, Монопольность [, толькоЧтение[, Источник]]] )

Если база данных уже открыта, к ней удобно обращаться через функцию CurrentDb:

• CurrentDB!имяТаблицы!имяПоля.имяСвойства

Page 6: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

6

• CurrentDB!QueryDefs!имяЗапроса • CurrentDB!QueryDefs («имяЗапроса») • CurrentDB!QueryDefs (индекс) • CurrentDB!QueryDefs (ссылка)

Результирующие множества записей � объекты классов TableDef и

QueryDef � создаются методами CreateTableDef, CreateQueryDef: • [рабочаяОбласть.]базаДанных.CreateTableDef («имяТаблицы») • [рабочаяОбласть.]базаДанных.CreateQueryDef ([запрос, SQL])

Если при вызове метода CreateQueryDef аргументы не заданы, можно присвоить новому объекту значения свойств Name и SQLtext позднее, посредством оператора присваивания.

Объекты классов TableDef и QueryDef открываются методом OpenRecordset и закрываются с удалением из семейства Databases методом Close объекта Database:

• базаДанных.OpenRecordset (Источник [,Тип, Параметры] ) • объект.OpenRecordset (Источник [,Тип, Параметры] ) • базаДанных.Close • объект.Close

В отличие от режима работы через интерфейс пользователя, процедуры VBA дают возможность одновременно открывать несколько баз данных, хотя на экране отображается только одна из них. Свойство Name позволяет проверить, открылась ли база данных: полный путь к открытой базе возвращает выражение объект.Name. Поля таблиц вначале создаются, затем добавляются в семейства, после чего обновляется окно базы данных: Set объектПоле = объектТаблица.CreateField (имяПоля, Тип, [Размер]) объектТаблица.Fields.Append объектПоле базаДанных.TableDefs.Append объектТаблица RefreshDatabaseWindow

Доступ к полям реализуется через объекты класса Fields:

• имяТаблицыИлиЗапроса.Fields!имяПоля • имяТаблицыИлиЗапроса. имяПоля • имяТаблицыИлиЗапроса!Fields!имяПоля • имяТаблицыИлиЗапроса! имяПоля

Page 7: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

7

• Parent!имяПоляГлавнойФормы Ни TableDef, ни QueryDef не содержат данных. Для доступа к данным

нужны наборы записей � объекты RecordSet. В модели DAO присутствуют четыре типа таких объектов. Тип Table представляет набор записей одной таблицы открытого файла базы данных. Он не обрабатывает связанные таблицы и таблицы ODBC и обслуживает только рабочие области Jet. Тип Dynaset представляет динамический набор записей таблицы открытой базы данных, связанной таблицы, результата выполнения запроса или оператора SQL SELECT. Он состоит из ссылок, поэтому обрабатывается медленнее, чем Table и иногда не обновляется, но охватывает более широкую область данных. Тип Snapshot представляет статическую копию таблицы, запроса или оператора SQL SELECT, удобную для выборки данных и создания отчетов. Forward-Only представляет аналогичную копию, предназначенную для единовременного просмотра данных. Синтаксис:

базаДанных.OpenRecordSet (Источник [,Тип, Параметры, Блокировка])

Здесь Источник � это строка с именем таблицы, запроса или текстом SQL, далее следует тип объекта RecordSet, по умолчанию Table для таблиц и Dynaset для запросов и связанных таблиц. Любой объект RecordSet существует только в рамках своей процедуры, а затем уничтожается. Его можно закрыть раньше методом Close.

Примеры Sub РабочаяОбласть ()

Set область = DBEngine.Workspaces (0) Set новаяБазаДанных = _

область.CreateDatabase ("Школьники.mdb", dbLangGeneral) Set другаяБазаДанных = _

область.OpenDatabase ("Транспорт") MsgBox другаяБазаДанных.Name & Chr (13) & _

новаяБазаДанных.Name & Chr (13) & CurrentDb.Name End Sub Sub БазыДанных ()

Set текущаяБазаДанных = CurrentDb Set новаяБазаДанных = CreateDatabase ("Студенты.mdb", dbLangCyrillic) Set другаяБазаДанных = OpenDatabase ("Пользователи.mdb") MsgBox другаяБазаДанных.Name & Chr (13) & _

новаяБазаДанных.Name & Chr (13) & текущаяБазаДанных.Name End Sub Sub НаборыЗаписейDAO ()

Set tdf1 = CurrentDb.OpenRecordset ("Сотрудники", dbOpenDynaset) Set tdf2 = CurrentDb.OpenRecordset ("Категории")

Page 8: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

8

Set tdf3 = CurrentDb.OpenRecordset ("SELECT * FROM Поставщики") Set tdf4 = CurrentDb!Поставщики.OpenRecordset Set tdf5 = CurrentDb.QueryDefs (�Продажи�).OpenRecordset tdf1.Close

End Sub Sub УправлениеТаблицей ()

Set tdf = CurrentDb.OpenRecordset ("Отделы") MsgBox "Таблица открыта" tdf.Close MsgBox "Таблица закрыта"

End Sub Sub СозданиеТаблицы ()

Set область = DBEngine.Workspaces (0) Set база = область.OpenDatabase (�C:\Учащиеся.mdb�) Set таблица = база.CreateTableDef ("НоваяТаблица") таблица.Fields.Append таблица.CreateField (�Кто�, dbText) таблица.Fields.Append таблица.CreateField (�Когда�, dbDate) база.TableDefs.Append таблица база.TableDefs.Refresh Set таблица = Nothing Set база = Nothing

End Sub Sub УдалениеТаблицы ()

CurrentDb.TableDefs.Delete �НоваяТаблица� CurrentDb.TableDefs.Refresh

RefreshDatabaseWindow End Sub Sub ДоступКПолям ()

MsgBox CurrentDb!Таблица1.Fields (1).Name & Space (2) _ & CurrentDb!Таблица1.Fields (2).Name & Chr (13) & _ "Всего полей: " & CurrentDb!Сотрудники.Fields.Count

End Sub Sub Запрос () переменная = CurrentDB.CreateQueryDef _

(�зСотр�, �SELECT * FROM Сотрудники ORDER BY Сотрудники.ФИО�) RefreshDatabaseWindow End Sub При создании объекта RecordSet строки данных помещаются в буфер и не выводятся на экран, а указатель позиционирует на текущей записи. При открытии набора записей активной становится первая запись. Для перемещения к другим записям используются методы MoveFirst, MoveNext, MovePrevious, MoveLast. Методом BookMark можно определять закладки и возвращаться впоследствии к запомненным в них записям: объектЗакладка = объектНабор.BookMark

Page 9: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

9

� объектНабор.BookMark = объектЗакладка Метод Move числоСтрок [,Закладка] смещает указатель на требуемое число записей вперед или назад. Свойства BOF и EOF объекта Recordset фиксируют выход за пределы набора записей. Для поиска определенной записи в наборах типа Table используется метод Seek, а в наборах других типов � методы FindFirst, FindNext, FindPrevious, FindLast. Найденная запись становится текущей, а свойство NoMatch устанавливается в False. При отсутствии искомой записи NoMatch = True:

• объект.Seek «оператор», списокКлючей • объект.Find� «критерий»

Здесь используются операторы >, <, >=, <=, =, а список ключей описывает поля текущего индекса. Критерий же предствляет логичекое выражение вида «Поле оператор Значение».

В модели DAO изменения в таблицы вносятся последовательно. Предварительно запись копируется в специальную область памяти � буфер копирования методом Edit, а затем методом Update возвращается в объект Recordset. При необходимости буфер копирования очищается методом CancelUpdate: объект.Move� или Find� или Seek объект.Edit объект.имяПоля = Значение объект.Update объект.CancelUpdate При необходимости Execute выполняет запрос на изменение и Update сохраняет изменения.

Новые записи тоже не добавляются прямо, а сначала помещаются в буфер копирования, а затем обновляют набор методом AddNew. В наборах типа Dynaset и Table без индекса новая запись добавляется в конец, а там, где определен индекс, она вставляется в соответствии с индексом. Для добавленной записи автоматически создается закладка в свойстве LastModified. Указатель текущей записи при этом автоматически не перемещается.

Page 10: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

10

Удаляемая запись помещается в буфер удаления и остается текущей. Удаление выполняется без предупреждения и отмены.

Уникальный объект DoCmd реализует связь между макропрограммированием и программированием на VBA, дублируя операции интерфейса пользователя Access. Методы DoCmd не возвращают значений. В их аргументах активно используются константы Access, такие как acTable, acQuery, acForm, acReport, True, False. Имена объектов здесь не заключаются в прямоугольные скобки, а при необходимости помещаются в двойные кавычки. В частности, для выполнения запросов SQL вызывается метод RunSQL объекта DoCmd. В программах VBA допускается использование выражений SQL длиной до 32768 символов.

Другой метод � Clone � создает копии наборов записей. При копировании организуется независимый указатель текущей записи, а закладки копии совпадают с закладками оригинала. Но копия не наследует свойств Index, Filter, Sort.

Связь полей таблиц и запросов описывается методом Relation. Он используется для создания новых связей (CreateRelation), для их изменения и просмотра. При создании связи указываются соответствующие поля в первичной и внешней таблицах (запросах). В первой таблице эти поля образуют первичный ключ, однозначно определяющий запись, а во второй таблице � внешний ключ. Каждое поле первичного ключа следует добавить в семейство Fields связи с указанием внешнего ключа в свойстве ForeignName:

Set объектСвязи = базаДанных.CreateRelation

([«Имя», Таблица, внешняяТаблица, Атрибуты]) объектСвязи.Table = «Таблица» объектСвязи.ForeignTable = «внешняяТаблица» Set объектПоле = объектСвязи.CreateField(«Поле») объектПоле.ForeignName = «Поле» объектСвязи.Fields Append объектПоле базаДанных.Relations Append объектСвязи При этом Access устанавливает параметр ссылочной целостности, но не устанавливает каскадное обновление и удаление записей.

Примеры Sub ПоискDAO () Set tdf1 = CurrentDb.OpenRecordset ("Сотрудники") tdf .Index = "PrimaryKey" tdf .Seek "=", "Иванов" Set tdf2 = CurrentDb.OpenRecordset ("Командировки", dbOpenSnapshot)

Page 11: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

11

tdf2.FindFirst "Кто = 'Алексеев'" End Sub Sub ЗаписиDAO ()

Set базаДанных = CurrentDb строкаSQL = "SELECT * FROM Таблица1 WHERE Фирма LIKE 'I*'" Set результатЗапроса = базаДанных.OpenRecordset (строкаSQL) результатЗапроса.MoveFirst MsgBox результатЗапроса.Fields (0) & " - " & результатЗапроса.Fields (2) где = "Фирма = 'Intel'" результатЗапроса.FindFirst где MsgBox результатЗапроса.Fields (0) & " - " & результатЗапроса.Fields (2) результатЗапроса.FindNext где MsgBox результатЗапроса.Fields (0) & " - " & результатЗапроса.Fields (2) результатЗапроса.MoveLast MsgBox результатЗапроса.RecordCount

End Sub Sub ОбновлениеЗаписей ()

Set rst = CurrentDb.OpenRecordset ("Таблица1") где = "Фирма = 'Intel'" DoCmd.RunSQL _

"UPDATE Таблица1 SET Цена = 5 WHERE NТовара=2" DoCmd.RunSQL _

"UPDATE Таблица1 SET Фирма = 'LG' WHERE " & где DoCmd.RunSQL _

"UPDATE Таблица1 SET Фирма = 'Zilog' WHERE " & _ "Фирма = 'LG'"

rst.Close Set rst = Nothing

End Sub Sub АнализЗаписей ()

Set db = CurrentDb Set rst = db.OpenRecordset ("Таблица1", dbOpenDynaset) где = "Фирма = 'Intel'" rst.MoveFirst rst.FindFirst где If rst.NoMatch = False Then MsgBox "Фирма есть в этой таблице" rst.FindNext где If rst.NoMatch Then MsgBox "Фирма только одна" rst.Close db.Close Set rst = Nothing Set db = Nothing

End Sub Sub СписокБазыДанных ()

Set текущаяБазаДанных = CurrentDb Set рабочаяОбласть = DBEngine.Workspaces(0) Set новаяБазаДанных = рабочаяОбласть.CreateDatabase _

("Студенты.mdb", dbLangGeneral)

Page 12: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

12

Set другаяБазаДанных = рабочаяОбласть.OpenDatabase _ ("ФирмаГодПрезидент")

For Each базаДанных In рабочаяОбласть.Databases список = список & Chr (13) & базаДанных.Name

Next базаДанных MsgBox список

End Sub Sub СписокПолей ()

Set db = CurrentDb Set tdf = db!Таблица1 For Each fld In tdf.Fields

строка = строка & Chr (13) & fld.Name Next fld MsgBox строка

End Sub Sub ЗаменаДанных ()

Set объект = CurrentDb.OpenRecordset ("Товары", dbOpenDynaset) критерий = "NТовара = 1" объект.FindFirst критерий Do Until объект.NoMatch

With объект .Edit .NТовара = 333 .Update .FindNext критерий End With Loop объект.Close Set объект = Nothing

End Sub Sub ЧтениеДанных ()

� В Access для загрузки в массив строк объекта Recordset � используется метод GetRows Set объект = CurrentDb.OpenRecordset("Товары")

массив = объект.GetRows (объект.RecordCount) For Each элемент In массив строка = строка & элемент & chr (13) Next MsgBox строка End Sub Sub ПравкаТаблицDAO ()

Set таблица = CurrentDB.OpenRecordset ("Таблица1") таблица.MoveFirst таблица.Edit таблица.Fields (Фирма) = "SCAN" таблица.Fields (Год) = 2005 строкаSQL = "UPDATE Таблица1 SET NТовара = 22 " _

Page 13: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

13

& "WHERE NТовара = 2 " CurrentDb.Execute строкаSQL таблица.AddNew таблица.Fields (ФИО) = �Новый�

таблица.Update таблица.BookMark = таблица.LastModified таблица.Move 5 таблица.Delete таблица.moveNext

End Sub

Процедурное и структурное программирование в ADO

Синтаксис обращения к объектам ADO: ADODB.имяОбъекта Для доступа к данным в этой модели используются объекты Connection, несущие сведения об источнике данных и его расположении. Для работы с ним открывается множество Recorddet или Command и задается строка подключения ConnectionString. Значения каждого свойства такого объекта можно задавать как аргумент метода Open или отдельно, через свойство Properties. Connection открывает сеанс обмена данными через провайдера OLEDB. Command служит для выполнения запросов. Recordset представляет набор записей, а Fields � семейство его полей. Отдельные параметры SQL-запросов и хранимых процедур образуют семейство Parameter. Ошибки сеанса связи фиксируются объектами семейства Errors. Как и в DAO, свойства � объекты Properties � делятся на встроенные и динамические. Можно сначала задавать свойства, а потом создавать объект, используя его метод или метод другого объекта. Или наоборот: вначале создать объект, а затем установить значения его свойств. Свойства и методы классов модели ADODB приведены в таблице.

Название Тип Определение Класс Connection

Initial Catalog Свойство Папка по умолчанию Data Source Свойство Источник данных: таблица, запрос� User ID Свойство Сетевое имя пользователя Integrated Sequrity Свойство Интегрироаванная защита Prompt Свойство Ввод пароля Persist Sequrity Info Свойство Пароль в строке подключения

CursorLocation Свойство Клиентские курсоры ConnectionString Свойство Строка подключения со списком свойств

Page 14: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

14

Название Тип Определение State Свойство Состояние объекта Connection Open Метод Создает новый объект Connection Execute Метод Выполняет команду

Класс Recordset AbsolutePosition Свойство Устанавливает указатель на текущей записи BOF, EOF Свойство Определяет начало и конец набора записей Bookmark Свойство Сохраняет позицию указателя в наборе Connection Свойство Объектная переменная соединения RecordCount Свойство Число записей в наборе Close Метод Закрывает набор записей Delete Метод Удаляет текущую запись из набора GetRows Метод Копирует записи в двухмерный массив Move Метод Смещает указатель на заданную величину MoveFirst, Move-Last, MoveNext, MovePrevious

Метод Переходит к первой, последней, следующей или предыдущей записи, делая ее текущей

OpenRecordset Метод Создает новый набор записей Requery Метод Обновляет набор, переходя в ее начало

Класс Command ActiveConnection Свойство Устанавливает подключение или его строку CommandText Свойство Источник: SQL-инструкция, таблица CommandType Свойство Тип свойства CommandText CommandTimeout Свойство Время ожидания выполнения запроса, с Prepared Свойство Предварительная готовность CommandText State Свойство Состояние объекта Command Cancel Метод Прекращает выполнение запроса CreateParameter Метод Создает параметр запроса Execute Метод Выполняет запрос объекта Command

Объекты Recordset создают тремя методами: Open класса Recordset, Exequte класса Command или Exequte класса Connection. Синтаксис метода Open:

rst.Open Source, Connection, CursorType, lockType, Options где Source � это имя таблицы или запроса, инструкция SQL, ссылка на объект Command или имя файла, Connection � ссылка на объект подключения, cursorType � тип доступа: adOpenDynamic � отображает все изменения, вставки и удаления, вносимые другими пользователями; adOpenKeyset � показывает только изменения; adOpenStatic � сохраняет исходный набор; adOpenForwardOnly � то же, при одностороннем движении курсора; LockType � тип блокировки: adLockReadOnly � только для чтения,

Page 15: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

15

adLockPessimistic � пессимистическая блокировка, adLockOptimistic � оптимистическая блокировка, adLockBatchOptimistic � с кэшированием изменений в наборе; Options � характеристика Source: adCmdText � инструкция SQL, adCmdTable � SQL-запрос ко всем записям таблицы, adCmdTableDirect � таблица или запрос, adCmdUnknown � без указания параметра, adCmdFile � файл с набором записей. Объект Command служит для выполнения запросов. В качестве источника данных запроса может задаваться таблица или SQL-инструкция, серверное представление или хранимая процедура. Его свойство CommandType при этом принимает одно из значений: adCmdUnknown � неизвестный, по умолчанию, adCmdText � запрос или хранимая процедура, adCmdTable � таблица для запроса, adCmdTableDirect � непосредственно открываемая таблица, adCmdStoredProc � хранимая процедура на сервере, adCmdFile � файл с набором записей.

Примеры Sub ТекущееСоединениеADO () Dim cnn As ADODB.Connection Set cnn = CurrentProject.Connection MsgBox cnn.ConnectionString If cnn.State = adStateClosed Then MsgBox "Нет подключения" Else MsgBox "Подключение есть" End If Set cnn = Nothing End Sub Sub Соединение1ADO () Dim cnn As ADODB.Connection Set cnn = New ADODB.Connection cnn.Open _ "Provider=SQLOLEDB; Data Source=srv; Initial Catalog=pubs;" & _ "DataBase=базаДанных; User Id=sa; Password=;" MsgBox cnn.ConnectionString If cnn.State = adStateClosed Then MsgBox "Нет подключения" Else MsgBox "Подключение есть" End If cnn.Close End Sub Sub Соединение2ADO () Dim cnn As ADODB.Connection Set cnn = New ADODB.Connection cnn.Provider = "SQLOLEDB" cnn.Properties ("DataSource") = "Источник"

Page 16: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

16

cnn.Properties ("DataBase") = "базаДанных" cnn.Properties ("UserId") = "Пользователь" cnn.Properties ("Password") = "Пароль" cnn.Open MsgBox cnn.ConnectionString If cnn.State = adStateClosed Then MsgBox "Нет подключения" Else MsgBox "Подключение есть" End If cnn.Close End Sub Sub ДоступКПолямADO ()

Dim rst As New ADODB.Recordset rst.Open "Сотрудники", CurrentProject.Connection For i = 0 To rst.Fields.Count - 1

temp = temp & rst.Fields(i).Name & vbCr Next MsgBox "Всего полей: " & Str(rst.Fields.Count) & vbCr & temp

End Sub Sub СвойстваADO ()

Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset cnn.Provider = "Microsoft.Jet.OLEDB.4.0" cnn.Properties ("Data Source") = "D:\ Кадры.mdb" cnn.Open rst.CursorType = adOpenStatic rst.Open �Сотрудники�, cnn

' вот как можно узнать все свойства класса For i = 0 To cnn.Properties.Count - 1

Debug.Print cnn.Properties (i).Name Next

End Sub Public cnnXLS As New ADODB.Connection, _ cnnMDB As New ADODB.Connection, _ cnnDBF As New ADODB.Connection Public rstXLS As New ADODB.Recordset, _ rstMDB As New ADODB.Recordset, _ rstDBF As New ADODB.Recordset Sub Соединения ()

Отключение

cnnXLS.Open "DBQ=D:\ Сотрудники.xls;Driver={Microsoft Excel Driver (*.xls)}" RSTOpen "Сотрудники", cnnXLS, rstXLS

cnnDBF.Open "DBQ=D:\;Driver={Microsoft dBase Driver (*.dbf)}" RSTOpen "T", cnnDBF, rstDBF

Page 17: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

17

cnnMDB.Open "DBQ=D:\ Кадры.mdb;Driver={Microsoft Access Driver (*.mdb)}" RSTOpen "Сотрудники", cnnMDB, rstMDB

End Sub Sub RSTOpen (tbl As String, _

cnn As ADODB.Connection, rst As ADODB.Recordset) MsgBox tbl & " connection: " & cnn.ConnectionString If cnn.State = adStateClosed Then

MsgBox "Нет подключения к " & tbl Else

rst.CursorType = adOpenStatic rst.Open tbl, cnn

End If End Sub Sub Отключение ()

Set cnnXLS = Nothing Set cnnMDB = Nothing Set cnnDBF = Nothing Set rstXLS = Nothing Set rstMDB = Nothing Set rstDBF = Nothing

End Sub Sub ВсеПоля ()

Set базаДанных = CurrentDb Set таблица = базаДанных!t3 For Each поле In таблица.Fields

строка = строка & Chr(13) & поле.Name Next поле MsgBox строка

End Sub Sub ТекущаяЗаписьADO ()

Dim rst As New ADODB.Recordset rst.Open "Сотрудники", CurrentProject.Connection Debug.Print rst.Fields ("Кто"), rst.Fields ("Когда") rst.Close

End Sub Sub Записи1ADO ()

Dim rst As New ADODB.Recordset rst.Open "ЗапросСотрудники", CurrentProject.Connection набор.MoveNext Debug.Print rst.Fields ("Кто"), rst.Fields ("Когда") набор.Move 4 Debug.Print rst.Fields ("Кто"), rst.Fields ("Когда") Set rst = Nothing

End Sub Sub Записи2ADO ()

Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset

Page 18: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

18

cnn.Open "DBQ=D:\;Driver={Microsoft dBase Driver (*.dbf)}" With rst

.Open "Сотрудники", cnn For i = 0 To .Fields.Count - 1

temp = temp & .Fields (i).Name & " " Next temp = temp & vbCr Do While Not .EOF

For i = 0 To .Fields.Count - 1 temp = temp & rst.Fields (i) & " "

Next temp = temp & vbCr .MoveNext

Loop MsgBox "Всего в " & .Source & " полей: " & .Fields.Count & _

vbCr & "Всего записей: " & .RecordCount & vbCr & temp End Sub Sub ПозиционированиеADO ()

Dim rst As New ADODB.Recordset rst.Open "Сотрудники", CurrentProject.Connection, adOpenStatic Do While Not rst.EOF

строка = rst!Кто & " " & rst.AbsolutePosition & _ " из " & rst.RecordCount

If MsgBox (строка, vbOKCancel) = vbCancel Then Exit Do rst.MoveNext

Loop End Sub Sub ОбъектCommand ()

Dim rst As ADODB.Recordset, cmd As ADODB.Command Dim строка As String, счетчик As Integer Set rst = New ADODB.Recordset Set cmd = New ADODB.Command Set cmd.ActiveConnection = CurrentProject.Connection cmd.CommandText = _

"SELECT Кто, Сколько FROM Сотрудники WHERE Сколько>1100" rst.CursorLocation = adUseClient Set rst = cmd.Execute () Do While Not rst.EOF

счетчик = счетчик + 1 строка = строка & Str (счетчик) & " " & rst!Кто & " " & rst!Сколько & vbCr rst.MoveNext

Loop MsgBox строка & "Всего: " & счетчик rst.Close Set cmd = Nothing

End Sub

Для изменения данных следует сначала сделать запись текущей. В модели ADO изменения данных программируются проще, чем в DAO, так

Page 19: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

19

как используется обычный оператор присваивания с последующим обновлением.

В модели ADO используется отличный от DAO синтаксис поиска:

• объектRecordset.Seek (значенияКлюча, параметрыПоиска) • Find (Критерии, Пропуск, направлениеПоиска, Старт)

где аргументы указывают массив переменных искомого значения и константный тип сравнения, число пропускаемых строк и направление. Sub ПравкаADO ()

Dim rst As New ADODB.Recordset строкаSQL = "SELECT * FROM Сотрудники WHERE Сколько <300" rst.Open строкаSQL, _

CurrentProject.Connection, adOpenDynamic, adLockOptimistic With rst

.MoveLast

.Fields ("Кто") = "Новый"

.Update

.Move -5

.Delete

.Close End With

End Sub Sub ПоискADO ()

Dim rst As New ADODB.Recordset rst.Open "Сотрудники", CurrentProject.Connection, _

adOpenStatic, adLockReadOnly rst.Find "Кто = 'Алексин'" Debug.Print rst.Fields ("Где"), rst.Fields ("Сколько") rst.Close

End Sub Sub ПравкаТаблицADO ()

Dim rst As New ADODB.Recordset With rst

.Open "Сотрудники", CurrentProject.Connection, _ adOpenStatic, adLockOptimistic

.Find "Кто = 'Алексин'"

.Fields ("Зачем") = "Отпуск"

.Update

.Close End With

End Sub Sub ДобавлениеADO ()

Dim rst As New ADODB.Recordset With rst

Page 20: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

20

.Open "Сотрудники", CurrentProject.Connection, _ adOpenDynamic, adLockPessimistic

.Find "Кто = 'Гуринов'"

.Fields ("Зачем") = "Отпуск"

.AddNew

.Fields ("Кто") = "Архипов"

.Update

.Close End With

End Sub Sub УдалениеADO ()

Dim rst As New ADODB.Recordset rst.Open "Сотрудники", CurrentProject.Connection, _

adOpenStatic, adLockOptimistic rst.Find "Кто = 'Гуринов'" rst.Delete adAffectCurrent rst.Update rst.Close

End Sub Public Sub УдалениеЗаписиADO()

Dim rst As New ADODB.Recordset rst.Open "SELECT * FROM Сотрудники " & _

"WHERE Сколько < 200", CurrentProject.Connection, _ adOpenStatic, adLockOptimistic

строка = rst.RecordCount & vbCr Do While Not rst.EOF

строка = строка & rst!Кто & vbCr rst.MoveNext

Loop MsgBox строка строка = UCase (InputBox ("Кого удалить?")) rst.Filter = "Кто = '" & строка & "'" rst.Delete rst.UpdateBatch rst.Filter = adFilterNone rst.Requery строка = "После удаления осталось " & rst.RecordCount & vbCr Do While Not rst.EOF

строка = строка & rst!Кто & vbCr rst.MoveNext

Loop MsgBox строка rst.Close

End Sub Sub ЗапросыADO ()

Dim набор As New ADODB.Recordset набор.Open "Сотр", CurrentProject.Connection, adOpenStatic, adLockOptimistic где = "Сколько < 200" DoCmd.RunSQL _

Page 21: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

21

"UPDATE Сотр SET Сколько = 5 WHERE " & где DoCmd.RunSQL _ "UPDATE Сотр SET Кто = 'LG' WHERE " & где Set набор = Nothing

End Sub

Визуальное программирование в Access

Для работы с формами и отчетами используется библиотека Access с базовым классом Application. Основными методами Application являются:

Метод Назначение CloseCurrentDatabase Закрывает текущую базу данных из другой базы NewCurrentDatabase Создает новый объект Database из другого приложения OpenCurrentDatabase Открывает в качестве текущей базы объект Database Quit Закрывает Access Run Запускает процедуру Access из другого приложения RunCommand Запускает команду меню или панели инструментов

Входящее в Access семейство Forms (Формы) содержит формы и их

объекты, принадлежащие классу Controls (Элементы управления). Семейство Reports (Отчеты) включает все отчеты приложения и объекты отчетов того же класса Controls. Семейство Modules (Модули) объединяет все стандартные модули и модули авторских классов, а также модули, связанные с формами и отчетами. Для работы с окнами используется класс Screen. А класс DoCmd позволяет обращаться из модулей к стандартным средствам Access.

Схема обращения к членам библиотеки классов Access:

имяКласса!имяОбъекта[.имяЭлементаУправления].Член

Открытие форм и отчетов выполняется методами OpenForm и OpenReport объекта DoCmd:

• DoCmd.OpenForm Объект [, режимВывода] [, Запрос] _ [, условиеОтбора] [, режимДанных] [, режимОкна] _ [, аргументыОткрытия]

• DoCmd.OpenReport Объект [, режимВывода] [, Запрос] _ [, условиеОтбора] [, режимДанных] [, режимОкна] _ [, аргументыОткрытия]

Обращение к объектам форм и отчетов выполняется по схемам:

• [Forms! Форма!] Объект

Page 22: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

22

• [Reports! Отчет!] Объект • Forms («имяОбъекта») • Reports («имяОбъекта») • Forms (индексОбъекта) • Reports (индексОбъекта) • Forms (ссылочнаяПеременная) • Reports (ссылочнаяПеременная)

Точка отделяет объект от его свойства или метода, а также разделяет объекты подчиненной формы (отчета):

• [Forms! Форма!] [Объект].[свойствоИлиМетод] • [Reports! Отчет!] [Объект].[свойствоИлиМетод] • [Forms!ГлавнаяФорма!]ПодчиненнаяФорма.[Form!] Объект • [Forms!ГлавнаяФорма!]ПодчиненнаяФорма.ееИсточникДанных

Обращение к активным объектам класса Screen в ряде случаев заменяют их свойствами ActiveDataSheet, ActiveForm, ActiveControl, PreviousControl, Application, Parent. А для ссылки на активную форму или отчет из модулей их классов удобно использовать конструкции

• Me.Член • Me!Объект

Закрытие объектов выполняется методом Close класса Access и объекта

DoCmd, а выход из Access � методом Quit:

DoCmd.Close [типОбъекта, имяОбъекта], [параметрСохранения]

• Application.Quit [параметрСохранения] • DoCmd.Quit [параметрСохранения]

где типОбъекта и параметрСохранения выражаются встроенными константами.

Примеры Sub ОткрытиеФормыAccess ()

DoCmd.OpenForm "Форма Таблицы1" MsgBox Forms![Форма Таблицы1].Caption

End Sub Sub ОткрытиеФормAccess ()

On Error GoTo ошибка

Page 23: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

23

Имя = InputBox ("Какую открыть форму?") DoCmd.OpenForm Имя Exit Sub

ошибка: MsgBox "Ошибка " & Err, vbExclamation Exit Sub

End Sub Sub СвойстваФормыAccess ()

DoCmd.OpenForm FormName:="Мы", view:=acDesign, windowmode:=acHidden With Forms!Мы

.Caption = "Сведения о клиентах"

.Modal = True

.DefaultView = 1

.AllowEdits = False

.AutoResize = False

.AutoCenter = True

.Width = 300

.Picture = "d:\ f1.bmp"

.Tag = "0"

.OnActivate = "=FunctionName ()"

.OnCurrent = "[Процедура обработки событий]"

.OnClose = "Макрос" End With DoCmd.OpenForm "Мы"

End Sub Sub ОткрытиеОтчетаAccess ()

DoCmd.OpenForm "Выставка" ответ = MsgBox ("Вывести отчет ?", vbYesNoCancel) If ответ = vbYes Then DoCmd.OpenReport "Выставка", acPreview MsgBox Screen.ActiveReport.Name

End Sub Sub ЗакрытьФормуОтчет ()

DoCmd.OpenForm �Сотрудники�,,, �Должность = �дилер� � MsgBox Forms (�Сотрудники�).Caption DoCmd.Close acForm, "Сотрудники", acPrompt DoCmd.OpenReport �Сотрудники�, acViewPreview MsgBox Reports!Сотрудники.Page DoCmd.Close Save:=acSaveYes

End Sub Private Sub Form_Current ()

Form_имяФормы.Caption = Time MsgBox Me.Name + Me.Tag

End Sub Function ButtonOpenNextForm (fName As String)

Dim имяЭтойФормы As String имяЭтойФормы = Screen.ActiveForm.Name Screen.ActiveForm.Visible = False DoCmd.OpenForm fName

Page 24: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

24

Screen.ActiveForm.Tag = имяЭтойФормы End Function Function ButtonCloseAndReturn ()

Dim имяПредыдущейФормы As String If Screen.ActiveForm.Tag = "" Then

DoCmd.Close Else

имяПредыдущейФормы = Screen.ActiveForm.Tag DoCmd.Close Forms (имяПредыдущейФормы).Visible = True

End If End Function Function КонецРаботыAccess ()

ответ = MsgBox ("Закончить работу?", vbYesNoCancel + vbQuestion) Select Case ответ

Case vbYes DoCmd.Quit acPrompt КонецРаботыAccess = True

Case vbNo DoCmd.Close acForm, "Форма Таблицы1", acSaveYes КонецРаботыAccess = False

Case vbCancel КонецРаботыAccess = False

End Select End Function

В следующей таблице приведены наиболее общие свойства объектов Form и Report (обозначения: o � объект, i � целый, b � логический, s � строковый, ro � только чтение):

Свойство Тип Описание ActiveControl ro, o Активный элемент управления открытой формы Count ro, i Число открытых элементов семейства CurrentRecord ro, i Номер текущей записи формы Cycle i AllRecords, CurrentRecord или CurrentPage в форме Dirty ro, b Изменена ли текущая запись после сохранения Form ro, o Ссылка на форму HasData ro, i В отчете есть данные (-1) или нет данных (0) Me ro, o Сама форма или отчет MenuBar s Имя строки меню или стандартное меню («») Modal b Модальная ли форма NewRecord ro, b Является ли текущая запись формы новой OrderBy s Список полей, определящий порядок сортировки Painting b Необходимо ли перерисовать форму

Page 25: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

25

Picture bmp Имя файла фона PopUp b Всплывающая ли форма RecordSetClone ro, o Доступ к свойствам записей RecordSource RecordSource s Источник данных: таблица или запрос Report ro, o Ссылка на отчет Section ro, o Доступ к области или ее элементу управления ShortcutMenuBar s Имя контекстного меню или стандартное («») StatusBarText s Текст строки состояния формы TabIndex i Номер элемента управления формы ToolBar s Имя панели инструментов или стандартная («») Visible b Отображается ли на экране

Некоторые свойства являются свойствами по умолчанию, и их можно

опускать:

Свойство Имя объекта Объект Value Флажок CheckBox Text Поле со списком ComboBox Text Список ListBox Value Переключатель OptionButton OptionValue Группа переключателей OptionGroup Value Поле TextBox Value Переключатель ToggleButton

Некоторые методы объектов Form: Метод Действие

GoToPage Передает фокус первому элементу управления активной формы Recalc Обновляет вычисляемые элементы, но не функции SQL Refresh Обновляет записи без учета добавлений и удалений Repaint Обновляет экран и завершает вычисления Requery Обновляет источник данных формы SetFocus Передает фокус элементу, ранее последним им владевшему Undo Отменяет изменения в форме

Обновление объектов, активных таблиц и запросов выполняется методом Requery:

• имяОбъекта.Requery • DoCmd.Requery

Page 26: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

26

Событие До обновления (BeforeUpdate) возникает в момент перемещения с записи на запись. Если пользователь изменяет запись, свойство формы Dirty становится истинным, и если после этого аргументу Cancel присвоить значение True, событие отменяется. Метод Undo восстанавливает исходные данные. Событие После обновления (AfterUpdate) используется для выполнения определенных действий в зависимости от введенных в поле значений. При передаче фокуса от одного элемента управления к другому возникают события Вход (Enter), соответствующее приему фокуса, и Выход (Exit), соответствующее его потере.

Для выявления идентичных объектов можно использовать оператор Is. Он определяет логический результат как Null или Not Null.

Для ссылок из формы или отчета на объект RecordSet используется свойство RecordSetClone. Значение этого свойства формы определяет копию записей базовой таблицы или запроса, указанных в свойстве Источник записей формы. В частности, если форма основана на запросе, то обращение к свойству RecordSetClone эквивалентно созданию копии объекта RecordSet с помощью того же запроса. Если к форме будет дополнительно применен фильтр, то объект RecordSet создается с учетом фильтра:

Примеры Sub СвободныеЭлементыAccess()

Dim надпись As Object, поле As Object DoCmd.OpenForm "Форма1" Set надпись = Forms!Форма1.Надпись1 Set поле = Forms!Форма1.Поле0 надпись.Caption = поле.Text

End Sub Sub ПолеФормыAccess ()

Dim поле As Control DoCmd.OpenForm "Клиенты" Set поле = Forms!Клиенты![Обращаться к] поле = "Сергей Петров" Forms!Клиенты.Refresh

End Sub Sub ОбновлениеЧерезФормуAccess ()

DoCmd.OpenForm "Сотрудники", , , "Фамилия = 'Иванов'" Set где = Forms!Сотрудники If IsNull (где.оклад) Then где.оклад = 0 где.оклад = InputBox ("Можно заменить " & Str (где.оклад), , где.оклад) DoCmd.Requery

End Sub Sub СтильПоляФормы ()

DoCmd.OpenForm "Клиенты", acDesign, , , , acHidden Set поле = Forms!Клиенты!Имя поле.FontSize = 14

Page 27: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

27

поле.FontName = "Times New Roman Cyr" поле.Enabled = False DoCmd.Save acForm, "Клиенты" DoCmd.OpenForm "Клиенты"

End Sub Sub НадписьAccess ()

Set форма = Forms![Сотрудники] With форма

.[ОкладНадпись].Caption = "Должность"

.Controls![ОкладНадпись].FontName = "Arial Cyr"

.Оклад.SetFocus

.Оклад.Requery

.Дата.Enabled = False End With

End Sub Sub Form_Current ()

текст = Me![Поле1] Like "К*" If текст Then MsgBox "Кузнецов!" Else MsgBox "Не он"

End Sub Sub Кнопка_ Click ()

On Error GoTo сообщение Err.Clear With Me

!Премия.SetFocus память = !Премия.Text !Оклад.SetFocus !Оклад.Text = Val (!Оклад.Text) + Val (память) .Refresh

End With Exit Sub

сообщение: MsgBox "Ошибка номер " & Err

End Sub Sub КнопкаОшибки_Click ()

On Error GoTo сообщение Err.Clear число = InputBox ("Введите число") сумма = 50 / число Me!Оклад.SetFocus Me!Оклад.Text = сумма Me.Refresh Exit Sub

сообщение: плохо = "Ошибка № " & Str (Err.Number) & " возникла в " _

& Err.Source & Chr (13) & Err.Description

Page 28: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

28

MsgBox плохо, , "Ошибка" End Sub Sub Форма1Access_BeforeUpdate (Cancel As Integer)

If Me.Dirty Then If MsgBox ("Сохранить изменения?", vbYesNo) = vbNo Then Me.Undo

End If End Sub Sub Форма1Access_AfterUpdate ()

MsgBox "В " & Me.Name & � кое-что изменилось ;-)� End Sub Sub НавигацияAccess()

DoCmd.OpenForm "Сотрудники" Set форма = Forms!Сотрудники DoCmd.GoToRecord , , acLast форма.Надпись.Caption = Str (форма.CurrentRecord) DoCmd.GoToRecord , , acNewRec форма.Фамилия = InputBox ("Следующий?") форма.Refresh

End Sub Function ПодчиненнаяФормаAccess ()

DoCmd.OpenForm "Главная" DoCmd.GoToControl "Подчиненная форма" DoCmd.GoToRecord , , acNewRec With Forms!Главная

![Подчиненная форма]!ПодчТовар = !КлиентыТовар ![Подчиненная форма]!ПодчНазвание = !КлиентыНазвание ![Подчиненная форма]!ПодчЦена = !КлиентыЦена

End With Forms!Главная.Refresh

End Function Sub Дни_Click ()

On Error GoTo конец Dim день (1) As Date, ошибки As Integer, поле As Object Set поле = Me!дата DoCmd.GoToRecord , , acFirst Do While 1

день (0) = поле DoCmd.GoToRecord , , acNext день (1) = поле If DateDiff ("d", день (0), день (1)) <> 1 Then

MsgBox день (0) & " или " & день (1) & " неверно" ошибки = ошибки + 1

End If Loop

конец: MsgBox "Всего ошибок: " & Str (ошибки) End Sub

Page 29: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

29

Sub ОткрытыеОтчеты () список = "Открыто отчетов: " & Reports.Count For Each отчеты In Reports

список = список & Chr (13) & отчеты.Name For Each объекты In отчеты.Controls

список = список & Chr(13) & "Объект " & объекты.Name Next объекты

Next отчеты MsgBox список

End Sub Sub АнализТаблицыЧерезФорму ()

DoCmd.OpenForm "Выставка" MsgBox Forms (�Выставка�).RecordsetClone.RecordCount & " записей "

End Sub Sub AccessForm_Open ()

If Me.RecordsetClone.RecordCount = 0 Then MsgBox "Записей нет", vbInformation

Else MsgBox Me.RecordsetClone.RecordCount & " записей"

End If End Sub Sub ФормаADO ()

Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset cnn.Open "DBQ=D:\VAL\Access\Access03\Сотрудники.xls;" _

& "Driver={Microsoft Excel Driver (*.xls)}" rst.CursorType = adOpenStatic rst.Open Лист1, cnn DoCmd.OpenForm �Form1� Set Forms (�Form1�).Recordset = rst Forms (�Form1�).Controls ("Надпись").Caption = rst.RecordCount Forms (�Form1�).Controls ("Список").RowSource = "select * from rst.Source"

End Sub Public cnnDBF As New ADODB.Connection Public rstDBF As New ADODB.Recordset Sub ПодключениеКФормеADO ()

ConnectStr = "DBQ=D:\;Driver={Microsoft dBase Driver (*.dbf)}" cnnDBF.Open ConnectStr With rstDBF

.Open "select * from " & ВыборФайла () & _ " where [отдел]=15", cnnDBF, adOpenDynamic, adLockOptimistic MsgBox ДобавитьУдалить () .Close .Open "select * from " & ВыборФайла () _ & " where [отдел]=15", cnnDBF, adOpenStatic, adLockPessimistic

End With DoCmd.OpenForm "фILM_Test"

Page 30: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

30

Set Forms ("фILM_Test").Recordset = rstDBF End Sub Function ВыборФайла () As String

Select Case Forms ("фILM_Test").Группа10 Case 1:

ВыборФайла = "ILMTest1" Forms ("фILM_Test").Caption = "ILMTest1"

Case 2: ВыборФайла = "ILMTest2" Forms ("фILM_Test").Caption = "ILMTest2"

Case 3: ВыборФайла = "ILMTest3" Forms ("фILM_Test").Caption = "ILMTest3"

End Select End Function Function ДобавитьУдалить () As String

With rstDBF .AddNew .Fields ("КОГДА") = #1/31/2003# .Fields ("ОТДЕЛ") = 15 .AddNew .Fields ("КОГДА") = "31.1.03" .Fields ("ОТДЕЛ") = 15 .MoveFirst Do While Not .EOF

myField = .Fields ("КОГДА") If DateDiff ("yyyy", myField, Date) > 60 Then

.Delete cnt = cnt + 1

End If .MoveNext

Loop End With AddDelete = "Выполнено " & cnt & " удалений"

End Function Sub ЗапросSQL ()

DoCmd.OpenForm "Сотрудники" DoCmd.RunSQL �UPDATE Сотрудники SET Родился = #01/12/02#� _

& �WHERE Номер = 28� DoCmd.RunSQL �DELETE FROM Сотрудники WHERE Родился = #01/12/02#� DoCmd.RunSQL �INSERT INTO Сотрудники (ФИО, Родился, Должность)� _

& �VALUES (�Кто-то�, #01/12/12#, �Дилер�)� DoCmd.Requery

End Sub Sub ПеренумероватьЗаписи ()

DoCmd.RunSQL "ALTER TABLE Сотрудники DROP COLUMN z" DoCmd.RunSQL "ALTER TABLE Сотрудники ADD COLUMN z COUNTER"

Page 31: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

31

DoCmd.OpenForm "Сотрудники" End Sub Sub ЗапросAccess ()

DoCmd.SetWarnings False DoCmd.OpenForm "Сотрудники", acDesign, , , , acHidden DoCmd.OpenQuery "Запрос1" DoCmd.Close acForm, "Сотрудники" DoCmd.SetWarnings True

End Sub

Меню

Меню создаются и редактируются под управлением редактора меню или с помощью процедур, размещаемых в модулях. Редактор меню представлен вкладкой Команды меню Вид .Панели инструментов .Настройка�

Различают встроенные меню приложения и авторские меню пользователя. Каждому пункту авторского меню соответствует индивидуальный макрос или функция. Редактор меню позволяет удалять любой пункт меню, открыв его контекстное меню и выбрав из него Сброс или Удалить при открытом окне Настройка. При этом встроенные меню не удаляются, а скрываются. В любое меню можно добавить новый пункт через вкладку Команды меню Вид .Панели инструментов .Настройка, перетащив необходимый элемент из списка Команды в меню.

Для программирования строк меню используются объекты классов CommandBars и CommandBar из библиотеки Microsoft Office. Первый из классов хранит все строки встроенных меню. Он служит инструментом использования меню приложения и создания авторских меню. Второй класс представляет все пункты конкретного меню. Он служит инструментом использования пунктов меню приложения и создания авторских пунктов. Ссылки на пункты меню определяются свойством Controls.

Для отображения контекстных меню используется метод ShowPopup, а для удаления всех новых меню, не выведенных на экран, � методы Delete и Reset.

Примеры Sub ВсеСтрокиМеню ()

For Each строкаМеню In CommandBars Debug.Print строкаМеню.Index, " ", строкаМеню.Name

Next End Sub Sub ВсеПунктыМеню ()

For Each пункт In CommandBars ("Menu Bar").Controls список = список & пункт.Index & " " & пункт.Caption & Chr(13)

Page 32: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

32

Next MsgBox список

End Sub Sub ЕщеСтрокаМеню ()

Set новоеМеню = CommandBars.Add (Name:="Игры", _ Position:=msoBarFloating, MenuBar:=False, Temporary:=True)

новоеМеню.Visible = True End Sub Sub НаполнениеСтрокиМеню ()

Set меню = CommandBars (CommandBars.Count) Set новыйПункт = меню.Controls.Add (Type:=msoControlPopup) новыйПункт.Caption = "Информация" Set подпункт1 = новыйПункт.Controls.Add (Type:=msoControlPopup) подпункт1.Caption = "О меню" Set подпункт2 = новыйПункт.Controls.Add (Type:=msoControlPopup) With подпункт2

.Caption = "О панелях"

.Enabled = True

.OnAction = "процедураИлиМакрос" End With

End Sub Sub УдалениеМеню ()

For Each меню In CommandBars If Not меню.BuiltIn And Not меню.Visible Then меню.Delete

Next End Sub Sub ВосстановлениеМеню ()

On Error Resume Next For i = 1 To CommandBars.Count

CommandBars (i).Reset Next

End Sub

Панели инструментов

VBA позволяет изменить изображение любой кнопки панели инструментов с помощью меню Вид .Панели инструментов .Настройка. При программировании панели инструментов рассматриваются как разновидности меню.

Примеры Sub НоваяПанельИнструментов ()

On Error GoTo ошибка Dim новаяПанель As CommandBar Set новаяПанель = CommandBars.Add (Name:="Игры", _

Position:=msoBarFloating, MenuBar:=False, Temporary:=True)

Page 33: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

33

With новаяПанель.Controls .Add Type:=msoControlEdit .Add Type:=msoControlButton , Id:=4 .Add Type:=msoControlButton , Id:=21 .Add Type:=msoControlDropdown .Add Type:=msoControlComboBox

End With новаяПанель.Controls (1).OnAction = "мойМакрос" новаяПанель.Visible = True номерПанели = CommandBars.Count MsgBox "Перед вами панель " & новаяПанель.Name _

& " номер " & номерПанели ошибка: CommandBars ("Игры").Delete End Sub Sub НовыйЭлемент ()

On Error GoTo ошибка Dim панель As CommandBar Dim элемент As CommandBarComboBox Set панель = CommandBars (3) Set элемент = панель.Controls.Add (Type:=msoControlDropdown) With элемент

.AddItem "Кофе", 1 .AddItem "Чай", 2 .AddItem "Сок", 3 .DropDownWidth = 75 .DropDownLines = 3 .ListIndex = 3 End With панель.Visible = True

ошибка: элемент.Delete

End Sub Sub ПанелиИнструментов ()

For Each панель In CommandBars If панель.Index > 2 And панель.Index < 19 Then панель.Visible = False

Next панель MsgBox "Все панели инструментов скрыты." & Chr (13) & _

"Сейчас они будут последовательно возвращаться" For Each панель In CommandBars

If панель.Index > 2 And панель.Index < 19 Then панель.Visible = True MsgBox "Это панель " & панель.Name

End If Next панель If MsgBox ("Убрать лишние ?", vbYesNo) = vbYes Then

For счетчик = 18 To 5 Step -1 CommandBars (счетчик).Visible = False

Next счетчик

Page 34: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

34

End If End Sub

Начальная установка интерфейса

База данных Access открывается в соответствии с настройками меню Сервис .Параметры запуска или макросом AutoExec.

Примеры Sub ПараметрыЗапуска () ЗадатьСвойство "StartupForm", dbText, "МояФорма" ЗадатьСвойство "AppTitle", dbText, "Моя форма" ЗадатьСвойство "StartupShowDBWindow", dbBoolean, False ЗадатьСвойство "StartupShowStatusBar", dbBoolean, False ЗадатьСвойство "AllowBuiltinToolbars", dbBoolean, True ЗадатьСвойство "AllowFullMenus", dbBoolean, True ЗадатьСвойство "AllowBreakIntoCode", dbBoolean, False ЗадатьСвойство "AllowSpecialKeys", dbBoolean, True ЗадатьСвойство "AllowBypassKey", dbBoolean, TrueEnd Sub MsgBox(�OK�) End Sub Function ЗадатьСвойство (имяСвойства As String, типСвойства As Variant, _ значениеСвойства As Variant) As Integer Const conPropNotFoundError = 3270

On Error GoTo еслиНетТакогоСвойства CurrentDb.Properties (имяСвойства) = значениеСвойства ЗадатьСвойство = True конец: Exit Function еслиНетТакогоСвойства: If Err = conPropNotFoundError Then ' свойство не установлено Set свойство = CurrentDb.CreateProperty (имяСвойства, _ типСвойства, значениеСвойства) CurrentDb.Properties.Append свойство Resume Next Else ' неясная ошибка ЗадатьСвойство = False Resume конец End If End Function Sub АнтиШифт ()

On Error GoTo добавитьСвойство If MsgBox ("Нужен ли Шифт?", vbYesNo) = vbYes Then

нуженЛи = True Else

нуженЛи = False

Page 35: Access .. VBA - edrive.narod.ruedrive.narod.ru/AccessVBA.pdf · доступом на vba. Система управления Access обслуживает интерфейс пользователя

35

End If CurrentDb.Properties ("AllowBypassKey") = нуженЛи MsgBox "Свойство установлено" Exit Sub

добавитьСвойство: CurrentDb.Properties.Append _

CurrentDb.CreateProperty ("AllowBypassKey", DbBoolean, нуженЛи) MsgBox "Свойство добавлено и установлено"

End Sub

Sub УдалитьСвойство () On Error GoTo нетТакогоСвойства CurrentDb.Properties.Delete "AllowBypassKey" Exit Sub

нетТакогоСвойства: MsgBox "Нет такого свойства"

End Sub