Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 Курс Информатика VBA(ЗО) / Книги / В.Д.Хорев - Самоучитель программирования на VBA в Microsoft Office

.pdf
Скачиваний:
2701
Добавлен:
31.05.2015
Размер:
21.66 Mб
Скачать

Работа с объектами MS Access 183

Метод Append

Но дело еще не сделано — поле создано, существует и содержится в переменной MyFLD. Но в состав таблицы “Клиенты” оно еще не включено. Метод Append позволяет включить поле в таблицу.

MyTDF.Fields.Append MyFLD

Метод Close: закрытие базы данных

Остается закрыть базу данных, и освободить выделенную под переменную MyDB память:

MyDB.Close

Set MyDB = Nothing

Если теперь запустить Access и открыть базу данных MyOffice, то нетрудно убедиться, что в таблице (в таблице, но не в форме!) “Клиенты” появилось новое поле.

Метод CreateTable: создание таблицы

Если требуется создать новую таблицу в существующей базе данных, то действовать следует аналогичным образом, только вместо открытия таблицы обращением к семейству TableDefs

следует использовать метод CreateTable того же семейства, и, пока на таблицу указывает объектная переменная, создать в ней необходимые поля. Точно так же, как и в случае с полями, созданную таблицу необходимо затем включить в состав семейства при помощи метода Append.

Предположим, требуется добавить в офисную базу данных таблицу “Счета” для ведения лицевых счетов клиентов. Каждая запись в таблице должна состоять из двух полей: поля “ЛицевойС-

чет” (числового типа “длинное целое”) и поля “Остаток” для денежных значений типа Currency. Вот необходимая последовательность действий для ее создания.

1.Объявить необходимые переменные:

Dim MyTDF As TableDef

Dim MyDB As Database

2.Открыть базу данных:

Set MyDB = OpenDatabase("C:\MyOffice.mdb")

3.Создать новую таблицу:

Set MyTDF = MyDB.CreateTableDef("ЛицевыеСчета")

4.Создать в новой таблице два поля:

With MyTDF

.Fields.Append.CreateField("ЛицевойСчет", dbLong)

.Fields.Append.CreateField("Остаток", dbCurrency)

End With

5.Включить новую таблицу в базу данных:

MyDB.TableDefs.Append MyTDF

6.Закрыть базу данных и освободить память:

MyDB.Close

Set MyDB = Nothing

184 Глава 7. В мире объектов MS Office

Свойства полей

При создании новых полей можно задавать различные свойства поля. Набор возможностей здесь аналогичен набору возможностей при работе в окне конструктора таблиц.

Ввод в поле таблицы значения по умолчанию (DefaultValue)

Например, для поля можно задать значение по умолчанию, то есть значение, которое будет в нем содержаться, если пользователь не введет в него никакого значения:

Dim MyFLD As Field, MyTDF as TableDef, MyDB As Database

Set MyDB = OpenDatabase("C:\MyOffice.mdb ") Set MyTDF = MyDB.TableDefs("Клиенты")

Set MyFLD = MyTDF.Fields("Телефон") MyFLD.DefaultValue = "000-00-00"

Свойство Required: проверка допустимых значений вводимых в поле

Свойство Required определяет, допустимы ли для поля пустые значения. Поле нельзя оставлять пустым. Access не позволит создать новую запись, пока поле не будет заполнено:

Set MyFLD = MyTDF.Fields("Телефон")

MyFLD.Required = True

Свойство Type: тип данных

Тип данных, для хранения которых предназначено поле, задается свойством Type. В это свойство необходимо записать соответствующую константу. Если поле должно быть текстовым, то одновременно следует в свойстве Size указать размер поля:

Set MyFLD = MyTDF.Fields("ОписаниеКлиента")

MyFLD.Type = dbText

MyFLD. Size = 200

Свойство FieldSize: размер поля

Размер поля любого типа содержится в свойстве FieldSize, которое не следует путать со свойством Size. Значение в FieldSize показывает физический размер в байтах, которое поле занимает в базе данных.

Константы типа данных поля

Полный список констант, определяющих тип данных поля, можно узнать при помощи справочной системы. Далее перечислены некоторые из них:

dbCurrency — денежные значения типа Currency; dbDate — значения даты/времени;

dbFloat — дробные числа с плавающей точкой; dbInteger — целые числа;

dbText — текстовые значения.

Работа с содержимым базы данных Access

“Взаимоотношения” Access и VBA имеют свою предысторию, которая накладывает отпечаток на принципы работы в VBA-коде с данными Access. Дело в том, что собственные средства автоматизации Access существовали еще до изобретения VBA. Это так называемые макрокоманды Access. Использование этих макрокоманд — и по сей день самый простой способ работать с базой данных Access.

