В начало
Статьи
Библиотека
Разное

Вот здесь - новый сайт, заходите немедленно!

kift - Коллекция Интересных Фактов и Теорий

А тут можно поболтать и побухтеть, милости просим:

kift - неизданное

Введение в программирование на примере VBA

Часть II. Создание макроса-приложения

Аннотация
Предисловие
Часть I. Макрос Word
     1. Проектирование и запись макроса
     2. Разбор макроса
     3. Внесение исправлений
     Итоги
Часть II. Макрос-приложение
     4. Проектирование
     5. Визуальное редактирование
     6. Запуск и остановка
     7. Вывод данных
     8. Выбор ответа
     9. Перемещение по списку
     10. Обратное перемещение
     11. Новая версия
     12. Реализация новой версии
    13. Завершение работы
     Итоги
Часть III. Объект на основе класса
     14. "Основное" приложение
     15. Компонент-таймер
     Итоги
Послесловие

Занятие 13. Завершение работы над приложением

Цель занятия – создание новой версии приложения, полностью реализующей требования, выдвинутые нами в начале работы.

Так как сделать осталось немного, вся работа объединена в одно занятие.

Цикл 3

На предыдущих занятиях было создано вполне серьезное и работоспособное приложение для тестирования пользователей. Чтобы завершить работу и полностью реализовать требования, сформулированные в начале, осталось решить две задачи. А именно – полученные в процессе тестирования ответы должны сохраняться в долговременном хранилище, и следует каким-то образом обрабатывать результаты тестирования, предоставляя «отчет» пользователю. Эти задачи будут решены во время третьего цикла процесса разработки.

Итак, перед нами две задачи: сохранить полученные в результате теста данные и предоставить пользователю оценку прохождения теста.

В общем случае следовало бы разделить эти задачи на два «витка» разработки. Но в нашем случае задачи небольшие, вполне возможно их объединить.

Подцикл 1. Сохранение результатов теста

Две явно выделенные задачи цикла требуют, по меньшей мере, двух подциклов. Так и сделаем. Первый подцикл будет посвящен реализации сохранения результатов теста.

Требования

Сохранение результатов теста будем производить в конце тестирования. Можно сохранять результат и после каждого ответа, но это усложнит задачу. Преимущество сохранения после каждого вопроса – в «защите» от потери данных, предположим, при сбое питания компьютера. Для нашего приложения это не столь важно.

Сформулируем требования к деятельности по сохранению результатов теста.

В конце теста следует сохранить все полученные ответы в долговременном хранилище.

Условие «конец теста» определяет момент совершения требуемых действий.

Формула «все полученные ответы» предполагает работу с набором ответов. Он уже находится во временном хранилище-массиве. Долговременное хранилище для нашего проекта – таблица Excel.

Проектирование
  • Составим схему последовательности действий:

Цикл обработки набора нам уже знаком. Это – конструкция For...Next.

  • Составим псевдокод:

<достижение конца тестирования>
For index = 1 To intQuestions
     <ячейка Excel> = arStore(index).Answ
Next index

<Ячейка Excel> – это ячейка, предназначенная для хранения полученных ответов.

Вспомните, что для нашего проекта номер вопроса не совпадает с номером строки таблицы Excel, так как для каждого вопроса отводится несколько строк. Следует выполнить преобразование:

<достижение конца тестирования>
Dim intRow As Integer
Dim index As Integer
For index = 1 To intQuestions
     intRow = ((index – 1) * LineCount) + 1
     <ячейка Excel> = arStore(index).Answ
Next index

Код для обозначения <ячейки Excel> разумно взять из процедуры SheetRead, написанной нами ранее:

.Cells(intRow, 3)

При этом конструкция With кэширует объект shtCurrent, которому и принадлежит объект Cells.

Код приобретает вид:

Dim intRow As Integer
Dim index As Integer

With shtCurrent
For index = 1 To intQuestions
intRow = ((index – 1) * LineCount) + 1
.Cells(intRow, 3).Value = arStore(index).Answ
Next index
End With

Обратите внимание, что объект Cells уточняется явным указанием свойства ValueЗначение. VBA и без такого уточнения может правильно присвоить свойство, но для удобопонимания кода следует указывать название свойства явно.

Вспомните, что в процедуре RecordRead мы читали данные из свойства Text. К сожалению, VBA не позволяет записывать данные в это свойство, для присвоения значения ячейкам таблицы Excel следует использовать свойство Value.

Решим, где будет размещена новая процедура. Это несложно. Так как в коде нет обращений к элементам управления и форме – следует поместить код в модуле.

Реализация
  • Перейдите в окно кода модуля basShell.
  • Создайте процедуру с именем SheetWrite и поместите в нее созданный код. Новая процедура будет выглядеть так:

Public Sub SheetWrite()
Dim intRow As Integer
Dim index As Integer

With shtCurrent
For index = 1 To intQuestions
intRow = ((index – 1) * LineCount) + 1
.Cells(intRow, 3).Value = arStore(index).Answ
Next index
End With

End Sub

Теперь определимся, где будет происходить вызов этой процедуры.

В требованиях указано, что сохранение данных происходит в конце тестирования. Вспомните, что именно в этот момент мы вызывали процедуру Summary, подводящую итог тесту. Есть смысл сохранить результат перед вызовом Summary.

  • Перейдите в окно кода формы frmTest, в текст процедуры cmdNext_Click.
  • Найдите вызов процедуры Summary и поместите перед этой строкой код вызова новой процедуры:

Private Sub cmdNext_Click()
arStore(intCurrentRecord).Answ = AnswSelected
If fEnd = True Then
    SheetWrite
    Summary
Else
fStart = False
.
.

