Лекция 8. Пользовательские формы

advertisement
Лекция 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
Download