Работа с объектами MS Access 185

Объект DoCmd

Для интеграции механизма макрокоманд в код VBA используется специальный объект DoCmd (выполнить команду), методы которого в точности соответствуют старым макрокомандам Access.

Объект DoCmd позволяет оперировать содержимым не только таблиц, но и форм и других объектов базы данных. Ниже приведен ряд примеров, иллюстрирующих работу с методами объекта

DoCmd.

Метод OpenTable: открытие таблицы

Пример, открывающий форму “Клиенты” с отображением записей, в которых поле “Фамилия” содержит значение “Иванов”:

DoCmd.OpenTable "Клиенты"

DoCmd.ApplyFilter , "Фамилия ='Иванов'"

Метод OutputTo: вывод таблицы

Пример вывода таблицы “Клиенты” в файл формата HTML:

DoCmd.OutputTo acOutputTable, "Клиенты", _ acFormatHTML, "C:\Clients.htm"

Метод PrintOut: печать таблицы

Пример, открывающий форму “Клиенты” и печатающий страницы 1-5:

DoCmd.OpenTable "Клиенты"

DoCmd.PrintOut acPages, 1, 5

Метод OpenForm: открытие формы

Метод Maximize: развернуть форму

Пример, открывающий форму “Клиенты” и разворачивающий ее на весь экран:

DoCmd.OpenForm "Клиенты"

DoCmd.Maximize

Метод Maximize: свернуть форму до значка

Пример, открывающий форму “Клиенты” и сверачивающий ее в значок на рабочей поверхности окна Access:

DoCmd.OpenForm "Клиенты"

DoCmd.Minimize

Метод GoToRecord: навигация формы

Для навигации формы, то есть для перемещения формы по записям таблицы, используют метод GoToRecord. Пример, открывающий форму “Клиенты” с переходом на 101-ю запись:

DoCmd.OpenForm "Клиенты"

DoCmd.GoToRecord acDataForm, "Клиенты", acGoTo, 101

Метод GoToControl: передача фокуса элементу управления формы

Метод GoToControl служит для передачи фокуса одному из элементов управления формы. Открыть форму “Клиенты” и поместить курсор в поле “E-Mail”:

186 Глава 7. В мире объектов MS Office

DoCmd.OpenForm "Клиенты"

DoCmd.GoToControl "E-Mail"

Свойство AllowDeletions: запрет удаления записей пользователем

Пример, открывающий форму “Клиенты” и запрещающий в ней удаление записей пользователем:

Dim MyFrm As Form

DoCmd.OpenForm "Клиенты" Set MyFrm = Forms![Клиенты]

MyFrm.AllowDeletions = False

Свойство AllowEdits: запрет изменения записей

Пример, запрета внесения изменений в существующие записи при помощи формы “Клиенты”:

DoCmd.OpenForm "Клиенты"

Set MyFrm = Forms![Клиенты]

MyFrm.AllowEdits = True

Свойства формы

Семейство Controls

Поля, списки и вообще все размещенные на форме элементы управления доступны посредством семейства Controls данной формы. Например, вот как можно открыть форму “Клиенты” и загрузить значение “Иванов” в поле “Фамилия”:

DoCmd.OpenForm "Клиенты", acNormal

Set MyFrm = Forms![Клиенты]

MyFrm.Controls("Фамилия").Value = "Иванов"

Свойство CurrentRecord

Свойство формы CurrentRecord возвращает номер текущей записи (это свойство доступно только для чтения). Код, позволяющий вывести на экран окно-сообщение с номером текущей записи:

DoCmd.OpenForm "Клиенты", acNormal

Set MyFrm = Forms![Клиенты]

MsgBox "Текущая запись: " + MyFrm.CurrentRecord

Свойство Dirty

Свойство Dirty сигнализирует о том, что запись содержит несохраненные изменения:

DoCmd.OpenForm "Клиенты", acNormal Set MyFrm = Forms![Клиенты]

If MyFrm.Dirty Then

MsgBox "Запись изменена. Сохранить?", vbYesNo

End If

Работа с объектами MS Access 187

Свойства FilterOn и Filter

Пользуясь свойством Filter можно наложить фильтр на отображаемые формой записи. При этом фильтр необходимо включить, присвоив логическое значение True свойству FilterOn. Отключить фильтр можно присваиванием значения False.

Пример, открывающий форму “Все операции” с отображением только тех записей, где сумма операции больше 1000:

DoCmd.OpenForm "Все операции", acNormal Set MyFrm = Forms![Все операции]

MyFrm.Filter = "СуммаОперации > 1000" MyFrm.FilterOn = True

