
- •Лабораторная работа №12 по курсу “Компьютерные информационные технологии” разработка программ на языке vba для работы с пользовательскими формами в excel
- •1 Создание пользовательской формы в Excel
- •2 Программа с использованием пользовательской формы: пример 1 (кнопки, текстовые поля, надписи, простые списки)
- •2.1 Создание элементов управления и указание их свойств
- •2.2 Разработка программы
- •3 Программа с использованием пользовательской формы: пример 2 (счетчики, флажки)
- •3.1 Создание элементов управления и указание их свойств
- •3.2 Разработка программы
- •4 Список из нескольких колонок
- •5 Список с возможностью выбора нескольких элементов
- •6 Составление списка в программе
- •7 Поля ввода ячеек
4 Список из нескольких колонок
Пример 3. В рабочий листExcelвведен список сотрудников некоторой организации (столбецA) и их доходы (столбецB). Эти данные должны отображаться в списке, содержащемся в пользовательской форме (см. рисунок 5).
|
|
Рисунок 5 – Пользовательская форма со списком с двумя колонками (пример 3) |
Рисунок 6 – Пользовательская форма со списком с возможностью выбора нескольких элементов (пример 4) |
При щелчке по элементу списка (т.е. при выборе сотрудника) должен вычисляться налог и отображаться в текстовом поле “Налог” на форме. Кроме того, вычисленная величина должна выводиться в рабочий лист Excelв столбецC(рядом с доходом соответствующего работника). При нажатии на кнопку “Выход” форма должна закрываться.
Для решения этой задачи требуется создать пользовательскую форму. Установить для нее свойства: Name=Nalogi,Caption= Расчет налогов.
Требуется разместить на форме элементы управления и задать им свойства, как показано в таблице 1.
Таблица 1 – Элементы управления для примера 3
Элемент управления |
Свойства |
Список (Listbox) |
Name=spisok_sotr |
Надпись (Label) |
Caption = Налог |
Текстовое поле (TextBox) |
Name = Pole_nalog |
Кнопка (CommandButton) |
Name = Vyhod, Caption = Выход |
Ввести следующую процедуру инициализации пользовательской формы:
Private Sub userform_initialize()
Set d = Range("A1").CurrentRegion
With spisok_sotr
.ColumnCount = 2
.RowSource = d.Address
End With
End Sub
Здесь в операторе Set d = Range("A1").CurrentRegionпеременнаяdсвязывается с диапазоном, заполненным данными (в данном примере – фамилиями сотрудников и их доходами). ОператорWithиспользуется для сокращения ссылок на объект (в данном случае – на списокspisok_sotr); область его действия завершается строкойEnd With. В операторе.ColumnCount = 2устанавливается свойство спискаspisok_sotr, задающее количество его колонок (имя списка задано в оператореWith). В операторе.RowSource = d.Addressсвойству спискаRowSource, задающему источник данных для заполнения списка, присваивается адрес объектаd(т.е. диапазона с данными).
Для обработки щелчка по элементу списка введем следующую процедуру:
Private Sub spisok_sotr_Click()
With spisok_sotr
i = .ListIndex
dohod = .List(i, 1)
Call raschet_naloga(dohod, nalog)
Pole_nalog.Value = nalog
Cells(i + 1, 3).Value = nalog
End With
End Sub
Здесь в операторе i = .ListIndexпеременнойi присваивается номер текущего элемента (точнее, текущей строки) спискаspisok_sotr; следует обратить внимание, что строки (как и столбцы) списка нумеруются с нуля. В оператореdohod = .List(i, 1)переменнойdohodприсваивается величина изi-й строки и первого столбца спискаspisok_sotr, т.е. величина дохода выбранного сотрудника. Следует еще раз обратить внимание, что столбцы списка нумеруются с нуля, т.е. в нулевом столбце находятся фамилии, а в первом – доходы.
В операторе Call raschet_naloga(dohod, nalog)вызывается процедура, реализующая алгоритм расчета налога. Результатом ее выполнения является переменнаяdohod. В двух следующих операторах эта величина выводится в текстовое поле пользовательской формы и в рабочий листExcel.
Процедура расчета налога может быть, например, следующей:
Sub raschet_naloga(ByVal summa_dohoda, summa_naloga)
If summa_dohoda < 20000 Then
summa_naloga = summa_dohoda * 0.09
Else
summa_naloga = 20000 * 0.09 + (summa_dohoda - 20000) * 0.12
End If
End Sub
Здесь обозначение ByValуказывает, что в переменнуюsumma_dohodaпередается только значение соответствующей переменной, указанной при вызове процедуры (в данном случае – переменнойdohod). Тем самым исключается случайное изменение переменнойdohodв процедуре. Следует обратить внимание, что обозначениеByValотносится только к переменнойsumma_dohoda; таким образом, изменение переменнойsumma_nalogaвызывает изменение соответствующей переменнойnalogв вызывающей процедуре.
Приведем также процедуру для закрытия формы нажатием кнопки vyhod:
Private Sub vyhod_Click()
Unload Nalogi
End Sub