Шаг 174.
VBA в MSExcel.
Работа с внешними базами данных. Пример приложения

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

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


Рис.1. Диалоговое окно Студенты первого курса

    Приводимая ниже программа:

  1. При активизации диалогового окна выводит в поля ввода информацию о первом студенте и в надписи всего записей указывает общее число записей в таблице.
  2. При нажатии кнопок > и < происходит перемещение на одну запись вперед и назад соответственно, а при нажатии кнопок >> и << — перемещение в конец и начало таблицы соответственно.

    При нажатии кнопки Найти происходит поиск первой записи из таблицы с указанной фамилией (если такой записи нет, то при помощи свойства Bookmark указатель возвращается в ту же позицию, откуда начался поиск). При нажатии кнопки Найти далее ищется последующая запись с той же фамилией.

    При нажатии кнопки Удалить удаляется запись.

    При нажатии кнопки Новая запись создается новая запись по данным, введенным в поля ввода.

    При нажатии кнопки Редактировать вносятся изменения в запись из базы данных.

    При нажатии кнопки Закрыть закрываются база данных и диалоговое окно.

    При выборе переключателя Хорошисты и отличники в диалоговом окне выводятся данные только о хорошистах и отличниках, а при выборе переключателя Все — выводится информация обо всех студентах.

' Переменные уровня модуля
Dim РабочаяОбласть As Workspace
Dim БазаДанных As Database
Dim Запись As Recordset
Dim ЗаписьДубль As Recordset
Dim Фамилия As String
Dim Критерий As String
Dim Закладка As Variant

Private Sub CommandButton1_Click()
 ' Найти запись по фамилии
 ' Запоминается на закладке текущая запись
 Закладка = Запись.Bookmark
 ' Считывается фамилия из поля Фамилия, на ее основе
 ' создается критерий поиска и ищется первая запись с
 ' подобной фамилией
 Фамилия = Trim(TextBox1.Text)
 Критерий = "[Фамилия]='" & Фамилия & "'"
 Запись.FindFirst Критерий
 ' Если запись с указанной фамилией найдена, то она отображается
 ' в диалоговом окне.
 ' Если запись не найдена, то отображается сообщение и
 ' при помощи закладки происходит возврат к записи, с которой
 ' был начат поиск
 If Запись.NoMatch = False Then
   ПоказатьЗапись
 Else
  MsgBox "Запись не найдена", vbInformation, "Студенты"
  Запись.Bookmark = Закладка
  ПоказатьЗапись
 End If
End Sub

Private Sub CommandButton10_Click()
 ' Переход к последней записи
 Запись.MoveLast
 ПоказатьЗапись
End Sub

Private Sub CommandButton2_Click()
 ' Найти следующую запись по фамилии
 Закладка = Запись.Bookmark
 Фамилия = Trim(TextBox1.Text)
 Критерий = "[Фамилия]='" & Фамилия & "'"
 Запись.FindNext Критерий
 If Запись.NoMatch = False Then
   ПоказатьЗапись
 Else
  MsgBox "Больше таких записей нет", vbInformation, "Студенты"
  Запись.Bookmark = Закладка
  ПоказатьЗапись
 End If
End Sub

Private Sub CommandButton3_Click()
 ' Удаление записи
 With Запись
  .Delete
  .MoveNext
 End With
 ПоказатьЗапись
End Sub

Private Sub CommandButton4_Click()
 ' Добавление записи
 With Запись
   .AddNew
   .Fields("Фамилия").Value = TextBox1.Text
   .Fields("Группа").Value = TextBox2.Text
   .Fields("Предмет").Value = TextBox3.Text
   .Fields("Оценка").Value = TextBox4.Text
   .Update
 End With
End Sub

Private Sub CommandButton5_Click()
 ' Редактирование записи
 With Запись
   .Edit
   .Fields("Фамилия").Value = TextBox1.Text
   .Fields("Группа").Value = TextBox2.Text
   .Fields("Предмет").Value = TextBox3.Text
   .Fields("Оценка").Value = TextBox4.Text
   .Update
 End With
