
- •Программирование в среде Microsoft Office 2000
- •1. Основные сведения о vba
- •1.2. Макрорекордер в Office 2000
- •2.Основные сведения о программировании на vba
- •2.1. Алфавит и лексика языка vba
- •2.2.Правила записи текста программы на vba.
- •2.4. Данные в vba
- •2.4.1. Типы данных в vba
- •Т ипы данных в vba
- •Встроенные типы данных показаны в таблице 2.1.
- •2.4.2.Объявление переменных и констант простых типов
- •2.4.3. Массивы
- •2.5.Использование стандартных диалоговых окон для организации ввода-вывода данных
- •2.5.1.Функция MsgBox
- •2.5.2.Функция InputBox
- •2.6. Управляющие конструкции vba
- •2.6.1.Условный оператор if
- •2.6.2.Оператор выбора Select Case
- •2.6.3.Оператор цикла For … Next
- •2.6.4.Оператор цикла While…Wend
- •2.6.5.Оператор цикла Do…Loop
- •2.6.6. Оператор перехода GoTo
- •2.7. Основные сведения об объектах
- •2.7.1.Основные понятия объектно-ориентированного программирования.
- •2.7.2. Особенности использования объектов.
- •2.7.3. Коллекции в vba
- •2.7.4. Объект Application
- •2.7.5. Объекты Range и Selection
- •2.7.6. Оператор With для операций с одним объектом.
- •2.8.Обработка ошибок
- •3.Программирование в приложениях ms Office 2000.
- •3.1.Объекты excel, их свойства и методы.
- •3.1.1. Объектная модель excel
- •3.1.2. Коллекция Workbooks
- •3.1.3. Объект Workbook
- •3.1.4.Объект Worksheet
- •3.1.5.Объект Chart
- •3.1.6.Объекты Range и Selection
- •3.1.7. Пример решения задачи в excel на основе построения vba-кода.
- •3.2. Объекты word, их свойства и методы.
- •3.2.1. Модель объектов word
- •3.2.2.Объект Appication
- •3.2.3. Объект Document
- •3.2.4. Классы, задающие структуризацию текста документа.
- •3.2.5. Классы, составляющие части документа
- •3.2.5.1. Объект Range
- •3.2.5.2. Объект Selection
- •3.2.6. Классы, представляющие структуру документа
- •3.3. Автоматизация работы в Access на основе использования Access vba
- •3.3.1. Средства автоматизации работы в Access.
- •3.3.2. Объектная модель Microsoft Access
- •3.3.3.Особенности программирования в Access vba
- •3.3.3.1. Модель программирования Access
- •3.3.3.2. Особенности работы с объектами в Access vba.
- •3.3.4. Манипулирование в Access объектами Application
- •3.3.5. Объекты доступа к данным
- •3.3.5.1. Объекты dao
- •3.3.5.2. Объекты ado
- •3.3.6. Использование объектов доступа к данным в Access
- •3.3.6.1. Соединение с текущей базой данных
- •3.3.6.2. Открытие базы данных
- •3.3.6.3. Создание базы данных
- •3.3.6.4. Выполнение операций с записями
- •3.3.6.5. Перемещение по набору записей
- •3.3.6.6. Поиск записей в объектах Recordset
- •3.3.7. Пример решения задачи в Access на основе построения vba-кода
- •3.4.Совместная работа приложений Microsoft Office 2000
- •4.Список рекомендуемой литературы
3.3.6.6. Поиск записей в объектах Recordset
Поиск записей основывается на использовании методов Seek или Find. Метод нахождения записи, отвечающей заданному критерию поиска, зависит от типа созданного объекта Recordset. Работа с объектом Recordset табличного типа позволяет использовать индексы и метод Seek. При работе с динамическим набором Recordset индексы применять нельзя. Вместо этого приходится использовать методы Find. Любой из методов поиска позволяет найти запись, соответствующую заданному условию. Эта запись становится текущей. Если поиск не был успешным, то в модели DAO текущая запись не определена, а в модели ADO указатель текущей записи помещается либо перед первой записью набора, либо после последней.
Применение методов Find
DAO
Методы FindFirst, FindLast, FindNext FindPrevios находят первую, последнюю, следующую или предыдущую запись, удовлетворяющую заданному критерию, и делают ее текущей. Они имеют следующий синтаксис:
набор_записей.{FindFirst | FindLast | FindNext | FindPrevios } критерий
где
набор_записей - ссылка на существующий объект Recordset типа динамического набора записей;
критерий - строковое выражение для поиска записей.
Пример выражения (критерий):
"Country='Germany' "
Каждый из четырех методов Find начинает поиск с разных точек и в разных направлениях:
метод FindFirst ищет с начала набора и к концу;
метод FindLast от конца к началу;
метод FindNext от текущей записи к концу;
метод FindPrevios от текущей записи к началу.
Успешность поиска можно определить по значению характеристики NoMatch объекта Recordset. Если поиск был успешен, ее значением станет False, в противном случае - True.
ADO
В объектной модели ADO существует только один метод Find, который начинает поиск всегда с текущей записи. Использование аргументов этого метода позволяют определить направление поиска (аргумент SearchDirection) и указать смещение начала поиска относительно текущей записи (аргумент SkipRows).
Применение метода Seek
Для максимально быстрого поиска записей метод Seek предусматривает индексы. Таблица должна иметь не менее одного индекса, а характеристику Index объекта Recordset нужно установить в конкретное значение индекса, используемого при поиске:
таблица.Index = имя_индекса
где
таблица - имя существующего набора записей табличного типа с индексом имя_индекса;
имя_индекса - строковое выражение, представляющее имя индекса;
DAO
Синтаксис метода Seek для объектной модели DAO:
таблица.Seek сравнение, ключ1,ключ2... ключ13
где
сравнение - строковое выражение с одним из операторов сравнения "<","<=","=",">",">=";
ключ1, ключ2 . .- значения поиска, соответствующие полям текущего индекса.
Запятая между сравнением и значениями поиска обязательна.
Например:
rst.Index="Country"
rst.Seek "=", "Argentina"
ADO
Синтаксис метода ADO отличается и имеет следующий вид:
recordset.Seek массив_значений_полей_индекса, тип_сравнения
3.3.7. Пример решения задачи в Access на основе построения vba-кода
Требуется решить задачу обработки поступления товаров на склад. База данных содержит две таблицы. Входная информация для решения задачи содержится в таблице «Наличие», а выходная – в таблице «Накладные». При решении этой задачи корректируются записи входной таблицы "Наличие" и формируются (добавляются) новые записи в выходную таблицу "Накладные".
Справочная информация о товарах, хранящихся в магазине, имеется в таблице “Наличие”, содержащей следующие данные:
Код товара
Наименование товара
Остаток
Дата
Единицы измерения
В форму осуществляется ввод информации о каждой поступившей на склад партии товаров:
номер накладной
код товара
дата поступления
количество
В таблице "Наличие" осуществляется поиск записи с введенным кодом детали. Если искомая запись найдена, то программа должна предусмотреть выполнение следующих операций:
Произвести корректировку найденной записи в таблице "Наличие", заключающуюся в добавлении к значению поля "Остаток" введенного значения "количество" и в замещении значения поля "Дата" на введенное значение "дата поступления"
Добавить новую запись в таблицу "Накладные".
Выходная таблица имеет следующий состав полей:
Номер накладной
Код товара
Дата поступления
Количество
Форма, в которую осуществляется ввод данных для решения данной задачи имеет вид, представленный на рис 3.7. Текст VBA – кода размещен в модуле формы «Поступление»
Далее приводится программа решения данной задачи в двух вариантах: с использованием объектной модели DAO (Пример 3.22) и с использованием объектной модели ADO (Пример 3.23).
Р
ис.3.7.
Форма "Поступление"
Пример 3.22. Текст программы с использованием методов DAO
Option Compare Database
Option Explicit
Dim n As String
Dim t As String
Dim d As Date
Dim k As Single
Private Sub Кнопка_ОК_Click()
On Error GoTo Err_Кнопка_ОК_Click
n = Поле_нн.Value
t = Поле_кт.Value
d = Поле_дп.Value
k = Поле_кл.Value
Obrabotka
Поле_нн.Value = Null
Поле_кт.Value = Null
Поле_дп.Value = Null
Поле_кл.Value = Null
Exit_Кнопка_ОК_Click:
Exit Sub
Err_Кнопка_ОК_Click:
MsgBox Err.Description
Resume Exit_Кнопка_ОК_Click
End Sub
Private Sub Кнопка_выход_Click()
On Error GoTo Err_Кнопка_выход_Click
DoCmd.Close
Exit_Кнопка_выход_Click:
Exit Sub
Err_Кнопка_выход_Click:
MsgBox Err.Description
Resume Exit_Кнопка_выход_Click
End Sub
Function Obrabotka()
Dim dbs As Database
Dim rst As DAO.Recordset
Dim nst As DAO.Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("Наличие")
Set nst = dbs.OpenRecordset("Накладные")
rst.MoveFirst
Do Until rst.EOF
If t = rst![Код товара] Then
rst.Edit
rst![Остаток] = rst![Остаток] + k
rst![Дата] = d
rst.Update
nst.AddNew
nst![Номер накладной] = n
nst![Код товара] = t
nst![Дата поступления] = d
nst![Количество] = k
nst.Update
End If
rst.MoveNext
Loop
End Function
Пример 3.22. Текст программы с использованием методов ADO
Option Compare Database
Option Explicit
Dim n As String
Dim t As String
Dim d As Date
Dim k As Single
Private Sub Кнопка_ОК_Click()
On Error GoTo Err_Кнопка_ОК_Click
n = Поле_нн.Value
t = Поле_кт.Value
d = Поле_дп.Value
k = Поле_кл.Value
Obrabotka
Поле_нн.Value = Null
Поле_кт.Value = Null
Поле_дп.Value = Null
Поле_кл.Value = Null
Exit_Кнопка_ОК_Click:
Exit Sub
Err_Кнопка_ОК_Click:
MsgBox Err.Description
Resume Exit_Кнопка_ОК_Click
End Sub
Private Sub Кнопка_выход_Click()
On Error GoTo Err_Кнопка_выход_Click
DoCmd.Close
Exit_Кнопка_выход_Click:
Exit Sub
Err_Кнопка_выход_Click:
MsgBox Err.Description
Resume Exit_Кнопка_выход_Click
End Sub
Function Obrabotka()
Dim rst As New ADODB.Recordset
Dim nst As New ADODB.Recordset
rst.Open "Наличие", CurrentProject.Connection, adOpenKeyset, _ adLockOptimistic
nst.Open "Накладные", CurrentProject.Connection, adOpenKeyset, _ adLockOptimistic
rst.MoveFirst
Do Until rst.EOF
If t = rst![Код товара] Then
rst![Остаток] = rst![Остаток] + k
rst![Дата] = d
nst.AddNew
nst![Номер накладной] = n
nst![Код товара] = t
nst![Дата поступления] = d
nst![Количество] = k
nst.Update
End If
rst.MoveNext
Loop
End Function