Введение в программирование на примере VBA
Часть II. Создание макроса-приложения
Занятие 13. Завершение работы над приложениемЦель занятия – создание новой версии приложения, полностью реализующей требования, выдвинутые нами в начале работы. Так как сделать осталось немного, вся работа объединена в одно занятие. Цикл 3На предыдущих занятиях было создано вполне серьезное и работоспособное приложение для тестирования пользователей. Чтобы завершить работу и полностью реализовать требования, сформулированные в начале, осталось решить две задачи. А именно – полученные в процессе тестирования ответы должны сохраняться в долговременном хранилище, и следует каким-то образом обрабатывать результаты тестирования, предоставляя «отчет» пользователю. Эти задачи будут решены во время третьего цикла процесса разработки. Итак, перед нами две задачи: сохранить полученные в результате теста данные и предоставить пользователю оценку прохождения теста. В общем случае следовало бы разделить эти задачи на два «витка» разработки. Но в нашем случае задачи небольшие, вполне возможно их объединить. Подцикл 1. Сохранение результатов тестаДве явно выделенные задачи цикла требуют, по меньшей мере, двух подциклов. Так и сделаем. Первый подцикл будет посвящен реализации сохранения результатов теста. ТребованияСохранение результатов теста будем производить в конце тестирования. Можно сохранять результат и после каждого ответа, но это усложнит задачу. Преимущество сохранения после каждого вопроса – в «защите» от потери данных, предположим, при сбое питания компьютера. Для нашего приложения это не столь важно. Сформулируем требования к деятельности по сохранению результатов теста. В конце теста следует сохранить все полученные ответы в долговременном хранилище. Условие «конец теста» определяет момент совершения требуемых действий. Формула «все полученные ответы» предполагает работу с набором ответов. Он уже находится во временном хранилище-массиве. Долговременное хранилище для нашего проекта – таблица Excel. Проектирование
Цикл обработки набора нам уже знаком. Это – конструкция For...Next.
<достижение конца тестирования> <Ячейка Excel> – это ячейка, предназначенная для хранения полученных ответов. Вспомните, что для нашего проекта номер вопроса не совпадает с номером строки таблицы Excel, так как для каждого вопроса отводится несколько строк. Следует выполнить преобразование: <достижение конца тестирования> Код для обозначения <ячейки Excel> разумно взять из процедуры SheetRead, написанной нами ранее: .Cells(intRow, 3) При этом конструкция With кэширует объект shtCurrent, которому и принадлежит объект Cells. Код приобретает вид: Dim intRow As
Integer Обратите внимание, что объект Cells уточняется явным указанием свойства Value – Значение. VBA и без такого уточнения может правильно присвоить свойство, но для удобопонимания кода следует указывать название свойства явно. Вспомните, что в процедуре RecordRead мы читали данные из свойства Text. К сожалению, VBA не позволяет записывать данные в это свойство, для присвоения значения ячейкам таблицы Excel следует использовать свойство Value. Решим, где будет размещена новая процедура. Это несложно. Так как в коде нет обращений к элементам управления и форме – следует поместить код в модуле. Реализация
Public Sub SheetWrite() Теперь определимся, где будет происходить вызов этой процедуры. В требованиях указано, что сохранение данных происходит в конце тестирования. Вспомните, что именно в этот момент мы вызывали процедуру Summary, подводящую итог тесту. Есть смысл сохранить результат перед вызовом Summary.
Private Sub cmdNext_Click() У вас может возникнуть желание объединить процедуры SheetWrite и Summary, чтобы уменьшить число процедур и упростить код. Не следует этого делать! Эти две процедуры выполняют совершенно разные действия. В последствии, если вы захотите модифицировать программу, подобное «упрощение» доставит вам много хлопот.
Подцикл 2. Обработка результатовПоследнее, что мы сделаем для проекта – это создадим обработчик результатов. К счастью, раньше мы уже сделали заготовку этого обработчика – процедуру Summary. Осталось лишь реализовать ее логику. Способов обработки результатов теста может быть очень много. Мы применим один из простых. ТребованияСоставим требования. Для оценки результатов теста следует сверить полученные ответы с «эталонными», после чего ознакомить пользователя с числом верных ответов и процентом успешных ответов. Проектирование
Как видите из схемы, мы применим специально созданную переменную intCounter для подсчета числа верных ответов. В начале подсчета следует «обнулить» счетчик – не следует доверять VBA в том, какие значения он присваивает вновь созданным переменным.
Dim intCounter As
Integer <Полученный ответ> уже хранится во временном хранилище. <Эталон> – изначально заданное значение правильного ответа, в начале теста считывается в то же временное хранилище.
Dim intCounter As
Integer Обратите внимание на строку intCounter = intCounter + 1 Это принятый для VBA способ изменить значение переменной-счетчика. Итак, переменная intCounter содержит количество верных ответов. А в переменной intQuestions уже находится общее число вопросов теста. Осталось предоставить ответ пользователю. Чтобы не усложнять задачу, воспользуемся знакомой нам функцией MsgBox, выводящей строку в окошке сообщения. Но сначала следует составить строку. Это можно сделать так: Dim strResume As String Формула intCounter / intQuestions * 100 вполне допускается VBA при составлении строки. Будет подставлен результат вычисления среднего арифметического в процентах. Вспомните, что слово vbCrLf обозначает переход на новую строку. Но для удобства и сокращения кода следовало бы поместить строки в константах, как мы делали раньше.
Const sRes1 As String = "Вы верно ответили на " Не забудьте о пробелах в строках, иначе результат будет выглядеть очень некрасиво. Реализация
Public Sub Summary() Заметьте, что при составлении strResume использовался перенос строк кода в IDE – чтобы длинная строка поместилась на экране. Этот прием мы уже рассматривали ранее.
При нажатии кнопки cmdNext – когда на ней появляется надпись – должно появляться окошко с результатами тестирования. Если хотите, можно модифицировать поведение приложения так, чтобы по завершении тестирования и после вывода результатов оно завершало работу. Для этого перейдите в код обработчика события нажатия кнопки cmdNext и после вызова процедуры Summary поместите код: Private Sub cmdNext_Click() Сохраните проект и проверьте его работу. После вывода результатов и закрытии окошка сообщения окно приложения должно исчезать.
Ваше тест-приложение готово. Для начала настоящей работы следует составить список вопросов и ответов и внести их в таблицу Excel, являющуюся «субстратом» приложения. Возможно, вам придется изменить размеры формы, поля для вывода вопроса и переключателей, чтобы тексты могли поместиться полностью. Итог занятияОпять мы не узнали ничего принципиально нового. Но многократное повторение материала – один из лучших способов его усвоить (другой способ – составление конспекта). Еще раз обратите внимание на то, что компонент, оценивающий результаты теста – процедура Summary, – вынесена в отдельный модуль. Тем самым перед вами открывается возможность, во-первых, использовать эту процедуру в других проектах (как это сделать, вы узнаете в конце обучения), а, во-вторых, вы можете иметь несколько модулей, каждый из которых будет содержать свой вариант Summary. Несложным переключением в окне Project Explorer можно будет менять поведение приложения. |