Лекция 8. Пользовательские формы 1. Пользовательские формы Большинство способов запуска процедуры позволяют вызвать только процедуру, не имеющую параметров. Например, в диалоговом окне Макрос не отображаются процедуры, требующие передачи параметров. Это происходит из-за того, что большинство способов вызова процедуры не имеют возможностей для передачи параметров. Процедуру с параметрами можно вызвать только из другой процедуры. Обычно в качестве такой вызывающей процедуры используется процедура, связанная с каким-либо событием. В подавляющем большинстве случаев таким событием является нажатие кнопки. Для задания параметров используются так называемые управляющие элементы, которые могут быть размещены как на рабочем листе, так и пользовательской форме. Пользовательская форма – это диалоговое окно, содержащее управляющие элементы, которые позволяют вводить данные различных типов и инициализировать вызов процедур. Пользовательская форма, как и любой объект, имеет свойства, методы и события. Свойства пользовательской формы, а также управляющих элементов, можно менять при разработке формы в окне Properties или в процессе работы программы с помощью инструкций языка VBA. 1.1. Свойства пользовательской формы Свойства пользовательской формы позволяют управлять её позицией на экране, размерами, цветом фона и текста, наличием полос прокрутки и т.п. Рассмотрим основные свойства пользовательской формы. Свойство Описание Name Позволяет задать имя объекта, которое должно отражать назначение пользовательской формы. Позволяет задать заголовок пользовательской формы. Позволяет задать шрифт, который будет использоваться в управляющих элементах формы (по умолчанию – 8, мелковато). Позволяет задать исходную позицию формы (по умолчанию установлено удобное значение CenterOwner). Определяет, будет ли форма модальной или нет (модальные формы не позволяют переключаться на другие объекты до их закрытия). Caption Font StartUpPosition ShowModal 1.2. Методы пользовательской формы Пользовательская форма имеет два основных метода – Show и Hide, которые позволяют отобразить и скрыть пользовательскую форму. Однако для закрытия пользовательской формы обычно используют процедуру Unload. UserFormNewStudent.Show UserFormNewStudent.Hide Unload UserFormNewStudent Unload Me 1.3. События пользовательской формы Событие Initialize Activate Deactivate QueryClose Terminate Событие происходит Перед загрузкой пользовательской формы. При активации пользовательской формы. При деактивации пользовательской формы. Перед закрытием пользовательской формы. Параметры процедуры для этого события позволяют отменить закрытие формы. После закрытия пользовательской формы. 2. Управляющие элементы Как было сказано, управляющие элементы позволяют вводить данные различных типов и инициализировать действия по обработке этих данных. Есть несколько свойств, которые актуальны для любого управляющего элемента. Свойство Name Enabled Visible Font Описание Имя элемента. Как любое уважающее себя имя должно отражать смысл элемента. Определяет активность элемента. Если это свойство имеет значение false, то элемент неактивен – он становится «тусклым» и не реагирует на мышь и клавиатуру. Определяет видимость элемента. Если это свойство имеет значение false, то элемент становится невидимым. Шрифт для отображения текста надписи или содержимого управляющего элемента. Также все элементы имеют высоту и ширину, и для всех элементов задаётся позиция на форме. Однако эти свойства обычно редактируются не в окне Properties, а с помощью мыши. 2.1. Метка Одним из самых простых элементов является метка (Label). Этот элемент позволяет отобразить текст на форме. Свойство Caption 2.2. Описание Отображаемый текст. Текстовое поле Текстовое поле (TextBox) позволяет пользователю вводить текст. Свойство MaxLength Value 2.3. Описание Максимальное количество символов, которые может ввести пользователь. Текст элемента. Кнопка Кнопки (CommandButton) используются для инициализации пользователем каких-либо действий. Свойство Caption 2.4. Описание Надпись на кнопке. Кнопка-флажок Кнопка-флажок (CheckBox) позволяет пользователю делать выбор из двух возможностей. Свойство Caption Value 2.5. Описание Надпись. Если свойство имеет значение true, то элемент отмечен галочкой. Кнопка-переключатель Кнопки-переключатели (OptionButton) позволяют пользователю выбирать одну и только одну из нескольких возможностей. Свойство Caption Value GroupName Описание Надпись. Свойство имеет значение true, если элемент выбран. Позволяет разделить кнопки-переключатели формы на несколько групп. 2.6. Выпадающий список Выпадающий список (ComboBox) позволяет пользователю выбрать одну из нескольких возможностей или ввести свой вариант. Свойство MaxLength RowSource Value 2.7. Описание Максимальное количество символов, которые может ввести пользователь. Диапазон рабочего листа, из которого берутся элементы выпадающего списка. Выбранный элемент выпадающего списка или ведённый пользователем текст. Рамка Рамка (Frame) позволяет объединить несколько элементов в группу. Свойство Caption 2.8. Описание Заголовок группы. Поле выбора диапазона Поле выбора диапазона (RefEdit) – уникальный управляющий элемент. Подобные управляющие элементы (в отличие от предыдущих рассмотренных элементов) не встречаются в других средах разработки приложений. Назначение этого элемента очевидно – он предоставляет возможность выбора диапазона ячеек рабочего листа с помощью мыши. Свойство Value 2.9. Описание Текст с именем выбранного диапазона. Порядок обхода Нажатие клавиши Tab приводит к передаче фокуса от одного элемента формы к другому. Порядок этой передачи определяется так называемым порядком обхода. Все управляющие элементы имеют свойства TabIndex и TabStop. Свойство TabStop определяет, будет ли передаваться этому элементу фокус при нажатии клавиши Tab. Свойство TabIndex определяет позицию управляющего элемента в порядке обхода. Изначально порядок обхода соответствует порядку создания элементов формы. При необходимости изменить порядок обхода можно отредактировать свойство TabIndex элементов формы или воспользоваться редактором порядка обхода. Для вызова этого редактора необходимо щёлкнуть на форме правой кнопкой мыши и из появившегося контекстного меню выбрать пункт Tab Order. 2.10. События управляющих элементов Как и все объекты, управляющие элементы позволяют задавать реакцию на определённые события. При двойном щелчке мышью по управляющему элементу создаётся или открывается процедура обработки события по умолчанию. В основном нам придётся задавать реакцию именно на события по умолчанию. Для кнопки это нажатие кнопки, для текстового поля – изменение введённого текста, для кнопок-флажков и кнопок-переключателей – щелчок мышью по кнопке, для выпадающего списка – изменение (любым способом – вводом и выбором) выбранного элемента списка. 3. Примеры разработки пользовательских форм 3.1. Поиск в диапазоне ячейки с заданным значением 'Процедура обработки события «нажатие на кнопку» Private Sub ButtonFind_Click() Dim userRange As Range, cell As Range Dim value As String 'Проверка и определение диапазона On Error Resume Next Set userRange = Range(RefEditRange.Text) If Err.Number <> 0 Then MsgBox "Неправильный диапазон" RefEditRange.SetFocus Exit Sub End If On Error GoTo 0 'Проверка и задание искомого значения If TextBoxValue.value = "" Then MsgBox "Введите искомое значение" TextBoxValue.SetFocus Exit Sub Else value = TextBoxValue.value End If 'Поиск For Each cell In userRange If cell.value = value Then cell.Select MsgBox "Найдена ячейка " & cell.Address(False, False) Exit Sub End If Next cell MsgBox "Ячейка не найдена" End Sub 'Процедура обработки события «инициализация пользовательской формы» Private Sub UserForm_Initialize() RefEditRange.Text = ActiveWindow.RangeSelection.Address End Sub 3.2. Поиск в диапазоне ячейки с заданным значением с учётом регистра 'Процедура обработки события «нажатие на кнопку» Private Sub ButtonFind_Click() Dim userRange As Range, cell As Range Dim value As String, matchCase As Boolean 'Проверка и определение диапазона ... 'Проверка и задание искомого значения ... 'Учитывать регистр? matchCase = CheckBoxCase.value 'Поиск For Each cell In userRange If matchCase And cell.value = value Or _ Not matchCase And LCase(cell.value) = LCase(value) Then cell.Select MsgBox "Найдена ячейка " & cell.Address(False, False) Exit Sub End If Next cell MsgBox "Ячейка не найдена" End Sub 3.3. Добавление нового сотрудника Private Sub OptionButtonStaff_Click() ComboBoxPost.value = "" ComboBoxPost.RowSource = "Лист4!B1:B5" End Sub Private Sub OptionButtonTeachers_Click() ComboBoxPost.value = "" ComboBoxPost.RowSource = "Лист4!A1:A4" End Sub Private Sub TextBoxSurname_Change() If TextBoxSurname.value <> "" And TextBoxName.value <> "" And _ TextBoxFatherName.value <> "" Then ButtonAdd.Enabled = True Else ButtonAdd.Enabled = False End If End Sub 4. Использование управляющих элементов на рабочем листе Практически все управляющие элементы можно разместить непосредственно на рабочем листе. Для этого необходимо нажать кнопку Вставить, находящуюся в группе Элементы управления на вкладке Разработчик. Управляющие элементы кнопка-флажок, кнопкапереключатель, список и выпадающий список могут быть легко связаны с ячейкой рабочего листа. Это избавляет от необходимости программировать процедуры обработки событий. В ячейке, связанной с кнопкой-флажком, отображается значение истина или ложь. В ячейке, связанной с группой кнопок-переключателей, отображается номер выбранного переключателя. Список и выпадающий список можно связать с диапазоном, из которого будут браться элементы списка, и с ячейкой-результатом, куда будет записан номер выбранного элемента. 5. Стандартные диалоговые окна 5.1. Функция VBA InputBox Функция VBA InputBox запрашивает у пользователя одно значение. Она всегда возвращает строку, поэтому при необходимости нужно преобразовывать введённую строку в значение нужного типа. Функция InputBox имеет следующий синтаксис: InputBox(Prompt [, Title] [, Default] [, xpos] [, ypos] [, Helpfile, Context]) Функция имеет один обязательный параметр Prompt – запрос, отображаемый в окне ввода. Также можно указать заголовок окна (Title), значение по умолчанию, вставляемое в поле ввода (Default), позицию окна на экране (xpos, ypos) и раздел справочной системы (Helpfile, Context). Окно ввода имеет две кнопки – ОК и Отмена. При нажатии кнопки Отмена функция возвращает пустую строку. Dim str As String str = InputBox("Введите строку") Для ввода значений не строкового, а другого типа необходимо использовать функции преобразования – CBool, CByte, CCur, CDate, CDbl, CInt, CLng, CSng, CStr, CVar. Dim n As Integer, str As String On Error Resume Next n = CInt(InputBox("Введите n:", "Ввод", 5)) If Err.Number <> 0 Then Exit Sub ... On Error GoTo 0 5.2. Метод InputBox объекта Application Метод InputBox объекта Application имеет три преимущества по сравнению с функцией InputBox: возможность задать тип возвращаемого значения; возможность указать диапазон рабочего листа; автоматическая проверка правильности введённых данных. Метод InputBox имеет следующий синтаксис: InputBox(Prompt [, Title] [, Default] [, Left] [, Top] [, Helpfile, Context] [, Type]) Метод InputBox имеет те же параметры, что и функция InputBox, и один дополнительный параметр Type, который указывает, данные какого типа должен возвращать метод. Этот параметр является необязательным, и в случае его отсутствия метод возвращает строку. Если введённое значение не соответствует требуемому типу, приложение Microsoft Excel выдаёт сообщение об ошибке и позволяет пользователю ввести другое значение. Код 0 1 2 4 8 16 Тип возвращаемого значения Формула Число Строка Логическое значение Диапазон Ошибка Range("F2").value = Application.InputBox("Введите число", "Ввод числа", Type:=1) Range("F3").value = Application.InputBox("Введите строку", "Ввод строки", Type:=2) Range("F4").value = Application.InputBox("Введите логическое значение", _ "Ввод логического значения", Type:=4) Range("F1").value = Application.InputBox("Введите формулу", "Ввод формулы", Type:=0) Sub EraseRange() Dim userRange As Range On Error GoTo Canceled Set userRange = Application.InputBox(Prompt:="Удаляемый диапазон:", _ Title:="Удаление диапазона", _ Default:=Selection.Address, Type:=8) userRange.Clear userRange.Select Canceled: End Sub 5.3. Функция VBA MsgBox Функция VBA MsgBox предоставляет пользователю простой способ отображения сообщения. Также она возвращает реакцию пользователя на запрос. Функция MsgBox имеет следующий синтаксис: MsgBox(Prompt [, Buttons] [, Title] [, Helpfile, Context]) Параметр Buttons определяет, какие кнопки и значки будут отображены в окне. Константа vbOKOnly vbOKCancle vbAbortRetryIgnore vbYesNoCancel vbYesNo vbRetryCancel vbCritical vbQuestion vbExclamation vbInformation vbDefaultButton1 vbDefaultButton2 vbDefaultButton3 Значение 0 1 2 3 4 5 16 32 48 64 0 256 512 Назначение Отображается только кнопка ОК (по умолчанию) Отображаются кнопки OK и Отмена Отображаются кнопки Прервать, Повтор и Пропустить Отображаются кнопки Да, Нет и Отмена Отображаются кнопки Да и Нет Отображаются кнопки Повтор и Отмена Отображается значок важного сообщения Отображается значок запроса Отображается значок предупреждающего сообщения Отображается значок информационного сообщения По умолчанию выделена первая кнопка По умолчанию выделена вторая кнопка По умолчанию выделена третья кнопка Функция MsgBox возвращает число, соответствующее кнопке, нажатой пользователем. Константа vbOK vbCancel vbAbort vbRetry vbIgnore vbYes vbNo Значение 1 2 3 4 5 6 7 Нажатая кнопка ОК Отмена Прервать Повтор Пропустить Да Нет MsgBox("Сообщение", vbOKOnly + vbInformation, "Заголовок") ans = MsgBox("Сообщение", vbOKCancel + vbQuestion, "Заголовок") ... ans = MsgBox("Сообщение", vbRetryCancel + vbCritical, "Заголовок") ... if MsgBox("Сообщение", vbYesNo + vbExclamation + vbDefaultButton2, _ "Заголовок") = vbYes Then ... Else ... End If