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

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


Скачать 4.64 Mb.
НазваниеС. Л. Миньков лабораторный практикум по информатике
Дата22.05.2022
Размер4.64 Mb.
Формат файлаpdf
Имя файлаЛаб.практикум по инф-ке_МУ.pdf
ТипПрактикум
#542916
страница9 из 10
1   2   3   4   5   6   7   8   9   10
Case 4
frame4.Visible = True 'если 4, то рамка 4 видима
Case Else
End Select 'Окончание выбора 'Даем название заголовку формы
Me.Caption = "TripWizard: Step " & CurrentPanel & " of " & LastPanel
End Sub
Проинициализируем начальные значения мастера при его вызове. Для этого в коде формы создадим процедуру отклика на событие диалогового окна Initialize и поместим в тело проце- дуры следующий код:
Private Sub UserForm_Initialize()
'Задаем начальное значение счетчика
CurrentPanel = 1
'Запускаем процедуру показа первой рамки
ShowPanel
'Введем список для ComboBox, находящегося в этой рамке
With cboTransport
.AddItem "Самолет"
.AddItem "Поезд"
.AddItem "Корабль"
End With
End Sub

167
Создадим процедуры отклика на щелчок для кнопок Отме-
на, Назад, Вперед и Готово.
Два раза щелкнем по кнопке Готово, тем самым мы созда- дим процедуру отклика кнопки на щелчок по ней. Запишем в по- явившемся окне редактирования кода следующее:
Private Sub cmdFinish_Click()
Me.Hide
Me.Tag = vbOK
End Sub
Затем, не выходя из окна редактирования кода, создадим еще 3 процедуры отклика.
Процедура отклика кнопки Отмена:
Private Sub cmdCancel_Click()
Me.Tag = vbCancel
End
End Sub
Процедура отклика кнопки Назад:
Private Sub cmdPrevious_Click()
'Движение к предыдущей рамке
CurrentPanel = CurrentPanel - 1
ShowPanel
cmdNext.Enabled = True
If CurrentPanel = FirstPanel Then
cmdPrevious.Enabled = False
Else
cmdPrevious.Enabled = True
End If
End Sub
Процедура отклика кнопки Вперед:
Private Sub cmdNext_Click()
'Движение к следующей рамке
CurrentPanel = CurrentPanel + 1
ShowPanel
cmdPrevious.Enabled = True

168
If CurrentPanel = LastPanel Then
cmdNext.Enabled = False
Else
cmdNext.Enabled = True
End If
End Sub
Для того чтобы на первом шаге кнопка Назад была не ак- тивна (ниже первого шага нам двигаться некуда), нужно для этой кнопки в свойстве Enabled поставить значение False.
Теперь, запустив макрос StartWizard, увидим, как происхо- дит переход от одного состояния формы к другой. В каждом со- стоянии обеспечивается прием от пользователя определенной информации. Но в итоге не формируется никакого отчетного до- кумента.
Чтобы это исправить, внесем изменения в макрос StartWiz-
ard:
Public Sub StartWizard()
Dim msg As String
With TripWizard
.Show
'Последовательно обрабатываем щелчки мыши,
'выбирая данные с элементов управления и 'формируя информационную строку msg
msg = "Имя: " & .txtName.Text & Chr(13)
msg = msg & "Континент: "
If .optAfrica.Value Then
msg = msg & "Африка" & Chr(13)
Else
If .optAsia.Value Then
msg = msg & "Азия" & Chr(13)
Else
If .optEuropa.Value Then
msg = msg & "Европа" & Chr(13)
End If
End If
End If
msg = msg & "Оплата включает: "
If .chkHotel.Value Then
msg = msg & "Гостиница"

169
End If
If .chkMeals.Value Then
msg = msg & "Питание"
End If
msg = msg & Chr(13)
msg = msg & "Транспорт: " & .cboTransport.Value
MsgBox msg, , "Приятного отдыха!"
End
End With
End Sub
Теперь можно протестировать работу созданного «Мастера путешествий» — от нажатия на кнопку «Путешествие» до нажа- тия на кнопку «Готово».
Появится результирующий отчет, составленный по данным, полученным на всех шагах «Мастера путешествий» (рис. 8.13).
Рис. 8.13 — Результирующий отчет
Задание 8.1. Создание формы туристического ваучера
Измените макрос таким образом, чтобы в результате работы
«Мастера» формировался ваучер на туристическую поездку, где были бы указаны следующие данные: ФИО путешественника, страна и город посещения, название отеля, срок пребывания, тип номера, вид питания, стоимость тура. Выразите сожаление, если клиент вышел, ничего не заполнив.
Для формирования многостраничности использовать эле- мент управления MultiPage.

