Список (ListBox) и поле со списком (ComboBox)
Список (ListBox)
Предположим, что нам надо создать следующую форму, с помощью которой пользователь мог указывать преподавателей кафедры:
ТРЕБУЕТСЯ: создать форму (выполните самостоятельно!) и написать программу инициализации формы, в которой:
§ Список преподавателей должен быть в 2 колонки (1-я колонка – Ф.И.О, 2-я – Должность).
§ В список заносятся только преподаватели кафедры АСУ.
§ Предусмотрена возможность выбора нескольких элементов.
§ Элементы списка формируются на основе данных, расположенных на листе Кадры в книге C:\St\Институт.xls (Рис. 10‑10):
Рис. 10‑10. Структура базы данных Кадры
Начальные условия
1) при создании формы присвойте следующие имена элементам управления:
кнопке ОК – cmdOK
кнопке Отмена – cmdОтмена
списку – lstСотрудник
2) саму форму назовите frmСписок_в_2_колонки.
Тогда программа инициализации формы и 2 её подпрограммы будут выглядеть, например, так:
1) | Option Base 1 |
2) | Dim flagНаличие As Integer |
3) | Dim flag As Integer |
4) | Sub Список_2_колонки() |
5) | Dim Преподаватели() As String |
6) | Dim ПреподавателиТранс () As String |
7) | Dim НомерСтроки As Integer |
8) | Dim КолСотрудников As Integer |
9) | On Error GoTo Ошибка |
10) | '1. Проверяем существование книги C:\St\Институт.xls |
11) | Call НаличиеКниги("C:\St\Институт.xls") |
12) | If flagНаличие = 0 Then Exit Sub |
13) | '2. Проверяем существование листа Кадры |
14) | Call НаличиеЛиста("Кадры") |
15) | If flag = 0 Then Exit Sub |
16) | '3. Отбираем сотрудников кафедры АСУ в массив _ Преподаватели: |
17) | НомерСтроки = 3 |
18) | КолСотрудников = 0 |
19) | While Trim(Cells(НомерСтроки, 2).Value) <> "" |
20) | If Trim(Cells(НомерСтроки, 1).Value) = " АСУ" Then |
21) | КолСотрудников = КолСотрудников + 1 |
22) | ReDim Preserve Преподаватели(2, КолСотрудников) |
23) | Преподаватели(1, КолСотрудников) = _ Cells(НомерСтроки, 2).Value |
24) | Преподаватели(2, КолСотрудников) = _ Cells(НомерСтроки, 3).Value |
25) | End If |
26) | НомерСтроки = НомерСтроки + 1 |
27) | Wend |
28) | '4. Транспонируем массив Преподаватели: |
29) | ReDim ПреподавателиТранс(КолСотрудников, 2) |
30) | For i = 1 To КолСотрудников |
31) | ПреподавателиТранс (i, 1) = Преподаватели(1, i) |
32) | ПреподавателиТранс (i, 2) = Преподаватели(2, i) |
33) | Next i |
34) | '5. Заполняем список, состоящий их 2-х колонок и _ |
35) | выводим форму на экран: |
36) | With frmСписок_в_2_колонки.lstСотрудник |
37) | .ColumnCount = 2 |
38) | .MultiSelect = fmMultiSelectMulti |
39) | .List = ПреподавателиТранс |
40) | End With |
41) | frmСписок_в_2_колонки.Show |
42) | Exit Sub |
43) | Ошибка: |
44) | MsgBox "Программа выполнила недопустимую операцию и _ будет закрыта!", vbCritical, "Сообщение об ошибке" |
45) | End Sub |
1) | Sub НаличиеКниги(ПолноеИмяФайла) |
2) | Dim ПолноеИмяФайла As String |
3) | Dim Файл As String |
4) | flagНаличие = 1 |
5) | flag = 0 |
6) | '1. Проверяем существование книги: |
7) | Файл = Dir(ПолноеИмяФайла) |
8) | If Файл = "" Then |
9) | flagНаличие = 0 |
10) | MsgBox "Файл " & ПолноеИмяФайла & " не найден!", _ vbInformation |
11) | Exit Sub |
12) | End If |
13) | '2. Проверяем, открыта ли книга: |
14) | For i = 1 To Workbooks.Count |
15) | If Workbooks(i).Name = Файл Then |
16) | Workbooks(i).Activate |
17) | flag = 1 |
18) | Exit For |
19) | End If |
20) | Nexti |
21) | If flag = 0 Then _ Workbooks.Open Filename:= ПолноеИмяФайла |
22) | End Sub |
1) | Sub НаличиеЛиста(Лист) |
2) | Dim Лист As String |
3) | 'Проверяем наличие листа: |
4) | flag = 0 |
5) | For i = 1 To Worksheets.Count |
6) | If Worksheets(i).Name = Лист Then |
7) | flag = 1 |
8) | Exit For |
9) | End If |
10) | Nexti |
11) | If flag = 1 Then |
12) | Sheets(Лист).Select |
13) | Else |
14) | MsgBox "Не могу сформировать список - лист " & _ Лист & " не найден!", vbExclamation, _ “Сообщение об ошибке” |
15) | Exit Sub |
16) | End If |
17) | End Sub |
Замечания:
1. Подпрограмма НаличиеКниги проверяет, существует ли нужная нам книга.
2. Подпрограмма НаличиеЛиста проверяет, существует ли искомый лист.
3. Приведенный пример не является догмой, а руководством к действию. вы можете написать свой код – гораздо лучший J!
Задание:
В Модуль10 наберите и протестируйте представленные выше программы.
Определение выбранных элементов списка
Расширим нашу задачу и подсчитаем количество выбранных сотрудников. Полученную цифру выведем на экран.
Для того чтобы определить, какие элементы списка выбрал пользователь, воспользуемся свойством Selected:
Option Base 1
Private Sub cmdOK_Click()
Dim Сотрудников As Integer
For i = 0 To lstСотрудник.ListCount - 1
If lstСотрудник.Selected(i) = True Then_
Сотрудников = Сотрудников + 1
Next i
MsgBox "Выбрано " & Сотрудников & " сотрудников!", _
vbInformation, "Сообщение"
Unload Me
End Sub
Задание:
1. В модуле формы frmСписок_в_2_колонки наберите и протестируйте программу cmdOK_Click.
2. Напишите и протестируйте программу cmdОтмена_Click.