Шаг 225.
VBA в MSExcel. Практические приемы программирования на VBA. Тема: работа с файлами. Практика (файл произвольного доступа)

    На этом шаге мы рассмотрим основные моменты создания приложения, демонстрирующего работу с файлом произвольного доступа.

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

    Приведенная ниже программа реализует простейшую базу данных с помощью файла произвольного доступа. Данный файл предназначен для хранения информации о студентах: фамилии, имени и группе. Диалоговое окно информация о студентах позволяет перемещаться от записи к записи, редактировать существующие и создавать новые записи. Переход от записи к записи производится при помощи счетчика. Отметим, что заголовок диалогового окна является переменным: при создании нового файла или записи в заголовок выводится информация о студентах, а при выводе информации о текущем студенте — его имя и фамилия. При активизации диалогового окна доступными для пользователя являются только поле со списком и кнопка Открытие файла. В поле со списком отображаются все файлы текущей папки с расширением dat. Пользователь может выбрать файл из этого списка или ввести в поле имя нового файла. После ввода имени файла поле со списком и кнопка Открытие файла становятся недоступными для пользователя, а все остальные элементы управления, наоборот, становятся доступными. На стандартном листе модуля описан пользовательский тип СтудентType, который используется в модуле UserForm1 для объявления переменной данного типа. Эта переменная задает структуру в файле произвольного доступа. Имя открываемого или вновь создаваемого файла вводится в переменную ИмяФайла. Свободный номер для файла получается при помощи функции FreeFile и записывается в переменную Номер.

    Итак, в редакторе форм создадим диалоговое окно для работы с файлом произвольного доступа (рисунок 1).


Рис.1. Диалоговое окно для работы с файлом произвольного доступа

    Обсудим, как приведенная ниже программа решает описанную задачу и что в ней происходит.

UserForm_Initialize
  1. Активизирует диалоговое окно.
  2. При помощи процедуры Управление задает режим доступа к элементам управления. Пользователю доступны только поле и кнопка Открытие файла.
  3. Задает первоначальный заголовок диалогового окна и надписи с номером текущей записи.
  4. Выводит рисунки (стрелки) на поверхность двух кнопок.

Нажатие кнопки Открытие файла запускает на выполнение процедуру CommandButton4_Click
  1. Открывает или создает файл по имени, которое введено в поле со списком Открытие файла.
  2. Считывает первую запись из файла в диалоговое окно при помощи процедуры ПоказатьЗапись.
  3. При помощи процедуры Управление задает режим доступа к элементам управления: пользователю теперь недоступны поле со списком и кнопка Открытие файла, а все остальные элементы управления, наоборот, становятся доступными.
  4. В надписи с номером текущей записи выводится также общее число записей открытого файла.

SpinButton1
  1. Устанавливает границы изменения счетчика. Отметим, что верхняя граница значения счетчика — число записей, может изменяться по ходу программы.
  2. Выводит текущее значение счетчика в поле Номер записи.
  3. Считывает текущую запись из файла в диалоговое окно при помощи процедуры ПоказатьЗапись.

Нажатие кнопки Новая запись запускает на выполнение процедуру CommandButton1_Click
Создает новую запись в конце файла.

Нажатие кнопки Записать изменения запускает на выполнение процедуру CommandButton2_Click
Считывает из диалогового окна в текущую запись файла информацию при помощи процедуры ЗаписатьЗапись.

Нажатие кнопки Закрыть запускает на выполнение процедуру CommandButton3_Click
Закрывает открытый файл и диалоговое окно.

Нажатие кнопки запускает на выполнение процедуру CommandButton5_Click
Осуществляет переход на последнюю запись.

Нажатие кнопки запускает на выполнение процедуру CommandButton6_Click
Осуществляет переход на первую запись.

ПоказатьЗапись
Выводит в поля диалогового окна запись с номером, указанным в переменной ТекущаяЗапись.

ЗаписатьЗапись
Записывает в файл из полей диалогового окна запись с номером, указанным в переменной ТекущаяЗапись.

    Приведем полный текст приложения.

Option Explicit
' Переменные уровня модуля
Dim Студент As СтудентType
Dim ДлинаФайла As Long
Dim ДлинаЗаписи As Long
Dim ИмяФайла As String
Dim ТекущаяЗапись As Long
Dim ПоследняяЗапись As Long
Dim Номер As Integer

Sub ПоказатьЗапись()
  Get #Номер, ТекущаяЗапись, Студент
  With Студент
    TextBox1.Text = Trim(.Фамилия)
    TextBox2.Text = Trim(.Имя)
    TextBox3.Text = Trim(.Группа)
    TextBox4.Text = ТекущаяЗапись
    UserForm1.Caption = TextBox1.Text & " " & TextBox2.Text
  End With
