Описание лабораторной работы № 14

advertisement
ЛАБОРАТОРНАЯ РАБОТА № 14.
РАЗРАБОТКА ПОЛЬЗОВАТЕЛЬСКОЙ ФОРМЫ
Пользовательские формы – это диалоговые окна, содержащие управляющие
элементы, позволяющие задавать данные для обработки. В качестве примера разработаем
форму, для формирования одномерного массива, содержащего элементы исходного
диапазона, попадающие или не попадающие в заданный интервал.
1. Выполнение задания
1. Запустите приложение Microsoft Excel и сохраните файл Книга1 в своей рабочей папке
под именем Форма.xlsm (не забудьте изменить расширение файла).
2. Откройте редактор VBE и вставьте пользовательскую форму с помощью команды
редактора Insert  UserForm.
3. В окне свойств измените имя формы (свойство Name) на UserFormArray и заголовок
формы (свойство Caption) на Формирование массива. Если окна свойств нет на экране,
его можно отобразить с помощью команды редактора View  Properties Window.
4. Создайте форму, аналогичную показанной на рис. 1. Управляющие элементы
создаются с помощью инструментов окна Toolbox. Если этого окна нет на экране, его
можно отобразить с помощью команды редактора View  Toolbox.
Рис. 1. Пользовательская форма для решения поставленной задачи
5. Задайте управляющим элементам следующие имена: RefEditInputData, RefEditResult,
CheckBoxWorksheet, OptionButtonInRange, OptionButtonOutOfRange, TextBoxLeft,
TextBoxRight, CommandButtonExecute, CommandButtonClose. Для меток и рамок можно
оставить имена, заданные по умолчанию.
6. Для элемента OptionButtonInRange установите значение True для свойства Value.
7. Для элемента CommandButtonExecute установите значение False для свойства Enabled.
8. Щёлкните правой кнопкой мыши по имени формы в дереве проекта и из
появившегося меню выберите View Code. Вы увидите модуль формы. В данный
момент он пуст.
9. Напишите инструкцию Option Explicit в модуле формы, для того чтобы избежать
использования необъявленных переменных.
10. Для того чтобы при запуске формы в поле выбора диапазона автоматически
вставлялась ссылка на текущий выделенный диапазон, вставьте в модуль следующую
процедуру обработки события:
Private Sub UserForm_Initialize()
RefEditInputData.Text = ActiveWindow.RangeSelection.Address
End Sub
11. Щёлкните правой кнопкой мыши по имени формы в дереве проекта и из
появившегося меню выберите View Object, чтобы снова увидеть форму.
12. Дважды щёлкните левой кнопкой мыши по кнопке «Закрыть». Редактор создаст процедуру обработки события «щелчок левой кнопкой мыши по кнопке». Вставьте в эту
процедуру команду для закрытия формы. Должна получиться следующая процедура:
Private Sub CommandButtonClose_Click()
Unload Me
End Sub
13. Снова переключитесь на форму и дважды щёлкните левой кнопкой мыши по
текстовому полю. Редактор создаст процедуру обработки события «изменение
содержимого текстового поля». В эту процедуру необходимо вставить инструкции,
которые делают кнопку «Выполнить» активной, если введены все необходимые
данные (т.е. задан исходный диапазон, задан диапазон для результата или установлен
флажок «Поместить результат на отдельном листе», заданы границы интервала), и
неактивной в противном случае. Процедура будет выглядеть следующим образом:
Private Sub TextBoxLeft_Change()
If RefEditInputData.Value <> "" And _
(RefEditResult.Value <> "" Or CheckBoxWorksheet.Value) And _
TextBoxLeft.Value <> "" And TextBoxRight.Value <> "" Then
CommandButtonExecute.Enabled = True
Else
CommandButtonExecute.Enabled = False
End If
End Sub
14. Создайте такую же процедуру для другого текстового поля.
15. Аналогичные процедуры необходимо создать для полей выбора диапазона. Однако
при двойном щелчке по этому управляющему диапазона создаётся процедура не для
обработки события «изменение содержимого элемента», а для другого события.
Поэтому проще набрать эту процедуру вручную полностью, включая заголовок:
Private Sub RefEditInputData_Change()
If RefEditInputData.Value <> "" And _
(RefEditResult.Value <> "" Or CheckBoxWorksheet.Value) And _
TextBoxLeft.Value <> "" And TextBoxRight.Value <> "" Then
CommandButtonExecute.Enabled = True
Else
CommandButtonExecute.Enabled = False
End If
End Sub
16. Создайте такую же процедуру для другого поля выбора диапазона.
17. Переключитесь на форму и дважды щёлкните левой кнопкой мыши по кнопкефлажку. Редактор создаст процедуру обработки события «щелчок левой кнопкой
мыши по кнопке-флажку». Эта процедура должна делать неактивным поле для выбора
диапазона для результата, если флажок установлен, а также устанавливать активность
кнопки «Выполнить». Процедура будет выглядеть следующим образом:
Private Sub CheckBoxWorksheet_Click()
If CheckBoxWorksheet.Value Then
RefEditResult.Enabled = False
Else
RefEditResult.Enabled = True
End If
If RefEditInputData.Value <> "" And _
(RefEditResult.Value <> "" Or CheckBoxWorksheet.Value) And _
TextBoxLeft.Value <> "" And TextBoxRight.Value <> "" Then
CommandButtonExecute.Enabled = True
Else
CommandButtonExecute.Enabled = False
End If
End Sub
18. Переключитесь на форму и дважды щёлкните левой кнопкой мыши по кнопке
«Выполнить». Вставьте в появившуюся процедуру инструкции для проверки ошибок
и обработки данных:
Private Sub CommandButtonExecute_Click()
Dim id As Range, r As Range, cell As Range
Dim left As Integer, right As Integer, answer As Integer, inRange As Boolean
' Отменяем стандартную обработку ошибок
On Error Resume Next
' Проверяем правильность задания исходного диапазона
Set id = Range(RefEditInputData.Value)
If Err.Number <> 0 Then
MsgBox "Исходный диапазон задан неверно!"
RefEditInputData.SetFocus
Exit Sub
End If
' Проверяем правильность задания диапазона для результата
' Если установлен флажок, требующий поместить результат на отдельном листе,
' создаём новый лист и выбираем первую ячейку в качестве диапазона для результата
If CheckBoxWorksheet.Value Then
Worksheets.Add after:=ActiveSheet
Set r = Range("A1")
Else
Set r = Range(RefEditResult.Value).Range("A1")
If Err.Number <> 0 Then
MsgBox "Диапазон для результата задан неверно!"
RefEditResult.SetFocus
Exit Sub
End If
End If
' Проверяем правильность задания левой границы интервала
left = CInt(TextBoxLeft.Value)
If Err.Number <> 0 Then
MsgBox "Левая граница интервала должна быть числом!"
TextBoxLeft.SetFocus
Exit Sub
End If
' Проверяем правильность задания правой границы интервала
right = CInt(TextBoxRight.Value)
If Err.Number <> 0 Then
MsgBox "Правая граница интервала должна быть числом!"
TextBoxRight.SetFocus
Exit Sub
End If
' Восстанавливаем стандартную обработку ошибок
On Error GoTo 0
' Устанавливаем признак того, какие данные искать – попадающие в интервал
' или не попадающие
If OptionButtonInRange.Value Then
inRange = True
Else
inRange = False
End If
' Проверяем наличие нечисловых данных
For Each cell In id
If VarType(cell.Value) <> vbDouble Then
answer = MsgBox("Исходный диапазон содержит нечисловые данные. _
Продолжить обработку?", vbYesNo + vbQuestion)
If answer = vbNo Then Exit Sub
Exit For
End If
Next cell
' Ищем требуемые данные
For Each cell In id
If inRange Then
If left <= cell.Value And cell.Value <= right Then
r.Value = cell.Value
Set r = r.Offset(0, 1)
End If
Else
If left > cell.Value Or cell.Value > right Then
r.Value = cell.Value
Set r = r.Offset(0, 1)
End If
End If
Next cell
End Sub
19. Назначить комбинацию клавиш непосредственно пользовательской форме нельзя.
Поэтому если мы хотим вызывать форму с помощью комбинации клавиш, необходимо
вставить новый модуль и написать процедуру, вызывающую форму с помощью
метода Show. Затем этой процедуре можно назначить требуемую комбинацию клавиш.
20. После разработки все требуемых процедур наберите на рабочем листе данные для
проверки работы пользовательской формы. Проверьте работоспособность той части,
которая проверяет наличие ошибок. Проверьте правильность выбора элементов,
попадающих в заданный интервал и не попадающих в заданный интервал. Попробуйте
поместить результат на тот же рабочий лист и на другой рабочий лист.
21. Покажите результаты работы преподавателю.
22. Закройте приложение Microsoft Excel.
2. Вопросы для контроля
Что такое пользовательская форма?
Зачем нужны пользовательские формы?
Какие управляющие элементы вы знаете?
Как вставить пользовательскую форму?
Как изменить заголовок пользовательской формы?
Как добавить управляющие элементы на форму?
Как изменить свойства управляющих элементов?
Зачем необходимо свойство Value? Какой тип имеет это свойство для различных
управляющих элементов?
9. Зачем необходимо свойство Enabled?
10. Как осуществляется работа с управляющими элементами?
1.
2.
3.
4.
5.
6.
7.
8.
Download