170
8.5 Создание интерфейса работы с базой данных
Возможности Excel и VBA можно использовать для форми- рования простых баз данных и пользовательского интерфейса управления ими.
Создадим базу данных по учету оплаты за электроэнергию.
Таблица базы данных должна содержать: фамилию, имя, адрес плательщика, дату платежа, тариф, показания счетчика (текущее и предыдущее), подсчитанный расход электроэнергии, сумму к оплате.
Откроем новую рабочую книгу Excel и перейдем в редактор
VBA. Выберем из меню Вставка команду UserForm. В редакто- ре появится заготовка диалоговой формы. Изменим в свойстве
Caption заголовок формы UserForm1 на Учет оплаты за элек-
троэнергию.
Создадим в форме две рамки (Frame).
Первой рамке в свойстве Caption изменим заголовок на Информация о клиенте, а второй рамке — на Информация
о платеже. В этих рамках разместим элементы управления Label и TextBox.
Изменим имена всем семи элементам TextBox. В их соот- ветствии можно разобраться по коду макроса CommandBut-
ton1_Click(), приведенного ниже.
Также добавим три элемента управления CommandButton
с заголовками:
Принять,
Отмена,
Выход,
Диаграмма
(рис. 8.14).
Затем вернемся к нашей рабочей книге. Листу с именем
Лист2 присвоим имя База, а листу Лист1 присвоим имя Меню.
На листе с именем Меню поместим элемент ActiveX Кнопка.
Изменим заголовок кнопки на Прием платежа (свойство
Caption), а имя кнопки (свойство Name) — на ПриемПлатежа.

171
Рис. 8.14 — Форма с размещенными на ней объектами интерфейса
Перейдем в редакторе на лист 1 (Меню) и создадим проце- дуру отклика кнопки на щелчок:
Private Sub ПриемПлатежа_Click()
'Вызываем процедуру формирования заголовков базы данных
ЗаголовокРабочегоЛиста
End Sub
Для формирования заголовков столбцов базы данных созда- дим процедуру ЗаголовокРабочегоЛиста, которая будет вызы- ваться из процедуры обработки кнопки рабочего листа «Прием платежа». Для этого выполним команду меню «Вставка | Проце-
дура». Присвоим ей имя.
Процедура выполняет следующие действия:
– проверяет, заполнена ли первая строка — строка заголов- ков столбцов (по значению ячейки А1); если заполнена, то не вы- полняет никаких действий и завершает работу, передавая управ- ление в точку вызова;

