ЛАБОРАТОРНАЯ РАБОТА № 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.