End Sub

Private Sub CommandButton6_Click()
 ' Закрытие записи, базы данных и окна
  Запись.Close
  БазаДанных.Close
  РабочаяОбласть.Close
  UserForm1.Hide
End Sub

Private Sub CommandButton7_Click()
 ' Переход к первой записи
 Запись.MoveFirst
 ПоказатьЗапись
End Sub

Private Sub CommandButton8_Click()
 ' Переход к предыдущей записи
 Запись.MovePrevious
 ' Если достигнута первая запись, то отображается сообщение
 If Запись.BOF = True Then
  Запись.MoveFirst
  MsgBox "Первая запись", vbInformation, "Студенты"
 End If
 ПоказатьЗапись
End Sub

Private Sub CommandButton9_Click()
 ' Переход к последующей записи
 Запись.MoveNext
 ' Если достигнута последняя запись, то отображается сообщение
 If Запись.EOF = True Then
   Запись.MoveLast
   MsgBox "Последняя запись", vbInformation, "Студенты"
 End If
 ПоказатьЗапись
End Sub

Private Sub OptionButton1_Click()
 ' Отображение данных только о хорошистах и отличниках
 ' Создание копии записи
 Set ЗаписьДубль = Запись.Clone
 ' Фильтрация записей по критерию
 Запись.Filter = "[Оценка] >= 4"
 ' Создание отфильтрованной записи
 Set Запись = Запись.OpenRecordset()
 If Запись.RecordCount > 0 Then
   ' Если отфильтрованная запись существует, то она отображается
   ' в диалоговом окне
   ПоказатьЗапись
 Else
   ' Если отфильтрованной записи нет, то отображается соответствующее
   ' сообщение, восстанавливается первоначальный объект Recordset
   ' и выбирается переключатель Все
   MsgBox "Таких студентов нет", vbInformation, "Студенты"
   Set Запись = ЗаписьДубль.Clone
   Set Запись = Запись.OpenRecordset()
   OptionButton2.Value = True
 End If
End Sub

Private Sub OptionButton2_Click()
 ' Отображение всех студентов
 Set Запись = ЗаписьДубль.Clone
 Set Запись = Запись.OpenRecordset()
 ЗаписьДубль.Close
 ПоказатьЗапись
End Sub
 Private Sub UserForm_Initialize()
 ' Создание рабочей области
 Set РабочаяОбласть = CreateWorkspace(Name:="", UserName:="admin", _
  Password:="", UseType:=dbUseJet)
 ' Открытие базы данных студенты.mdb
 Set БазаДанных = РабочаяОбласть.OpenDatabase _
  (Name:="J:\Site\Works\pr174_1\Студенты.mdb", Options:=True)
 ' Создание записей
 Set Запись = БазаДанных.OpenRecordset("ПервыйКурс", dbOpenDynaset)
 Set ЗаписьДубль = Запись.Clone
 ' Принудительное перемещение на последнюю запись для того,
 ' чтобы определить число записей
 Запись.MoveLast
 ' Вывод числа записей в надписи
 Label5.Caption = "Всего записей " & CStr(Запись.RecordCount)
 ' Принудительное перемещение на первую запись
 Запись.MoveFirst
 ' Вывод первой записи в поля диалогового окна
 ПоказатьЗапись
 With UserForm1
  .Caption = "Студенты первого курса"
  .OptionButton2.Value = True
 End With
End Sub
Sub ПоказатьЗапись()
 ' Процедура вывода записи в поля диалогового окна
 TextBox1.Text = Запись.Fields("Фамилия").Value
 TextBox2.Text = Запись.Fields("Группа").Value
 TextBox3.Text = Запись.Fields("Предмет").Value
 TextBox4.Text = Запись.Fields("Оценка").Value
End Sub
Текст этого примера вместе с базой данных можно взять здесь.

    Со следующего шага мы начнем рассматривать примеры приложений.




Предыдущий шаг Содержание Следующий шаг