172
– если первая строка не заполнена, то в ячейки первой строки рабочего листа записывает название граф баз данных, комментарии к ним, закрепляет первую строку и завершает рабо- ту, передавая управление в точку своего вызова.
В окне редактирования кода введем текст этой процедуры:
Private Sub ЗаголовокРабочегоЛиста()
'Активизируем рабочий лист
Application.Worksheets("База").Activate
'Проверяем, есть ли названия столбцов. В противном случае вносим их
With ActiveSheet
If .Range("A1").Value = "Фамилия" Then
.Range("A2").Select
Else
'Очищаем рабочий лист
ActiveSheet.Cells.Clear
'Записываем названия столбцов
Application.Worksheets("База").Range("A1:I1").Select
With Selection
.Value= Array("Фамилия", "Имя", "Адрес", "Текущее
показание счетчика", "Предыдущее показание счетчика", "Та-
риф", "Дата платежа", "Расход электроэнергии", "Сумма")
.Interior.ColorIndex = 8
.Font.Bold = True
End With
'Вставляем комментарии
.Range("A1").AddComment
.Range("A1").Comment.Visible = False
.Range("A1").Comment.Text Text:= "Фамилия клиента"
.Range("B1").AddComment
.Range("B1").Comment.Visible = False
.Range("B1").Comment.Text Text:= "Имя клиента"
.Range("C1").AddComment
.Range("C1").Comment.Visible = False
.Range("C1").Comment.Text Text:= "Адрес клиента"
.Range("D1").AddComment
.Range("D1").Comment.Visible = False
.Range(«D1»).Comment.Text Text:= "Текущее показание
счетчика"
.Range("E1").AddComment
.Range("E1").Comment.Visible = False

173
.Range("E1").Comment.Text Text:= "Предыдущее показание
счетчика"
.Range("F1").AddComment
.Range("F1").Comment.Visible = False
.Range("F1").Comment.Text Text:= "Тариф"
.Range("G1").AddComment
.Range("G1").Comment.Visible = False
.Range("G1").Comment.Text Text:= "Дата платежа"
.Range("H1").AddComment
.Range("H1").Comment.Visible = False
.Range("H1").Comment.Text Text:= "Расход электроэнергии"
.Range("I1").AddComment
.Range("I1").Comment.Visible = False
.Range("I1").Comment.Text Text:= "Сумма"
End If
End With
'Форматирование табличных ячеек
Worksheets("База").Range("A:I").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
End With
'Вызвать на экран форму
UserForm1.Show
End Sub
Напишем процедуры для кнопок Принять, Отмена и Вы-
ход.
Перейдем к форме, щелкнув два раза по UserForm1 в окне
Project-VBAProject. В появившейся форме два раза щелкнем по кнопке «Принять», перейдя в процедуру обработки события
Click.
Запишем следующий код (здесь, как и в предыдущей работе, изменены имена элементов управления на форме:
Private Sub CommandButton1_Click()
'Декларация переменных
Dim fam, nam, adr As String
Dim tarif, prpok, tekpok, rashod, summa As Single

174
Dim nomer As Integer
Dim data As Date
'Вычисление номера первой свободной строки в таблице
nomer = Application.CountA(ActiveSheet.Columns(1)) + 1
With UserForm1
'Проверяем, введена ли фамилия
If .txtFamil.Text = "" Then
MsgBox "Вы забыли указать фамилию", vbExclamation
Exit Sub 'Выход из процедуры до ее естественного окончания
End If
'Проверяем, введено ли имя
If .txtName.Text = "" Then
MsgBox "Вы забыли указать имя", vbExclamation
Exit Sub
End If
'Проверяем, введен ли адрес
If .TxtAdres.Text = "" Then
MsgBox "Вы забыли указать адрес", vbExclamation
Exit Sub
End If
'Присваиваем значения переменным в элементах TextBox
fam = .txtFamil.Text
nam = .txtName.Text
adr = .TxtAdres.Text
'Проверяем, введено ли текущее показание счетчика
If IsNumeric(.txttekpok.Text) = False Then
MsgBox
"Введено
неверное
показание
счетчика",
vbExclamation
Exit Sub
End If
tekpok = CSng(.txttekpok.Text)
'Проверяем, введено ли предыдущее показание счетчика
If IsNumeric(.txtprpok.Text) = False Then
MsgBox
"Введено
неверное
показание
счетчика",
vbExclamation
Exit Sub
End If
prpok = CSng(.txtprpok.Text)
'Проверяем, введен ли тариф
If IsNumeric(.txttarif.Text) = False Then
MsgBox "Введен неверный тариф", vbExclamation
Exit Sub
End If

175
tarif = CSng(.txttarif.Text)
If IsDate(.txtdata) = False Then
MsgBox "Дата введена не верно", vbExclamation
Exit Sub
End If
data = .txtdata
If Val(txtprpok.Text) > Val(txttekpok.Text) Then
MsgBox "Предыдущее показание счетчика больше текуще-
го", vbExclamation
Exit Sub
End If
End With
'Вычисляем расход электроэнергии и сумму оплаты
rashod = tekpok - prpok
summa = rashod * tarif
'Записываем данные в ячейки рабочего листа
With ActiveSheet
.Cells(nomer, 1).Value = fam
.Cells(nomer, 2).Value = nam
.Cells(nomer, 3).Value = adr
.Cells(nomer, 4).Value = tekpok
.Cells(nomer, 5).Value = prpok
.Cells(nomer, 6).Value = tarif
.Cells(nomer, 7).Value = data
.Cells(nomer, 8).Value = rashod
.Cells(nomer, 9).Value = summa
End With
ClearForm
End Sub
Примечание.
В данном коде функция CSng преобразует выражение в числовой тип данных Single для того, чтобы можно было прове- сти арифметические операции над данными, внесенными в Text-
Box. Обратное действие совершает функция Str.
Функция Val читает цифры символьного выражения слева направо до тех пор, пока не встретится нецифровой символ, и возвращает число.
Функция IsNumeric проверяет, является ли значение данно- го выражения числом.

176
Функция IsDate проверяет, является ли данное выражение корректной датой или временем
В данном коде использована процедура ClearForm, необхо- димая для очистки формы после добавления записи в базу дан- ных. Вот ее код:
Private Sub ClearForm()
Unload UserForm1
UserForm1.Show
End Sub
Теперь обработаем нажатие на кнопку Отмена.
Так же перейдем в процедуру обработки события Click и за- пишем следующий код:
Private Sub CommandButton2_Click()
Dim nomer As Integer
'Вычисляем номер последней строки
nomer = Application.CountA(ActiveSheet.Columns(1))
'Удаляем содержимое ячеек строки
With ActiveSheet
If nomer > 1 Then
.Cells(nomer, 1).Value = ""
.Cells(nomer, 2).Value = ""
.Cells(nomer, 3).Value = ""
.Cells(nomer, 4).Value = ""
.Cells(nomer, 5).Value = ""
.Cells(nomer, 6).Value = ""
.Cells(nomer, 7).Value = ""
.Cells(nomer, 8).Value = ""
End If
End With
End Sub
Теперь обработаем нажатие на кнопку Выход.
В процедуре обработки события Click запишем следующий код:
Private Sub CommandButton3_Click()
'Активизируем рабочий лист с именем Меню
Sheets("Меню").Activate
'Завершаем выполнение программы
End
End Sub

177
Перейдем в нашу рабочую книгу. Выберем лист Меню.
Щелкнем по кнопке «Прием платежа», появится пустая таблица с заголовками и форма для заполнения. Введем в нее значения
(рис. 8.15).
Если они введены полностью и правильно, то при нажатии на кнопку «Принять» они появятся в таблице, а форма очистится и будет готова к приему новых данных.
Рис. 8.15 — Заполненные форма и таблица
8.6 Построение диаграммы
Построить диаграмму на основе данных, находящихся в со-
зданной выше табличной базе.
Вызовем в редакторе VBA созданную форму UserForm1 и напишем процедуру отклика кнопки Диаграмма на щелчок по ней. Процедура должна создавать на отдельном листе диа- грамму на основе данных листа База.
Для создания процедуры два раза щелкнем по кнопке Диа-
грамма, тем самым мы попадем в окно редактирования кода процедуры. Запишем следующий код:

178
Private Sub CommandButton4_Click()
' Активизируем рабочий лист с именем Диаграмма
Sheets("Диаграмма").Activate
'Очищаем лист от всех объектов
For Each i In ActiveSheet.Shapes
i.Delete
Next i
' Создаем новую диаграмму
ActiveSheet.ChartObjects.Add(25, 25, 500, 300).Select
With ActiveChart
' Задаем тип диаграммы (объемная гистограмма)
.ChartType = xl3DBarClustered
' Находим, сколько записей в таблице
M = 2
Do
If Sheets("База").Cells(M, 1).Value = "" Then Exit Do
M = M + 1
Loop
M = M – 1
' Определяем источник данных для построения диаграммы:
' с листа «База» от ячейки I2 до ячейки IM
.SetSourceData
Source:=Sheets("База").Range("I2:I" + Trim(Str(M))),
PlotBy:=xlRows
' Выбираем подписи к данным из первого столбца таблицы
For i = 2 To M
.SeriesCollection(i - 1).Name = "=База!R" + Trim(Str(i)) + "C1"
Next
'Размещение диаграммы на отдельном листе
.Location Where:=xlLocationAsObject, Name:= "Диаграмма"
With ActiveChart
' Заголовок
.HasTitle = True
.ChartTitle.Characters.Text = "Сумма оплаты _
за электроэнергию"
'Легенда
.HasLegend = True
.Legend.Select
Selection.Position = xlLeft
.HasDataTable = False
.Axes(xlCategory).MajorTickMark = xlNone
.Axes(xlCategory).MinorTickMark = xlNone
.Axes(xlCategory).TickLabelPosition = xlNone

179
End With
End With
End Sub
Затем нам нужно изменить процедуру кнопки Выход так, чтобы при выходе активным оставался лист с диаграммой. Для этого в окне
1   2   3   4   5   6   7   8   9   10


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