End Sub

Sub ЗаписатьЗапись()
  With Студент
    .Фамилия = TextBox1.Text
    .Имя = TextBox2.Text
    .Группа = TextBox3.Text
  End With
  Put Номер, ТекущаяЗапись, Студент
End Sub

Private Sub CommandButton1_Click()
  ' Кнопка Новая запись
  UserForm1.Caption = "Информация о студентах"

  'ЗаписатьЗапись
  ПоследняяЗапись = ПоследняяЗапись + 1
  With Студент
    .Фамилия = ""
    .Имя = ""
    .Группа = ""
  End With

  TextBox1.Text = ""
  TextBox2.Text = ""
  TextBox3.Text = ""
  TextBox4.Text = CStr(ПоследняяЗапись)

  Put #Номер, ПоследняяЗапись, Студент
  ТекущаяЗапись = ПоследняяЗапись
End Sub

Private Sub CommandButton2_Click()
  ' Кнопка Записать изменения
  ЗаписатьЗапись
End Sub

Private Sub CommandButton3_Click()
  ' Кнопка Закрыть
  Close #Номер
  UserForm1.Hide
End Sub

Private Sub CommandButton4_Click()
  ' Открытие файла
  Dim Начало As Boolean
  Управление СЗаписями:=True, СФайлом:=False
  ИмяФайла = Trim(ComboBox1.Text)

  ДлинаЗаписи = Len(Студент)
  Номер = FreeFile

  Open ИмяФайла For Random As Номер Len = ДлинаЗаписи
  ТекущаяЗапись = 1
  ПоследняяЗапись = FileLen(ИмяФайла) / ДлинаЗаписи

  Начало = True
  If ПоследняяЗапись = 0 Then
    UserForm1.Caption = "Информация о студентах"
    ПоследняяЗапись = 1
    Начало = False
  End If

  ПоказатьЗапись

  If Начало = False Then
    UserForm1.Caption = "Информация о студентах"
  End If

  TextBox1.SetFocus
  Label4.Caption = "Номер записи из " & ПоследняяЗапись
End Sub

Private Sub CommandButton5_Click()
  ' Переход на последнюю запись
  ТекущаяЗапись = ПоследняяЗапись
  SpinButton1.Value = ПоследняяЗапись
  ПоказатьЗапись
End Sub

Private Sub CommandButton6_Click()
  ' Переход на первую запись
  SpinButton1.Value = 1
  ТекущаяЗапись = 1
  ПоказатьЗапись
End Sub

Private Sub SpinButton1_Change()
  SpinButton1.Min = 1
  SpinButton1.Max = ПоследняяЗапись
  ТекущаяЗапись = SpinButton1.Value
  ПоказатьЗапись
End Sub

Private Sub UserForm_Initialize()
  Dim ИмяПапки As String
  Dim ИмяФайла As String
  Dim ДлинаПути As Integer
  Dim i As Integer

  Управление СЗаписями:=False, СФайлом:=True
  UserForm1.Caption = "Информация о студентах"
  
  With CommandButton5
    .Picture = LoadPicture("vba17f.bmp")
    .PicturePosition = fmPicturePositionCenter
  End With

  With CommandButton6
    .Picture = LoadPicture("vba17b.bmp")
    .PicturePosition = fmPicturePositionCenter
  End With

  Label4.Caption = "Номер записи"
  ComboBox1.Clear
  ИмяПапки = CurDir("C:")
  ДлинаПути = Len(ИмяПапки)
  With Application.FileSearch
    .Filename = "*.dat"
    .SearchSubFolders = False
    If .Execute(SortBy:=msoSortByFileName, _
        SortOrder:=msoSortOrderAscending) > 0 Then
      For i = 1 To .FoundFiles.Count
        ИмяФайла = Right(.FoundFiles(i), Len(.FoundFiles(i)) _
           - ДлинаПути - 1)
        ComboBox1.AddItem ИмяФайла
      Next i
    End If

    ComboBox1.ListIndex = 0
  End With
End Sub

Sub Управление(СЗаписями As Boolean, СФайлом As Boolean)
  Dim ЭлементУправления As Object
  For Each ЭлементУправления In Controls
    ЭлементУправления.Enabled = СЗаписями
  Next ЭлементУправления
  CommandButton4.Enabled = СФайлом
  ComboBox1.Enabled = СФайлом
End Sub
Текст этого примера можно взять здесь.

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




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