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

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

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


Рис.1. Диалоговое окно Поиск

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


Рис.2. Сообщение о неудачном поиске клиента

  • Нажатие кнопки Поиск активизирует процедуру CommandButton1_Click, которая производит поиск клиентов и отображает список найденных вариантов.
  • Нажатие кнопки Редактировать активизирует процедуру CommandButton2_Click, которая закрывает диалоговое окно Поиск и активизирует диалоговое окно Перерегистрация туристов фирмы "С нами не соскучишься" (рисунок 3), заполняя его информацией о выбранном клиенте.


    Рис.3. Диалоговое окно Перерегистрация туристов фирмы "С нами не соскучишься"

  • Нажатие кнопки Отмена активизирует процедуру CommandButton3_Click, которая закрывает диалоговое окно Поиск.

    Приведем текст этого модуля.

 Private Sub CommandButton1_Click()
  ' Процедура поиска клиента
  Dim i As Integer
  Dim j As Integer
  Dim n As Integer
  Dim Строка As Integer
  ' i ,j и n - вспомогательные переменные
  ' В переменной i перебираются номера строк из базы данных,
  ' начиная со второй и заканчивая последней непустой строкой,
  ' номер которой определен в переменной Строка.
  ' Переменная j выполняет роль счетчика,
  ' учитывающего текущее количество отобранных вариантов.
  ' Если отобранных вариантов нет, то j присваивается 0.
  ' n присваивается конечному значению счетчика j
  Dim Тест As String
  ' Тест - вспомогательная переменная, в которую вводится очередная
  ' проверяемая фамилия

  Dim СписокНайденных() As String
  Строка = Application.CountA(Sheets("БазаДанных").Columns(1))
  Фамилия = Trim(UserForm3.TextBox1.Text)
  i = 2
  j = 0
  Do While i <= Строка
    Тест = Sheets("БазаДанных").Cells(i, 1).Text
    If IsNumeric(Application.Search(Фамилия, Тест)) = True Then
      j = j + 1
    End If
    i = i + 1
  Loop
  If j = 0 Then
    MsgBox "Вышла промашка. А клиента такого и в помине нет.", _
      vbExclamation, "Поиск"
    НайденнаяЗапись = 0
    Exit Sub
  End If
  n = j
  ReDim СписокНайденных(1 To n, 0 To 2) As String
  ' Двумерный динамический массив СписокНайденных используется для заполнения
  ' раскрывающегося списка с возможными вариантами клиентов.
  ' Первый и второй столбцы массива содержат фамилию и имя клиента,
  ' а третий - номера строки из рабочего листа БазаДанных,
  ' в которой записана информация о клиенте
  i = 2
  j = 0
  Do While i <= Строка
    Тест = Sheets("БазаДанных").Cells(i, 1).Text
    If IsNumeric(Application.Search(Фамилия, Тест)) = True Then
      j = j + 1
      СписокНайденных(j, 0) = Тест
      СписокНайденных(j, 1) = Sheets("БазаДанных").Cells(i, 2).Text
      СписокНайденных(j, 2) = CStr(i)
    End If
    i = i + 1
  Loop

  ' Заполнение раскрывающегося списка
  With UserForm3.ComboBox1
    .Clear
    .ColumnHeads = True
    .ColumnCount = 3
    .ColumnWidths = "60;60;10"
    .List = СписокНайденных()
    .ListIndex = 0
  End With

  ' Ввод в переменную НайденнаяЗапись номера строки с
  ' первым клиентом, выведенным в раскрывающийся список
  НайденнаяЗапись = CInt(СписокНайденных(1, 2))
End Sub

Private Sub CommandButton2_Click()
  ' Процедура закрытия диалогового окна Поиск,
  ' открытия диалогового окна Перерегистрация туристов
  ' и заполнением его информацией о найденном туристе

  ' Закрывается диалоговое окно Поиск
  UserForm3.Hide

  Dim n As Integer
  ' n - вспомогательная переменная, используемая для
  ' ввода из базы данных в раскрывающийся список
  ' направления тура найденного клиента
  ' (считывается из раскрывающегося списка
  ' номер строки выбранного клиента)
  
  НайденнаяЗапись = UserForm3.ComboBox1.List(UserForm3.ComboBox1.ListIndex, 2)
  ' Если клиент не найден, то процедура информирует об этом,
  ' напоминая, что перед редактированием должен быть найден клиент

  If НайденнаяЗапись = 0 Then
    MsgBox "Сначала надо найти клиента", vbInformation, "Редактирование"
    Exit Sub
  End If

  ' Ввод из базы данных в диалоговое окно Редактирование
  ' информации о найденном клиенте

  With UserForm2
    .TextBox1.Text = Sheets("БазаДанных").Cells(НайденнаяЗапись, 1).Value
    .TextBox2.Text = Sheets("БазаДанных").Cells(НайденнаяЗапись, 2).Value
    .TextBox3.Text = Sheets("БазаДанных").Cells(НайденнаяЗапись, 8).Value
    .SpinButton1.Value = Sheets("БазаДанных").Cells(НайденнаяЗапись, 8).Value
    
    If Sheets("БазаДанных").Cells(НайденнаяЗапись, 3).Value = "Муж" Then
      .OptionButton1.Value = True
      .OptionButton2.Value = False
    Else
      .OptionButton1.Value = False
      .OptionButton2.Value = True
    End If
    If Sheets("БазаДанных").Cells(НайденнаяЗапись, 5).Value = "Да" Then
      .CheckBox1.Value = True
    Else
      .CheckBox1.Value = False
    End If
    If Sheets("БазаДанных").Cells(НайденнаяЗапись, 6).Value = "Да" Then
      .CheckBox2.Value = True
    Else
      .CheckBox2.Value = False
    End If
    If Sheets("БазаДанных").Cells(НайденнаяЗапись, 7).Value = "Да" Then
      .CheckBox3.Value = True
    Else
      .CheckBox3.Value = False
    End If
    .ComboBox1.List = Array("Афины", "Берлин", "Лондон")
    ВыбранныйТур = Cells(НайденнаяЗапись, 4).Value
    Select Case Trim(ВыбранныйТур)
      Case Is = "Афины"
        n = 0
      Case Is = "Берлин"
        n = 1
      Case Is = "Лондон"
        n = 2
    End Select
    .ComboBox1.ListIndex = n
    .Show
  End With
End Sub

Private Sub CommandButton3_Click()
  ' Процедура закрытия диалогового окна
  UserForm3.Hide
End Sub

    На следующем шаге мы рассмотрим модуль UserForm2.




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