Шаг 198.
VBA в MSExcel. Практические приемы программирования на VBA. Тема: заполнение базы данных. Практика

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

    Для заполнения базы данных на рабочем листе с помощью редактора пользовательских форм создадим диалоговое окно Регистрация туристов фирмы "Эх, прокачу!" (рисунок 1).


Рис.1. Диалоговое окно Регистрация туристов фирмы "Эх, прокачу!"

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


Рис.2. База данных о туристах на рабочем листе

    Щелчок по кнопке О программе приведет к отображению на экране текстового поля с пояснениями к данной программе. Повторный щелчок по этой кнопке удаляет данное поле (рисунок 3).


Рис.3. Пояснительное текстовое поле, появляющееся при выборе переключателя О программе

    Обратите внимание, что у окна приложения пользовательское имя Регистрация. База данных туристов.

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

UserForm_Initialize
  1. Активизирует диалоговое окно.
  2. Назначает клавише Esc функцию кнопки Отмена, а клавише Enter - Вычислить.
  3. Назначает кнопкам Вычислить, Отмена и переключателю О программе всплывающие подсказки.
  4. Закрепляет первую строку так, чтобы она всегда отображалась на экране.
  5. Создает заголовки полей базы данных, если они еще не были созданы.
  6. Устанавливает начальное значение переключателя О программе.
  7. Заполняет раскрывающийся список.
  8. Устанавливает текст заголовка окна приложения.

Нажатие кнопки Вычислить запускает на выполнение процедуру CommandButton1_Click
  1. Определяет номер первой пустой строки в базе данных о регистрации туристов, куда будет введена новая запись.
  2. Считывает данные из диалогового окна.
  3. Вводит их в первую пустую строку.

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

SpinButton1_Change
Вводит значение в поле продолжительность тура.

ToggleButton1_Click
Отображает текстовое поле в выбранном состоянии и удаляет его — в снятом состоянии.

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

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

Private Sub CommandButton1_Click()
  ' Процедура считывания информации из диалогового окна
  ' и записи ее в базу данных на рабочем листе

  ' Смысл переменных однозначно определен их названиями
  Dim Фамилия As String * 20
  Dim Имя As String * 20
  Dim Пол As String * 20
  Dim ВыбранныйТур As String * 20
  Dim Оплачено As String * 20
  Dim Фото As String * 20
  Dim Паспорт As String * 20
  Dim Срок As String * 20
  Dim НомерСтроки As Integer
  ' НомерСтроки - номер первой пустой строки рабочего листа

  НомерСтроки = Application.CountA(ActiveSheet.Columns(1)) + 1

  ' Считывание информации из диалогового окна в переменные
  With UserForm1
   Фамилия = .TextBox1.Text
   Имя = .TextBox2.Text
   Срок = .TextBox3.Text
   If .OptionButton1.Value = True Then
       Пол = "Муж"
   Else
       Пол = "Жен"
   End If
   
   If .CheckBox1.Value = True Then
       Оплачено = "Да"
   Else
       Оплачено = "Нет"
   End If
   
   If .CheckBox2.Value = True Then
       Фото = "Да"
   Else
       Фото = "Нет"
   End If
   
   If .CheckBox3.Value = True Then
       Паспорт = "Да"
   Else
       Паспорт = "Нет"
   End If
   ВыбранныйТур = .ComboBox1.List(.ComboBox1.ListIndex, 0)
  End With

  ' Ввод данных в строку с номером НомерСтроки рабочего листа
  With ActiveSheet
    .Cells(НомерСтроки, 1).Value = Фамилия
    .Cells(НомерСтроки, 2).Value = Имя
    .Cells(НомерСтроки, 3).Value = Пол
    .Cells(НомерСтроки, 4).Value = ВыбранныйТур
    .Cells(НомерСтроки, 5).Value = Оплачено
    .Cells(НомерСтроки, 6).Value = Фото
    .Cells(НомерСтроки, 7).Value = Паспорт
    .Cells(НомерСтроки, 8).Value = Срок
  End With
End Sub
Private Sub CommandButton2_Click()
  ' Процедура закрытия диалогового окна

  ' Установка заголовка окна приложения по умолчанию
  UserForm1.Hide
  Application.Caption = Empty
  ActiveSheet.DrawingObjects.Delete
End Sub

Private Sub SpinButton1_Change()
  ' Процедура ввода значения счетчика в поле ввода
  With UserForm1
     .TextBox3.Text = CStr(.SpinButton1.Value)
  End With
End Sub

Private Sub TextBox3_Change()
  ' Процедура установки значения счетчика из поля ввода
  With UserForm1
   .SpinButton1.Value = CInt(.TextBox3.Text)
  End With
End Sub