У вас может возникнуть желание объединить процедуры SheetWrite и Summary, чтобы уменьшить число процедур и упростить код. Не следует этого делать! Эти две процедуры выполняют совершенно разные действия. В последствии, если вы захотите модифицировать программу, подобное «упрощение» доставит вам много хлопот.

  • Сохраните код, выполните пробный запуск.
  • Проведите «тестирование», запоминая свои ответы.
  • В конце теста сверьте свои ответы со значениями, появившимися в таблице Excel. Они должны совпадать.
  • Внесите нужные комментарии в текст проекта.

Подцикл 2. Обработка результатов

Последнее, что мы сделаем для проекта – это создадим обработчик результатов.

К счастью, раньше мы уже сделали заготовку этого обработчика – процедуру Summary. Осталось лишь реализовать ее логику.

Способов обработки результатов теста может быть очень много. Мы применим один из простых.

Требования

Составим требования.

Для оценки результатов теста следует сверить полученные ответы с «эталонными», после чего ознакомить пользователя с числом верных ответов и процентом успешных ответов.

Проектирование
  • Составим схему последовательности действий:

Как видите из схемы, мы применим специально созданную переменную intCounter для подсчета числа верных ответов.

В начале подсчета следует «обнулить» счетчик – не следует доверять VBA в том, какие значения он присваивает вновь созданным переменным.

  • Составим псевдокод:

Dim intCounter As Integer
intCounter = 0
For index = 1 To intQuestions
If <полученный ответ> = <эталон> Then
intCounter = intCounter + 1
End If
Next index

<Полученный ответ> уже хранится во временном хранилище. <Эталон> – изначально заданное значение правильного ответа, в начале теста считывается в то же временное хранилище.

  • Изменим псевдокод:

Dim intCounter As Integer
intCounter = 0
For index = 1 To intQuestions
If arStore(index).Answ = arStore(index).Well Then
intCounter = intCounter + 1
End If
Next index

Обратите внимание на строку

intCounter = intCounter + 1

Это принятый для VBA способ изменить значение переменной-счетчика.

Итак, переменная intCounter содержит количество верных ответов. А в переменной intQuestions уже находится общее число вопросов теста. Осталось предоставить ответ пользователю.

Чтобы не усложнять задачу, воспользуемся знакомой нам функцией MsgBox, выводящей строку в окошке сообщения.

Но сначала следует составить строку.

Это можно сделать так:

Dim strResume As String

strResume = "Вы верно ответили на " & intCounter & " из " & intQuestions & " вопросов." & vbCrLf & "Успешность прохождения теста" & vbCrLf & intCounter / intQuestions * 100 & " процентов."

MsgBox strResume

Формула

intCounter / intQuestions * 100

вполне допускается VBA при составлении строки. Будет подставлен результат вычисления среднего арифметического в процентах.

Вспомните, что слово vbCrLf обозначает переход на новую строку.

Но для удобства и сокращения кода следовало бы поместить строки в константах, как мы делали раньше.

  • Перейдите в окно кода модуля basSummary.
  • В начале модуля поместите строки:

Const sRes1 As String = "Вы верно ответили на "
Const sRes2 As String = " из "
Const sRes3 As String = " вопросов."
Const sRes4 As String = "Успешность прохождения теста"
Const sRes5 As String = " процентов."

Не забудьте о пробелах в строках, иначе результат будет выглядеть очень некрасиво.

Реализация
  • А текст процедуры замените на следующий:

Public Sub Summary()
Dim intCounter As Integer
intCounter = 0
For index = 1 To intQuestions
If arStore(index).Answ = arStore(index).Well Then
intCounter = intCounter + 1
End If
Next index
Dim strResume As String

strResume = sRes1 & intCounter & sRes2 & intQuestions & sRes3 & _
vbCrLf & sRes4 & vbCrLf _
& intCounter / intQuestions * 100 & sRes5

MsgBox strResume

End Sub

Заметьте, что при составлении strResume использовался перенос строк кода в IDE – чтобы длинная строка поместилась на экране. Этот прием мы уже рассматривали ранее.

  • Сохраните проект.
  • Запустите программу и несколько раз выполните тестирование, давая разные ответы.

При нажатии кнопки cmdNext – когда на ней появляется надпись Конец – должно появляться окошко с результатами тестирования.

Если хотите, можно модифицировать поведение приложения так, чтобы по завершении тестирования и после вывода результатов оно завершало работу. Для этого перейдите в код обработчика события нажатия кнопки cmdNext и после вызова процедуры Summary поместите код:

Private Sub cmdNext_Click()
arStore(intCurrentRecord).Answ = AnswSelected
If fEnd = True Then
SheetWrite
Summary
    Unload Me
Else
fStart = False
.
.

Сохраните проект и проверьте его работу.

После вывода результатов и закрытии окошка сообщения окно приложения должно исчезать.

  • Внесите комментарии, подробно поясняющие работу приложения. Не забудьте сохранить результат.

Ваше тест-приложение готово.

Для начала настоящей работы следует составить список вопросов и ответов и внести их в таблицу Excel, являющуюся «субстратом» приложения. Возможно, вам придется изменить размеры формы, поля для вывода вопроса и переключателей, чтобы тексты могли поместиться полностью.

Итог занятия

Опять мы не узнали ничего принципиально нового. Но многократное повторение материала – один из лучших способов его усвоить (другой способ – составление конспекта).

Еще раз обратите внимание на то, что компонент, оценивающий результаты теста – процедура Summary, – вынесена в отдельный модуль. Тем самым перед вами открывается возможность, во-первых, использовать эту процедуру в других проектах (как это сделать, вы узнаете в конце обучения), а, во-вторых, вы можете иметь несколько модулей, каждый из которых будет содержать свой вариант Summary. Несложным переключением в окне Project Explorer можно будет менять поведение приложения.

Hosted by uCoz