Пример, открывающий форму “Клиенты” с отображением только тех записей, где у клиента есть адрес E-Mail (то есть, поле “E-Mail” не пусто):

DoCmd.OpenForm "Клиенты", acNormal Set MyFrm = Forms![Клиенты]

MyFrm.Filter = "[E-Mail] <> ‘’" MyFrm.FilterOn = True

Свойство NavigationButtons

Свойство NavigationButtons определяет наличие в окне формы кнопок перехода и номера записи Пример, открывающий форму “Клиенты” без навигационных кнопок:

DoCmd.OpenForm "Клиенты", acNormal Set MyFrm = Forms![Клиенты]

MyFrm.NavigationButtons = False

Семейство Forms

Вообще, все открытые формы доступны посредством семейства Forms. Это семейство можно просматривать при помощи цикла For…Each. Пример, скрывающий все открытые формы:

Dim MyFrm As Form

For Each MyFrm In Forms MyFrm.Visible = False

Next

Пример, закрывающий все открытые формы с запросом на сохранение изменений:

Dim MyFrm As Form

For Each MyFrm In Forms

MyFrm.Close acForm, MyFrm.Name, acSavePrompt

Next

188 Глава 7. В мире объектов MS Office

Метод Quit: закрытие базы данных

Завершает работу с базой данных метод Quit. Окно Access при этом также закрывается. Пример, закрывающий базу данных с выдачей запроса на сохранение внесенных изменений:

DoCmd.Quit acQuitPrompt

см. также в гл. 9 раздел “Объектная модель Outlook 2000”.

Глава 8

VBA-программирование: примеры и иллюстрации

В предыдущих главах было совершено своеобразное путешествие по основным приложениям пакета MS Office, с целью изучения возможностей макросов VBA для автоматизации типичных задач. Ни сам программный пакет MS Office, ни возможности VBA-программирования в приложениях Office, конечно же, этим не исчерпываются. В состав MS Office входят и другие приложения, а также множество вспомогательных инструментальных средств. Макросы VBA с успехом работают в презентациях MS PowerPoint и в формах MS Outlook, наконец, даже в тех приложениях, которые были затронуты (MS Word, MS Excel, MS Access), осталось множество тем, о которых не было сказано ни слова.

см. подробнее о программировании в MS Outlook в гл. 9 “Программирование в Outlook: документооборот и электронная почта”.

Кроме того, в рабочей среде Office, с точки зрения VBA-программирования, существует множество объектов, которые вообще не относятся ни к одному из приложений, вернее сказать, относятся сразу ко всем приложениям. Это объекты самого пакета MS Office, которые обслуживают интегрированную среду приложений Office, те объекты, которые обеспечивают, в частности, пользовательский интерфейс. Например, знаете ли вы, что любое приложение (допустим, Word) при помощи VBA-кода можно изменить до неузнаваемости, преобразовав не только внешний вид окна приложения, но и “переработав” полностью его систему меню и панели инструментов? При помощи макросов VBA можно создать собственную версию Word (которая будет разительно отличаться от Word в стандартном варианте), приспособленную для решения специфичных для конкретного пользователя задач.

В такой области, как форматирование (и вообще — изменение внешнего вида) объектов MS Office осталось множество не упомянутых вещей.

Попробуем совершить небольшую “обзорную экскурсию” по миру VBA-программирования в среде MS Office, чтобы посетить те места, которые были пропущены, но где стоит побывать. Сделаем это в форме множества небольших примеров VBA-кода, снабженных иллюстрациями и пояснениями.

Речь не идет о законченных процедурах-макросах. Здесь будем приведен программный код в виде нескольких строк исходного текста, и описаны результаты его выполнения. Любой из этих фрагментов может быть использован в пользовательском макросе или процедуре обработки события.

Чтобы проверить подобный пример в действии и поэкспериментировать с ним, можно создать макрос с произвольным именем, например, при помощи команды Сервис | Макрос | Макросы или любым другим способом.

В окне редактора Visual Basic любой макрос, в тексте которого находится курсор ввода, можно запустить нажатием клавиши [F5], а при помощи клавиши [F8] можно выполнять макрос в режиме отладки, построчно.

Программирование объектов интегрированной среды MS Office 191

Программирование объектов интегрированной среды MS Office

Вот примеры кода, работающего с объектами интегрированной среды MS Office. Все упоминаемые здесь объекты не относятся к какому-либо приложению. На рис. 8.1 изображен фрагмент окна MS Word, иллюстрирующий результат выполнения программного кода, однако в MS Excel этот фрагмент выполнит точно такую же операцию, только по отношении к панели инструментов Excel. Никаких ссылок задавать для этого не требуется, поскольку речь идет об объектах, общих для всех приложений Office.