Private Sub ToggleButton1_Click()
  ' Процедура отображения или удаления поля с текстом
  If ToggleButton1.Value = True Then
   ActiveSheet.DrawingObjects.Delete
   ActiveSheet.Shapes.AddTextbox(msoOrientationHorizontal, _
              11.25, 44.25, 110.5, 96#).Select
   Selection.Characters.Text = ""
   With Selection.Font
      .Name = "arial cyr"
      .FontStyle = "обычный"
      .Size = 10
      .Strikethrough = False
      .Superscript = False
      .Subscript = False
      .OutlineFont = False
      .Shadow = False
      .Underline = xlUnderlineStyleNone
      .ColorIndex = xlAutomatic
   End With
   Selection.ShapeRange.Fill.ForeColor.SchemeColor = 13
   Selection.ShapeRange.Fill.Visible = msoTrue
   Selection.ShapeRange.Fill.Solid
   Selection.Characters.Text = _
       "Программа составлена " & Chr(10) & _
       "Константином Брикаловым для регистрации " & Chr(10) & _
       "клиентов" & Chr(10) & "туристической " & Chr(10) & "фирмы"
   With Selection.Characters(Start:=1, Length:=86).Font
       .Name = "Arial Cyr"
       .FontStyle = "обычный"
       .Size = 10
       .Strikethrough = False
       .Superscript = False
       .Subscript = False
       .OutlineFont = False
       .Shadow = False
       .Underline = xlUnderlineStyleNone
       .ColorIndex = xlAutomatic
  End With
End If
If ToggleButton1.Value = False Then
      ActiveSheet.DrawingObjects.Delete
End If
End Sub


Private Sub UserForm_Initialize()
  ' Процедура вызова диалогового окна
  ' и задание элементов раскрывающегося списка'
  ЗаголовокРабочегоЛиста
  
  ' Задание пользовательского заголовка окна приложения'
  Application.Caption = "Регистрация. База данных туристов"

  ' Закрытие строки формул окна Excel'
  Application.DisplayFormulaBar = False

  ' Задание элементов раскрывающегося списка
  With CommandButton1
   .Default = True
   .ControlTipText = "Ввод данных в базу данных"
  End With
  With CommandButton2
   .Cancel = True
   .ControlTipText = "Кнопка отмена"
  End With
  OptionButton1.Value = True
  With ToggleButton1
   .Value = False
   .ControlTipText = "Информация о программе"
  End With
  With ComboBox1
   .List = Array("Лондон", "Париж", "Берлин")
   .ListIndex = 0
  End With

  ' Активизация диалогового окна
  UserForm1.Show
End Sub
Sub ЗаголовокРабочегоЛиста()
  ' Процедура создания заголовков полей базы данных

  ' Если заголовки существуют, то досрочный выход из процедуры
  If Range("A1").Value = "Фамилия" Then
     Range("A2").Select
     Exit Sub
  End If

  ' Если заголовки не существуют, то создаются заголовки полей
  ActiveSheet.Cells.Clear
  Range("A1:H1").Value = Array("Фамилия", "Имя", "Пол", _
          "Выбранный Тур", "Оплачено", "Фото", "Паспорт", "Срок")
  Range("A:A").ColumnWidth = 12
  Range("D:D").ColumnWidth = 14.4

  ' Закрепляется первая строка с тем, чтобы она всегда
  ' отображалась на экране
  Range("2:2").Select
  ActiveWindow.FreezePanes = True
  Range("A2").Select

  ' К каждому заголовку поля базы данных
  ' присоединяется примечание
  Range("A1").AddComment
  Range("A1").Comment.Visible = False
  Range("A1").Comment.Text Text:="Фамилия клиента"
  Range("B1").AddComment
  Range("B1").Comment.Visible = False
  Range("B1").Comment.Text Text:="Имя клиента"
  Range("C1").AddComment
  Range("C1").Comment.Visible = False
  Range("C1").Comment.Text Text:="Пол клиента"
  Range("D1").AddComment
  Range("D1").Comment.Visible = False
  Range("D1").Comment.Text Text:="Направление" & Chr(10) & "выбранного тура"
  Range("E1").AddComment
  Range("E1").Comment.Visible = False
  Range("E1").Comment.Text Text:="Путёвка оплачена?" & Chr(10) & "(Да/Нет)"
  Range("F1").AddComment
  Range("F1").Comment.Visible = False
  Range("F1").Comment.Text Text:="Фото сданы" & Chr(10) & "(Да/Нет)"
  Range("G1").AddComment
  Range("G1").Comment.Visible = False
  Range("G1").Comment.Text Text:="Наличие паспорта" & Chr(10) & "(Да/Нет)"
  Range("H1").AddComment
  Range("H1").Comment.Visible = False
  Range("H1").Comment.Text Text:="Продолжительность" & Chr(10) & "поездки"
End Sub
Текст этого примера можно взять здесь.

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

  НомерСтроки = Application.CountA(ActiveSheet.Columns(1)) + 1,
правая часть которой вычисляет число непустых ячеек в первом столбце активного рабочего листа. Переменной НомерСтроки присваивается значение на единицу большее, чем число непустых строк, что естественно, т.к. ей должен быть присвоен номер первой непустой строки базы данных. Подобные инструкции довольно часто используется при разработке приложений, поэтому рекомендуем обратить на них внимание.

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




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