- •Кафедра информатики и тсо
- •С помощью Visual Basic for Applications
- •Введение
- •I. Постановка задачи
- •II. Этапы разработки приложения
- •III. Особенности интерфейса vba
- •IV. Некоторые сведения о языке Visual Basic for Applications
- •4.1. Основные понятия
- •4.2. Типы данных
- •Типы данных vba
- •4.3. Правила присвоения имен в vb
- •4.4. Проверка синтаксических ошибок
- •V. Пример создания приложения
- •Соответствие информационных объектов и элементов проекта
- •VI. Тематика индивидуальных заданий
- •VII. Библиографический список
- •Приложение 1 Примеры некоторых типовых программных решений Пример использования инструкции Do…Loop
- •Id As Integer ' Помещает это описание
- •Генерация случайного целого числа
- •Приложение 2 Краткий справочник по объектам, методам, свойствам и функциям, использованным в примерах
- •Автоматизация Excel-приложений с помощью Visual Basic for Applications Учебно-методическое пособие по курсу
- •Составитель в.Б. Тарасюк
- •305000, Г. Курск, ул. Радищева, 33 (тел. 56-84-60)
Соответствие информационных объектов и элементов проекта
Объект |
Реквизиты |
Льготы |
Расписание |
UserForm1 |
Билет |
Организация |
b1 |
|
|
|
a1 |
Город |
b2 |
|
|
|
a2 |
№ кассы |
b3 |
|
|
|
a3 |
Пункт назначения |
|
|
a2:ai |
ComboBox1 |
c6 |
№ рейса |
|
|
b2:bi |
TextBox1 |
c7 |
Время отправления |
|
|
c2:ci |
TextBox2 |
c8 |
Время в пути |
|
|
d2:di |
TextBox3 |
c9 |
Тариф |
|
|
e2:ei |
TextBox4 |
c10 |
№ места |
|
|
g2:gi |
TextBox5 |
c11 |
Кол-во свободных мест |
|
|
f2:fi |
TextBox6 |
|
Тип (льгота) |
|
a2:ai |
|
CombotBox1 |
c12 |
Код льготы |
|
b2:bi |
|
TextBox7 |
|
Скидка |
|
c2:ci |
|
TextBox8 |
|
Стоимость |
|
|
|
TextBox9 |
c13 |
Дата |
|
|
|
TextBox10 |
c14 |
Время |
|
|
|
TextBox11 |
c15 |
В первую очередь программируются процедуры, обрабатывающие событие загрузки диалоговой формы. При загрузке формы должны автоматически заполняться два раскрывающихся списка (ComboBox1 и ComboBox2) – «Пункт назначения» и «Льготы». Нужные данные хранятся на соответствующих рабочих листах проекта. Двойным щелчком мыши по области формы переключиться в окно процедур и выбрать событие Activate.
Текст процедуры приведен ниже.
Private Sub UserForm_Activate()
Dim i, j As Integer
i = 2
Do While Расписание.Cells(i, 1) <> ""
ComboBox1.AddItem (Расписание.Cells(i, 1))
i = i + 1
Loop
j = 2
Do While Льготы.Cells(j, 1) <> ""
ComboBox2.AddItem (Льготы.Cells(j, 1))
j = j + 1
Loop
TextBox10.Text = Date
TextBox11.Text = Time
End Sub
Данная процедура просматривает и добавляет в раскрывающиеся списки ComboBox1 и ComboBox2 содержимое заполненных ячеек первых столбцов рабочих листов «Льготы» и «Расписание». Заполнение списков прекращается, как только в очередной строке данные отсутствуют. Поскольку первая строка в таблицах – строка заголовков, заполнение списков начинается со второй строки рабочих листов. В текстовые поля TextBox1 и TextBox2 выводятся текущие дата и время.
При написании процедуры следует обратить особое внимание на соответствие имен объектов в процедуре именам, используемым в проекте. В случае выявления их несоответствия рекомендуется сделать следующее. В окне редактора VB выбрать «Вид» (View) – «Окно проекта» (Project). Из списка объектов выбрать нужный рабочий лист и вывести на экран окно свойств «Вид» (View) – «Окно свойств» (Propety)). Затем ввести нужное имя в строке «Name» окна свойств.
Следующий шаг – программирование процедуры события выбора строки из раскрывающегося списка ComboBox_Change. При выборе элемента списка объекта ComboBox в полях TextBox должны появляться данные из связанных с ними столбцов, соответствующие выбранной строке рабочего листа. Поскольку в рассматриваемом примере диалоговое окно располагает двумя объектами ComboBox, то для каждого из них программируется собственная процедура обработки события ComboBoxi_Change. Содержание процедуры, связанной с пунктом назначения приводится ниже.
Private Sub ComboBox1_Change()
Dim i As Integer
i = ComboBox1.ListIndex + 2
TextBox1.Text = Расписание.Cells (i, 2)
TextBox2.Text = Расписание.Cells (i, 3)
TextBox3.Text = Расписание.Cells (i, 4)
TextBox4.Text = Расписание.Cells (i, 5)
TextBox5.Text = Расписание.Cells (i, 6)
TextBox5.Text = Расписание.Cells (i, 7
End Sub
При выборе льготы программа должна пересчитать стоимость продаваемого билета и обновить ее в соответствующем текстовом поле. То же самое должно происходить и при изменении пункта назначения. Эти действия инициализирует процедура обработки события ComboBox2_Change путем изменения содержимого поля, хранящего величину скидки:
Private Sub ComboBox2_Change()
Dim ji As Integer
j = ComboBox2.ListIndex + 2
TextBox7.Text = Льготы. Cells (j, 2)
TextBox8.Text = Льготы. Cells (j, 3)
TextBox9.Text = Льготы. Cells (j, 4)
End Sub
На основании обновленных значений тарифа и льготы процедуры обработки события изменения содержимого соответствующих текстовых полей пересчитывают стоимость билета:
Private Sub TextBox4_Change()
TextBox9.Text = Val(TextBox4.Text) – (Val(TextBox8.Text) / 100) * Val_ (TextBox4.Text)
End Sub
Private Sub TextBox8_Change()
TextBox9.Text = Val(TextBox4.Text) – (Val(TextBox8.Text) / 100) * Val(TextBox4.Text)
End Sub
Командные кнопки должны обеспечивать работу приложения по следующим сценариям: а) отказ от дальнейших действий с сохранением исходного состояния таблиц и бланка билета (кнопка «Отмена»); б) очистка заполняемых полей бланка билета (кнопка «Бланк»); в) генерация продаваемого билета с одновременным пересчетом количества оставшихся свободных мест и изменением номера места для следующего сеанса (кнопка «ОК»).
Процедура обработки события нажатия на кнопку «Отмена» имеет вид:
Private Sub CommandButton3_Click()
UserForm1. Hide
End Sub
Процедура обработки события нажатия на кнопку «Бланк» выглядит следующим образом:
Private Sub CommandButton2_Click()
Билет.Activate
Range("c6 : c12; a1:a3").Select
Selection.Clear
UserForm1. Hide
End Sub
Процедура обработки события CommandButton1_Click выглядит так:
Private Sub CommandButton1_Click()
Rem Проверка наличия мест по содержанию поля TextBox6. Выдача соответствующего сообщения при отсутствии мест. Заполнение бланка билета при их наличии
If Val(TextBox5.Text) = 0 Then
MsgBox "На выбранный рейс мест нет"
Else
Билет.Range("c3") = UserForm1.ComboBox1.Text
Билет.Range("C4") = UserForm1.TextBox1.Text
Билет.Range("C5") = UserForm1.TextBox2.Text
Билет.Range("C6") = UserForm1.TextBox3.Text
Билет.Range("C7") = UserForm1.TextBox4.Text
Билет.Range("C8") = UserForm1.TextBox6.Text
Rem Если льгота не выбрана, печатать в соответствующем поле бланка - “Полный”
If ComboBox2.Text = "" Then
Билет.Range("c9") = "Полный"
Else
Билет.Range("c9") = UserForm1.ComboBox2.Text
End If
Билет.Range("C10") = UserForm1.TextBox9.Text
Билет.Range("C11") = UserForm1.TextBox10.Text
Билет.Range("a1") =Реквизиты. Range(“b1”)
Билет.Range("a2") = Реквизиты. Range(“b2”)
Билет.Range("a31") = Реквизиты. Range(“b3”)
Билет.Activate
Rem Определение строки в таблице Расписание, соответствующей проданному билету. Обновление информации в полях количество оставшихся мест и текущего значения места следующего билета
k = 2
Do While Расписание. Cells(k, 2) <> UserForm1. TextBox1. Text
k = k + 1
Loop
Расписание.Cells(k, 6). Value = Расписание. Cells(k, 6). Value - 1
Расписание.Cells(k, 7). Value = Расписание. Cells(k, 7). Value + 1
UserForm1. Hide
End If
End Sub
Для ежедневного обновления информации о свободных местах на рабочем листе «Расписание» диалоговая форма дополняется соответствующей кнопкой и программируется процедура, обеспечивающая этот режим:
Private Sub CommandButton4_Click()
n = 2
Do While Расписание.Cells(n, 1) <> ""
Расписание.Cells(n, 6).Value = 40
Расписание.Cells(n, 7).Value = 1
n = n + 1
Loop
MsgBox "Обновление произведено"
End Sub
Следующим шагом по разработке приложения является его дополнение файлом справки. Справочная информация вызывается по кнопке «CommandButton5». Щелчок по этой кнопке выводит на экран форму UserForm2, на которой размещен элемент TextBox, используемый для демонстрации содержимого текстового файла спраки в режиме «Только чтение». Процедура вызова справки имеет вид:
Private Sub CommandButton5_Click()
Wrap$ = Chr(13) + Chr(10)
Open "c:\rf.txt" For Input As 1
Do Until EOF(1)
Line Input #1, Lineoftext$
LineFull$ = Lineoftext$ + Wrap$
Alltext$ = Alltext$ & LineFull$
Loop
UserForm2. TextBox1. MultiLine = True
UserForm2. TextBox1. ScrullBurs = 3
UserForm2. TextBox1.Text = Alltext$
Close #1
End Sub
Строковая переменная Wrap$ служит для маркировки концов строк.
На заключительном этапе добавляется кнопка, автоматического запуска макроса. Для этого следует выполнить следующие действия: в меню «Вид» выбрать строку «Панель инструментов» – «Настройка»; с помощью кнопки «Создать» добавить новую панель инструментов; переключиться в подокно «Команды» и выбрать из списка разделов раздел «Макросы»; перетащить нужную кнопку на добавленную панель; затем щелкнуть по ней правой кнопкой мыши для вызова контекстного меню; выбрать пункт «Назначить макрос»; в открывшемся списке макросов выбрать нужный; в завершение отредактировать значок на командной кнопке, подобрать размер и оформление.
Следует помнить, что добавленная кнопка является элементом интерфейса Excel и при копировании приложения на другой компьютер переноситься не будет.