Поле со списком (ComboBox)
Предположим, что нам надо создать форму, с помощью которой пользователь указывает нужную ему кафедру:
ТРЕБУЕТСЯ: создать форму (выполните самостоятельно!) и написать программу инициализации формы, в которой элементы поля со списком формируются на основе данных, расположенных в первом столбце на листе Кадры в книге C:\St\Институт.xls (Рис. 10‑10):
Начальные условия
1) при создании формы присвойте следующие имена элементам управления:
кнопке ОК – cmdOK
кнопке Отмена – cmdОтмена
полю со списком – cboКафедра
2) саму форму назовите frmКафедра.
Тогда код, который формирует поле со списком, запишется так:
Sub ПолеСоСписком()
'Объявляем переменные и массивы:
Dim Кафедры() As String
Dim Кафедра As String
Dim НомерСтроки As Integer
Dim КолСотрудников As Integer
Dim КолКафедр As Integer
'1. Проверяем существование книги C:\St\Институт.xls
Call НаличиеКниги("C:\St\Институт.xls")
If flagНаличие = 0 Then Exit Sub
'2. Проверяем существование листа Кадры
Call НаличиеЛиста("Кадры")
If flag = 0 Then Exit Sub
'3. Формируем список кафедр, которые встречаются в первом _
столбце на листе Кадры:
ReDim Preserve Кафедры(1) As String
Кафедры(1) = Trim(Cells(3, 1).Value)
КолКафедр = 1 'кол-во кафедр
НомерСтроки = 4
WhileTrim(Cells(НомерСтроки, 1).Value) <> ""
Кафедра = Trim(Cells(НомерСтроки, 1).Value)
For j = 1 To КолКафедр
If Кафедра = Кафедры(j) Then GoTo n3
Next j
КолКафедр = КолКафедр + 1
ReDim Preserve Кафедры(КолКафедр) As String
Кафедры(КолКафедр) = Trim(Cells(НомерСтроки, 1).Value)
n3: НомерСтроки = НомерСтроки + 1
Wend
'4. Сортируем список кафедр:
For i = 1 To КолКафедр - 1
Кафедра = Кафедры(i)
k = i
For j = i + 1 To КолКафедр
If Кафедры(j) >= Кафедра Then
Else
Кафедра = Кафедры(j)
Кафедры(j) = Кафедры (k)
Кафедры(k) = Кафедра
End If
Next
Nexti
'5. Заполняем поле со списком и выводим форму на экран:
frmКафедра.cbo Кафедра.List = Кафедры
frmКафедра.Show
End Sub
Задание:
1. В Модуль10 наберите и протестируйте программу ПолеСоСписком.
2. В модуле формы frmКафедра напишите программу обработки события «щелчок/нажатие кнопки cmdОтмена», которая выгружает форму из памяти.
3. Оформите фрагмент сортировки одномерного массива в виде подпрограммы СортировкаМассива(КолЭлементов).
Определение выбранного элемента
Для того чтобы узнать, какой элемент списка выбрал пользователь, воспользуемся свойством Value:
Private Sub cmdOK_Click()
Dim Кафедра As String
Кафедра = cboКафедра.Value
MsgBox "Выбрана кафедра " & Кафедра & "!", _
vbInformation, "Сообщение"
Unload Me
End Sub
Задание:
В модуле формы frmКафедра наберите и протестируйте эту программу.
Создание взаимосвязанных элементов управления
Предположим, что нам надо создать форму, которая позволяла бы осуществлять выбор преподавателей любой кафедры[11] (Рис. 10‑11):
Рис. 10‑11. Пример формы с взаимосвязанными списками
ТРЕБУЕТСЯ:
1. Создать форму Институт (выполните самостоятельно!) и написать программу инициализации формы, в которой список кафедр и преподавателей формируются на основе данных, расположенных в первом столбце на листе Кадры в книге C:\St\Институт.xls (Рис. 10‑10).
2. Поле со списком Выберите кафедру и список Укажите преподавателей организовать как взаимосвязанные списки. Это значит, что при выборе пользователем какой-то кафедры должен автоматически формироваться список преподавателей этой кафедры.
Начальные условия
1) при создании формы присвойте следующие имена элементам управления:
кнопке ОК – cmdOK
кнопке Отмена – cmdОтмена
полю со списком – cboКафедра
списку –lstСотрудник
2) саму форму назовите frmИнститут.
ВЫПОЛНЕНИЕ ЗАДАНИЯ:
1.После того как форма создана, в модуле формы наберите следующий код:
Option Base 1
Private SubUserForm_Initialize()
' 1. Объявляем переменные и массивы:
Dim Кафедры() As String
Dim Кафедра As String
Dim НомерСтроки As Integer
Dim КолСотрудников As Integer
Dim КолКафедр As Integer
'2. Проверяем существование книги C:\St\Институт.xls
Call НаличиеКниги("C:\St\Институт.xls")
If flagНаличие = 0 Then Exit Sub
'3. Проверяем существование листа Кадры
Call НаличиеЛиста("Кадры")
If flag = 0 Then Exit Sub
'4. Формируем список кафедр:
ReDim Preserve Кафедры(1) As String
Кафедры(1) = Trim(Cells(3, 1).Value)
КолКафедр = 1 'кол-во кафедр
НомерСтроки = 4
WhileTrim(Cells(НомерСтроки, 1).Value) <> ""
Кафедра = Trim(Cells(НомерСтроки, 1).Value)
For j = 1 To КолКафедр
If Кафедра = Кафедры(j) Then GoTo n3
Next j
КолКафедр = КолКафедр + 1
ReDim Preserve Кафедры(КолКафедр) As String
Кафедры(КолКафедр) = Trim(Cells(НомерСтроки, 1).Value)
n3: НомерСтроки = НомерСтроки + 1
Wend
'5. Сортируем названия кафедр:
Call СортировкаМассива(КолЭлементов)
'6. Заполняем поле со списком и выводим форму на экран:
cboКафедра.List = Кафедры
End Sub
2.Дважды щелкните (в форме!) по элементу cboКафедра - появится пустая процедура Private Sub cboКафедра_Change. Далее наберите следующий код:
Private Sub cboКафедра_Change()
Dim ПреподавателиТранс() As String
Dim Преподаватели() As String
'1. Отбираем сотрудников кафедры АСУ в массив Преподаватели:
НомерСтроки = 3
КолСотрудников = 0
Worksheets("Кадры").Select
While Trim(Cells(НомерСтроки, 2).Value) <> ""
If Trim(Cells(НомерСтроки, 1).Value) = _
cboКафедра.Value Then
КолСотрудников = КолСотрудников + 1
ReDim Preserve Преподаватели(2, КолСотрудников)
Преподаватели(1, КолСотрудников) = _
Cells(НомерСтроки, 2).Value
Преподаватели(2, КолСотрудников) = _
Cells(НомерСтроки, 3).Value
End If
НомерСтроки = НомерСтроки + 1
Wend
'2. Транспонируем массив Преподаватели:
ReDim ПреподавателиТранс(КолСотрудников + 1, 2)
For i = 1 To КолСотрудников
ПреподавателиТранс(i, 1) = Преподаватели(1, i)
ПреподавателиТранс(i, 2) = Преподаватели(2, i)
Next i
'3. Заполняем список, состоящий из двух колонок и выводим _
форму на экран:
With lstCотрудник
.ColumnCount = 2
.MultiSelect = fmMultiSelectMulti
.List = ПреподавателиТранс
End With
End Sub
ОБРАТИТЕ ВНИМАНИЕ на условие:
If Trim(Cells(НомерСтроки, 1).Value) = cboКафедра.Value Then
Именно свойство Valueэлемента управления cboКафедра «знает», какую кафедру выбрал пользователь!
3.Расширим постановку задачи: при щелчке по кнопке ОК выведем информацию о том, какую кафедру и скольких преподавателей выбрал пользователь:
Private Sub cmdOK_Click()
Dim Сотрудников As Integer
Dim Кафедра As String
For i = 0 To lstCотрудник.ListCount - 1
If lstCотрудник.Selected(i) = True Then_
Сотрудников = Сотрудников + 1
Next i
MsgBox "Выбрано " & Сотрудников & _
" преподавателей кафедры " & cboКафедра.Value _
& "!", vbInformation, "Сообщение"
Unload Me
End Sub
4.В завершение введем код для обработки события «щелчок по кнопке Отмена»:
Private Sub cmdОтмена_Click()
Unload Me
End Sub
5.Свяжите вызов формы с кнопкой на панели инструментов или с командой меню. Для этого пердварительно напишите программу ВызовФормы:
SubВызовФормы()
frmИнститут.Show
End Sub
6.Протестируйте работу созданного приложения.
7.В процедуре ВзаимосвязанныеСписки установите точку останова в строке: frmИнститут.cboКафедра.List = Кафедры, запустите эту программу и далее выполните её в пошаговом режиме. Обратите внимание на передачу управления во подпрограмму Private Sub cboКафедра_Change().
Флажок (CheckBox)
Следующие элементы управления используются для большей наглядности вариантов выбора, когда их количество невелико. К ним относятся такие элементы управления как CheckBox, ToggleButton и OptionButton.
Предположим, что нам надо создать форму, с помощью которой пользователь указывает нужный ему семестр:
Рис. 10‑12
ТРЕБУЕТСЯ: создать форму (выполните самостоятельно!) и написать программу её инициализации.
Начальные условия
1) при создании формы присвойте следующие имена элементам управления:
кнопке ОК – cmdOK
кнопке Отмена – cmdОтмена
флажку Осенний семестр – chkОсень
флажку Весенний семестр – chkВесна
2) саму форму назовите frmСеместрCheckBox.
Тогда код, который инициализирует форму с двумя флажками, запишется так:
SubfrmСеместрCheckBox_Initialize()
cmdOK.Default = True
cmdОтмена.Cancel = True
chkОсень.Caption = "Осенний семестр"
chkВесна.Caption = "Весенний семестр"
chkОсень.Value = True
End Sub
Задание:
1. В Модуль11 наберите и протестируйте программу frmСеместрCheckBox_Initialize.
2. В модуле формы frmСеместрCheckBox напишите программу обработки события «щелчок/нажатие кнопки cmdОтмена», которая выгружает форму из памяти.
Расширим задачу и выведем на экран сообщение с информацией о том, какой семестр(ы) выбрал пользователь.
Для того чтобы узнать, установлен флажок или сброшен, воспользуемся свойством Value:
Private Sub cmdOK_Click()
If ChkОсень.Value = True And chkВесна.Value = True Then
MsgBox "Выбраны оба семестра!", vbInformation, _
"Сообщение"
ElseIf ChkОсень.Value = True And chkВесна.Value = False Then
MsgBox "Выбран осенний семестр!", vbInformation, _
"Сообщение"
ElseIf ChkОсень.Value = False And chkВесна.Value = True Then
MsgBox "Выбран осенний семестр!", vbInformation, _
"Сообщение"
Else
MsgBox "Не выбран ни один семестр!", vbInformation, _
"Сообщение"
End If
Unload Me
End Sub
Задание:
В модуле формы наберите эту программу и протестируйте работу приложения.