Панели инструментов и меню в приложениях MS Office

Объекты типа CommandBar

В объектной модели Office все панели инструментов и меню представлены объектами типа CommandBar. Каждая панель инструментов, строка меню, каждое меню в строке меню, и даже подменю, заключающееся в пункте меню — это объект типа CommandBar. Все объекты CommandBar приложения (не имеет значения, о каком приложении идет речь — макрос VBA может даже “не знать”, в какой именно среде он работает) объединены в семейство CommandBars данного приложения.

Объекты типа CommandBarControl

Находящиеся на панели инструментов элементы управления представлены объектами типа

CommandBarControl, которые объединены в семейство CommandBarControls. Вообще го-

воря, дело обстоит несколько сложнее, но для решения простейших задач такого представления вполне достаточно. Как знает каждый пользователь, занимавшийся настройкой среды хотя бы одного из приложений MS Office 2000, панели инструментов подвержены самым различным изменениям. В окне приложения может присутствовать множество панелей или же ни одной. Все инструментальные панели, доступные в меню Вид | Панели инструментов. Кнопки и прочие элементы управления можно убрать с панели или поместить на любую панель. То же самое касается и меню. Набор меню и команд каждый пользователь настраивает произвольным образом при помощи диалогового окна Сервис | Настройка.

Метод FindControl: поиск элемента управления

По этой причине довольно затруднительно было бы оперировать жестко заданными элементами управления на жестко заданных панелях инструментов. Чтобы обратиться к конкретному элементу управления, используют метод FindControl семейства CommandBars. Этот метод способен найти элемент управления по его “личному номеру” — коду-идентификатору. Чтобы посмотреть на деле, как можно управлять элементами управления на инструментальных панелях MS Office, объявим переменную типа CommandBarControl:

Dim MyCon As CommandBarControl

Затем используем метод FindControl семейства CommandBars текущего приложения, чтобы присвоить переменной в качестве значения кнопку Открыть на панели инструментов Стандартная (идентификатор этой кнопки — число 23).

Set MyCon = CommandBars.FindControl(ID:=23)

Теперь переменная MyCon представляет хорошо всем знакомую кнопку (см. рис. 8.1), при помощи которой пользователи, обычно, открывают документы приложения

192 Глава 8. VBA-программирование: примеры и иллюстрации

ПРИМЕЧАНИЕ

Еще раз укажим на то, что на рис. 8.1 изображен фрагмент окна Word, однако все сказанное в равной мере относится к любому приложению Office, где есть панель инструментов Стандартная.

Рис. 8.1. Кнопка Открыть присутствует на па-

Рис. 8.2. Кнопка Открыть получила рисунок,

нели инструментов Стандартная большинства

идентичный рисунку кнопки Вырезать, однако

приложений Office

функции кнопки от этого не поменялись

Свойство FaceId: изменение значка на элементе управления

Если теперь обратиться к переменной MyCon, то можно что-нибудь сделать с кнопкой Открыть. Например, чтобы заменить рисунок (значка) на кнопке, следует изменить значение свойства FaceId (идентификатор “лица” кнопки):

MyCon.FaceId = 21

В результате кнопка Открыть “примет обличье” кнопки Вырезать, однако на выполняемые кнопкой функции это никак не повлияет.

Создание пользовательской панели инструментов

Немного усложним теперь постановку задачи. Будем по-прежнему использовать “готовую” кнопку Открыть, однако поместим ее на другую панель инструментов. На какую? На пользовательску (собственную) панель инструментов, которая была создана специально для этой цели! Теперь, кроме переменной MyCon, потребуется переменная типа CommandBar, назовем ее MyCBar:

Dim MyCBar As CommandBar

Dim MyCon As CommandBarControl

Метод Add

Далее, чтобы создать новую панель инструментов, необходимо добавить новый элемент в семейство CommandBars. Как всегда, эта задача решается при помощи метода Add:

Set MyCBar = CommandBars.Add(Name:="Моя панель инструментов", _ Position:=msoBarTop, Temporary:=True)

При помощи именованного параметра Name здесь задается имя пользовательской панели инструментов, а параметр Position определяет ее местоположение (msoBarTop означает прикрепление панели к верхней границе окна). Логический параметр Temporary, имеющий по умолчанию значение False, получает здесь значение True. Благодаря этому панель будет создана с временным статусом — после окончания данного сеанса работы с приложением она исчезнет.

Свойство Visible

Далее остается сделать панель инструментов видимой присваиванием значения True ее свойст-

ву Visible:

MyCBar.Visible = True

Соседние файлы в папке Книги