Лаб.практикум по инф-ке_МУ. С. Л. Миньков лабораторный практикум по информатике
Скачать 4.64 Mb.
|
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 |