Главная страница

Лаб.практикум по инф-ке_МУ. С. Л. Миньков лабораторный практикум по информатике


Скачать 4.64 Mb.
НазваниеС. Л. Миньков лабораторный практикум по информатике
Дата22.05.2022
Размер4.64 Mb.
Формат файлаpdf
Имя файлаЛаб.практикум по инф-ке_МУ.pdf
ТипПрактикум
#542916
страница8 из 10
1   2   3   4   5   6   7   8   9   10
Раздел 8. Программирование пользовательских
форм
Цель раздела: приобрести навыки формирования и про- граммирования диалоговых форм для создания баз данных и управления ими средствами Excel и VBA.
Чтобы добиться максимальной гибкости использования элементов управления, создают пользовательские формы — настраиваемые диалоговые окна, которые обычно содержат один или несколько элементов ActiveX. Пользовательские формы вы- зываются из программного кода VBA, который создается в ре- дакторе Visual Basic.
Общая схема работы по созданию пользовательских форм следующая:
1. Вставить пользовательскую форму в проект VBA книги.
2. Создать процедуру для отображения пользовательской формы.
3. Добавить элементы ActiveX.
4. Изменить свойства элементов ActiveX.
5. Создать процедуры обработчика событий для элементов
ActiveX.
Самые важные методы форм:
Show() — запуск формы (UserForm1.Show — если форма уже была загружена в память, она просто станет видимой, если еще нет — то будет автоматически загружена (произойдет собы- тие Load);
Hide() — спрятать форму (UserForm1.Hide — форма будет убрана с экрана, но останется в памяти. Потом при помощи мето- да Show() можно будет опять ее вызвать в том же состоянии, в каком она была на момент «прятанья», а можно, например, пока она спрятана, программно изменять ее и расположенные на ней элементы управления. Окончательно форма удалится из памяти при закрытии документа;
Unload — удалить из памяти, если форма больше точно не потребуется (Unload UserForm1).

152
Самое важное событие формы — Initialize происходит при подготовке формы к открытию (появлению перед пользовате- лем). Обычно в обработчик этого события помещается код, свя- занный с открытием соединений базы данных, настройкой эле- ментов управления на форме, присвоением им значений по умол- чанию и т. п.
8.1 Создание формы с элементами Label и TextBox
Откроем новую рабочую книгу Excel и перейдем в редактор
Visual Basic (Alt+F11). Выберем из меню Вставка (Insert) ко- манду UserForm. На экране появится заготовка диалоговой фор- мы. Вызовем панель инструментов ToolBox (меню View или со- ответствующая кнопка на панели управления Standart).
Поместим в поле формы объект Label (надпись), под надпи- сью поместим текстовое поле (TextBox), а справа добавим две кнопки (CommandButton), взяв все это с панели инструментов
ToolBox. Сменим надписи на кнопках на «OK» и «Cancel», для этого выберем в контекстном меню команду Properties и изме- ним в свойстве Caption имена кнопок на соответствующие. Из- мените название формы и надпись (рис 8.1).
Нажав на клавишу F5, запустим форму на выполнение.
Так как кнопкам, расположенным на форме, не присвоено никаких процедур, то при щелчке по ним ничего происходить не будет.
Создадим новый модуль, для этого в меню Вставка выбе- рем команду Модуль.
Создадим макрос с помощью команды Insert | Procedure.
В открывшемся диалоговом окне укажем: имя макроса Dis-
playDialog, тип макроса Подпрограмма (Sub), область определе- ния Общая (Public).
Затем в окне редактирования кода модуля запишем код ак- тивизации формы:
Public Sub DisplayDialog()
UserForm1.Show
If UserForm1.Tag = vbOK Then
MsgBox "OK clicked"

153
Else
MsgBox "Cancel clicked"
End If
End Sub
Рис. 8.1 — Форма с размещенными на ней объектами управления
Свойство Tag (англ. ярлык), использованное в макросе, со- храняет дополнительную информацию о каждом элементе управ- ления на UserForm. Синтаксис его применения: объект.Tag [=строка]
Строка идентифицирует объект (не обязательное).
Создадим процедуры отклика на нажатие кнопок диалого- вой формы. В процедурах поместим метод сокрытия формы Hide и установим код завершения выполнения формы в свойстве Tag.
Для этого в окошке Project — VBAProject два раза щелкнем по UserForm1. Затем в появившемся окошке UserForm1 два раза щелкнем по кнопке OK, тем самым перейдем в окно редактиро- вания кода процедуры отклика кнопки OK на щелчок по ней.
В теле процедуры запишем следующее:
Private Sub CommandButton1_Click()
'Занести в ячейку А1 значение, набранное в текстовом поле
ActiveSheet.Cells(1, 1).Value = TextBox1.Value
'Скрыть форму
Me.Hide

154
'Свойству Tag зададим значение vbOK
Me.Tag = vbOK
End Sub
В теле процедуры отклика кнопки Cancel на щелчок по ней запишем следующее:
Private Sub CommandButton2_Click()
'Удалить из ячейки А1 значение
ActiveSheet.Cells(1, 1).Value =""
'Скрыть форму
Me.Hide
'Свойству Tag зададим значение vbCancel
Me.Tag = vbCancel
End Sub
Здесь ключевое слово Me VBA заменяет объект UserForm1, который требуется спрятать (убрать с экрана), но не удалить (ме- тод Hide). Оно обозначает тот объект, в котором находится дру- гой объект, код которого сейчас исполняется (кнопка находится в форме).
Затем организуем запуск макроса на выполнение. Сделать это можно разными способами, например создав на листе Excel кнопку как элемент управления и назначить ей макрос Dis-
playDialog. Теперь при нажатии на кнопку Запуск формы будет запускаться этот макрос (рис. 8.2).
Рис. 8.2 — Вызов пользовательской формы

155
Протестируем работу кнопок. Введем в текстовое поле зна- чение «Привет!» и нажмем на кнопку OK. В ячейке А1 появится введенный текст, а на листе — окно с надписью «ОК clicked»
(рис. 8.3).
При нажатии на кнопку Cancel текст в ячейке А1 исчезает и появляется окно с надписью «Cancel clicked».
Рис. 8.3 — Тестирование кнопки ОК
Примечание. Щелчок по крестику в правом верхнем углу формы приводит к появлению информационного сообщения об ошибке несовпадения типов в строке кода
If UserForm1.Tag = vbOK Then
Если нажатие на крестик считать аналогом работы кнопки
Cancel, то имея в виду числовые значения формы (см. п.6.7), из- бежать ошибки можно, заменив эту строку на:
If UserForm1.Tag = "1" Then
8.2
Создание формы с RefEdit
Откроем редактор Visual Basic и выберем из меню Вставка команду UserForm. На экране появится заготовка диалоговой формы и панель инструментов ToolBox.
В диалоговой форме поместим элементы управления
RefEdit (редактирование ссылок) и TextBox (текстовое поле).

156
Если на панели ToolBox отсутствует кнопка RefEdit, то ее следует вызвать, выполнив команду Tools | Additional Controls |
RefEdit.Ctrl.
Добавим к размещенным элементам управления надписи
(Label) «Выбор диапазона ячеек» и «Значение для заполнения» соответственно. Как и в предыдущем пункте создадим две кнопки
OK и Cancel (рис. 8.4) и назначим им те же процедуры отклика.
Рис. 8.4 — Форма UserForm2 с размещенными на ней элементами управления
Создадим новый модуль, для этого в меню Вставка выбе- рем команду Модуль. Создадим макрос с помощью команды In-
sert | Procedure. В открывшемся диалоговом окне укажем: имя макроса ShowRefEdit, тип макроса Подпрограмма (Sub), область определения Общая (Public).
Затем в окне редактирования кода модуля запишем код ак- тивизации формы:
Public Sub ShowRefEdit()
With UserForm2

157
.RefEdit1.Text = Selection.Address
.Show
If .Tag = vbOK Then
Range(.RefEdit1.Text) = .TextBox1.Text
End If
End With
End Sub
Первая инструкция передает элементу RefEdit адрес вы- бранного диапазона на рабочем листе. Затем запускается форма
UsesForm2 с помощью метода Show. После того как форма за- вершит работу, проверяется возвращаемое значение. Если завер- шение было успешным, то выбранный диапазон заполняется ука- занным значением, если завершение было неуспешным, то вы- бранный диапазон не заполняется.
Для запуска макроса на выполнение так же, как и в преды- дущем задании, создадим кнопку Работа с RefEdit и протестиру- ем работу макроса (рис. 8.5).
В поле Выбор диапазона ячеек задаем массив ячеек на ли- сте, а в поле Значение для заполнения вводим какой либо текст.
При нажатии на кнопку ОК выделенный массив ячеек (А1:А10) заполнится текстом, при нажатии на кнопку Cancel заполнения происходить не будет.
Рис. 8.5 — Тестирование формы UserForm2

158
8.3 Создание формы с ComboBox и ListBox
Откроем новый рабочий лист Excel. Перейдем в редактор
Visual Basic (Alt+F11) и выберем в меню «Вставка» команду
UserForm. В появившейся диалоговой форме разместим два эле- мента управления ComboBox (Поле со списком) и один элемента управления ListBox (Список). Добавим к этим элементам надпи- си (Label) «Компания», «Адрес» и «Контактный телефон» соот- ветственно. Также добавим кнопки с названиями ОК и Close
(рис. 8.6).
Создадим процедуру отклика кнопки Close, которая закры- вала бы уже открытую форму. Для этого два раза щелкнем по кнопке и запишем в окне редактирования кода следующее:
Private Sub CommandButton2_Click()
Me.Hide
End Sub
Рис. 8.6 — Форма UserForm3 с размещенными на ней элементами управления

159
На рабочем листе в ячейках А1, В1 и С1 напишем заголовки
«Компания», «Город» и «Телефон», а ниже введем 9 соответ- ствующих значений (название компании, местонахождение и контактный телефон).
Затем выделив поочередно массивы этих значений и выбрав в контекстном меню команду Присвоить имя… или вызвав
Диспетчер имен (Ctrl+F3), зададим массивам имена соответ- ственно «Company», «City» и «Tel» (рис. 8.7).
Рис. 8.7 — Присвоение имен группам ячеек на листе Excel
Свяжем эти ячейки с элементами управления ComboBox1 и ComboBox2 формы UserForm3. Для этого в их Свойствах укажем в поле RowSource имя соответствующего массива ячеек
(«Company» и «City»).
Теперь создадим процедуру отклика при нажатии на кнопку
ОК. Алгоритм предлагается следующий. Пользователь выбирает в окнах Компания и Адрес соответствующие значения и нажима- ет на ОК. Если компания находится по этому адресу, то в окне
Контактный телефон появляется ее номер телефона, если нет, то появляется информационное сообщение о том, что такой ком- пании не существует.
Для этого два раза щелкнем по кнопке ОК в форме
UserForm3 в редакторе VBA и запишем в окне редактирования следующий код

160
Private Sub CommandButton1_Click()
'Очистить поле ListBox
Me.ListBox1.Clear
flag = 0
' Цикл по строкам столбцов Компания и Адрес и проверка того,
' соответствуют ли введенные (или выбранные) компании и их адреса ' без учета пробелов в именах (функция Trim) тому, что записано в таблице.
' Если совпадение, то в ListBox заносится соответствующий номер телефона
For i = 1 To 9
If Trim(ComboBox1.Text) = Cells(i + 1, 1) And _
Trim(ComboBox2.Text) = Cells(i + 1, 2) Then
Me.ListBox1.AddItem Cells(i + 1, 3)
flag = 1
End If
Next i
'Если соответствия названия компании и адреса не найдено,
'то вывод предупреждающего сообщения
If flag = 0 Then
MsgBox "Компании " + Trim(ComboBox1.Text) + _
" в городе " + Trim(ComboBox2.Text) + " нет! "
End If
End Sub
Теперь создадим макрос запуска нашей формы (переимену- ем ее в Поиск контактного телефона). Для этого в новом модуле
«Module3» вставим процедуру:
Public Sub Find()
With UserForm3
.Show
End With
End Sub
Затем создадим на листе Excel кнопку Найти и назначим этой кнопке макрос Find.
Протестируем работу макросов (рис. 8.8, 8.9).

161
Рис. 8.8 — Положительный результат поиска
Рис. 8.9 — Отрицательный результат поиска
8.4 Создание диалоговой формы «Мастер Путешествий»
Откроем новый рабочий лист Excel. Перейдем в редактор
Visual Basic (Alt+F11) и выберем в меню «Вставка» команду
UserForm. В свойствах формы изменимимя формы (Name) и за- головок (Caption) на TripWizard.

162
В нижней левой части формы разместим четыре кнопки
(CommandButton). Изменим их заголовки на Назад, Вперед,
Отмена и Готово, а имена — на cmdPrevious, cmdNext,
cmdCancel, cmdFinish соответственно.
Примечание.
Вы уже, наверно, обратили внимание, что при создании форм или элементов управления, VBA устанавливает их имена
(свойство Name) по умолчанию. Но часто возникает необходи- мость в их смысловом переименовании (как сейчас, например).
Для переименования объектов и переменных в среде Windows существует соглашение об именах.
Его суть: имя начинается с короткого префикса, одинаково- го для всех объектов одного и того же рода (табл. 8.1). За ним следует собственно имя — идентификатор объекта. Будем в дальнейшем придерживаться этого соглашения при работе с элементами управления.
Таблица 8.1 — Примеры префиксов имен объектов
Имя
Управляющий элемент
Префикс
CheckBox
Флажок chk
ComboBox
Поле со списком cbo
CommandButton
Кнопка cmd
Frame
Рамка fra
Image
Изображение img
Label
Надпись lbl
ListBox
Список lst
MultiPage
Набор страниц mlt
OptionButton
Переключатель opt
RefEdit
Редактирование ссылок ref
ScrollBar
Полоса прокрутки scr
SpinButton
Счетчик spn
TextBox
Текстовое поле txt
ToggleButton
Выключатель tgl
UserForm
Форма ftm
Поместим на форму четыре элемента управления Рамки
(Frame) (рис. 8.10). Пронумеруем рамки, задав заголовки 1, 2, 3, 4 в свойстве Caption. Свойству SpecialEffect установим значение

163
2-fmSpecialEffectSunken (верхняя и левая границы объекта за- тенены, а правая и нижняя подсвечены; элемент углублен в окружающее окно).
Рис. 8.10 — Форма TripWizard с размещенными на ней элементами управления
Разместим в рамках элементы управления. На первой рамке поместим Label и ComboBox (рис. 8.10).Дадим полю со списком имя cboTransport.
На второй рамке разместим Label и три элемента управле- ния OptionButton друг под другом (рис. 8.10). Дадим имена
optAfrica, optAsia, optEuropa соответственно.
На третьей рамке разместим элементы Label и TextBox
(рис. 8.10). Дадим текстовому полю имя txtNamet.
На четвертой рамке разместим элемент Label и два элемента управления CheckBox (рис. 8.10). Дадим флажкам имена chkHo- tel и chkMeals соответственно.
Наложим по очереди все рамки точно друг на друга.

164
Примечание.
Если после этого понадобится перейти к нужной рамке
(например, для внесения изменений), то необходимо сначала вы- брать ее в списке объектов окна свойств формы TripWizard, а за- тем щелкнуть на контуре рамки правой кнопкой и в появившемся контекстном меню выбрать команду
Переместить
(Bring Forward).
Справа поместим кнопку с картинкой и назначим ей по кли- ку мышкой переход на сайт отзывов http://www.otzyv.ru.
Для это- го в процедуру обработки щелчка по кнопке надо поместить сле- дующий код:
Private Sub CommandButton1_Click()
ActiveWorkbook.FollowHyperlink
Address:="http://www.otzyv.ru",
_ NewWindow:=True
End Sub
Рис. 8.11 — Окончательный вид формы TripWizard
Итак, форма с необходимыми объектами готова (рис. 8.11).
Создадим в редакторе модуль и поместим туда макрос за- пуска формы StartWizard:

165
Public Sub StartWizard()
With TripWizard
.Show
End With
End Sub
С помощью элементов управления создадим на листе Excel кнопку Путешествиеи назначим кнопке созданный макрос.
Но отображение рамок не произошло, кнопки тоже не работают
(рис. 8.12):
Рис. 8.12 — Неудачный запуск формы TripWizard
Дело в том, что не обеспечена возможность перехода от рамки к рамке и не заданы начальные значения в списках
(инициализация формы). Ну, и нажатие кнопок пока не обработа- но.
Введем переменную CurrentPanel (счетчик рамок (пане- лей)) и создадим подпрограмму ShowPanel, с помощью которых сможем в нужный момент вызывать требуемую рамку.
Щелкнем два раза по свободному месту на форме TripWiz-
ard, тем самым попадем в окно редактирования кода формы.
Сначала объявим переменные и константы, общие для всех макросов:
Dim CurrentPanel As Integer 'Это счетчик рамок
Const FirstPanel = 1
Const LastPanel = 4

166
Затем создадим макрос ShowPanel и поместим в него сле- дующий код:
Public Sub ShowPanel()
'Сначала делаем все рамки невидимыми
frame1.Visible = False
frame2.Visible = False
frame3.Visible = False
frame4.Visible = False
'Выбор рамки в зависимости от значения счетчика
Select Case CurrentPanel
Case 1
frame1.Visible = True 'если 1, то рамка 1 видима
Case 2
frame2.Visible = True 'если 2, то рамка 2 видима
Case 3
frame3.Visible = True 'если 3, то рамка 3 видима
1   2   3   4   5   6   7   8   9   10


написать администратору сайта