Поле со списком (ComboBox)

Предположим, что нам надо создать форму, с помощью которой пользователь указывает нужную ему кафедру:

Поле со списком (ComboBox) - student2.ru

ТРЕБУЕТСЯ: создать форму (выполните самостоятельно!) и написать программу инициализации формы, в которой элементы поля со списком формируются на основе данных, расположенных в первом столбце на листе Кадры в книге 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):

Поле со списком (ComboBox) - student2.ru

Рис. 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.

Предположим, что нам надо создать форму, с помощью которой пользователь указывает нужный ему семестр:

Поле со списком (ComboBox) - student2.ru

Рис. 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

Задание:

В модуле формы наберите эту программу и протестируйте работу приложения.

Наши рекомендации