Статистика
Просмотры материалов : 155145Кроссворд. Макросы |
Автор: Александр Хохлов |
06.01.2011 19:11 |
Интерактивный кроссворд. Решаем задачу на основе макросов. Эта статья не рассчитана на новичков и требует знания основ программирования. Постановка задачи.Нужно сделать кроссворд так, чтобы после нажатия кнопки «Проверить» осуществлялась проверка правильности ответов всего кроссворда. Действие 1. Разработка функции GlueTogether().Для начала, напишем функцию GlueTogether() обработки диапазона ячеек, состоящего из одной строки и n столбцов. Задача этой функции - склеить буквы из ячеек диапазона в одну строку. По сути, это будет аналог стандартной функции СЦЕПИТЬ() в Excel. Public Function GlueTogether(D As String) Dim myRange As Range Set myRange = Range(D) 'полученная строка Dim myString As String myString = "" 'обработка диапазона For j = 1 To myRange.Cells.Count myString = myString & myRange.Cells(1, j) Next j 'возвращаемый результат GlueTogether = myString End Function Эту функцию можно использовать для проверки введенного пользователем слова в диапазоне F3:F10, например так: Public Sub CheckAnswers() If GlueTogether("F3:F10") = "эпидемия" Then MsgBox 1 Else MsgBox 2 End If End Sub Если полученное слово совпадает с правильным ответом, то выдается единица, иначе - ноль. Очевидно, что функция требует доработки и применять ее в таком виде будет проблематично. Действие 2. Доработка функции GlueTogether().Задача: научить функцию обработке прямоугольных диапазонов. Решение будет классическим - используем вложенные циклы. Public Function GlueTogether(D As String) Dim myRange As Range Set myRange = Range(D) 'полученная строка Dim myString As String myString = "" 'обработка диапазона For i = 1 To myRange.Rows.Count For j = 1 To myRange.Columns.Count myString = myString & myRange.Cells(i, j) Next j Next i 'возвращаемый результат GlueTogether = myString End Function Действие 3. Проверка работоспособности.Если применить функцию для обработки диапазона E3:R12, то результатом будет такая строка: 1эпидемия2заражение3руткит4интернет5троянская6антивирус7лечение8программа9удаление10сканер. Обратим внимание, что строка содержит не только буквы, но и цифры - порядковые номера слов, которые тоже попали в обрабатываемый диапазон. Не будем усложнять задачу и избавляться от цифр, они нам не помешают. Кроме того, они даже выполняют роль некого разделителя слов в этой длинной строке. Так как применять функцию планируется на небольших кроссвордах не более 15 слов, то такой вариант нас вполне устраивает. Действие 4. Редактор кода VBA.На этом шаге создадим процедуру CheckAnswers(), которую затем «прикрутим» к кнопке. Сперва наберем уже имеющийся код GlueTogether(). Для этого в Excel 2010 выполняем команду Разработчик -> VisualBasic. Откроется окно редактора кода VBA. В меню редактора выбираем Insert -> Module. Будет добавлен новый модуль Module1. Выполняем по нему двойной клик и в области редактирования кода сначала вставляем код функции GlueTogether(), затем набираем процедуру CheckAnswers(), ее код представлен ниже. Public Sub CheckAnswers() Dim myAnswer As String 'строка - правильный ответ myAnswer = "1эпидемия2заражение3руткит4интернет5троянская" & _ "6антивирус7лечение8программа9удаление10сканер" 'сравнение и запись результата If GlueTogether("E3:R12") = myAnswer Then Range("G14").Value = 1 Else Range("G14").Value = 0 End If End Sub Внесем некоторые пояснения. Эта процедура записывает единицу в ячейку с адресом G14, если все верно и ноль - в противном случае. После набора кода должно получиться так: Закрываем редактор VBA, он нам больше не понадобится. Действие 5. Окончательное решение. Кнопка и макрос.Добавим кнопку на лист. Для этого выполняем команду Вставка -> Фигуры -> выбрать любую векторную фигуру. Я использовал скругленный прямоугольник. Щелкаем правой кнопкой по фигуре и выбираем Назначить макрос... В раскрывшемся окне макросов выбираем CheckAnswers. Теперь при нажатии кнопки, будет исполняться процедура CheckAnswers. Теперь, сделаем так, чтобы в зависимости от значения ячейки G14 выдавалось «Молодец!», либо «Думай еще!» В ячейку G15 всавляем логическую функцию. В итоге получаем такой результат, если все верно. Или такой, если были допущены ошибки при разгадывании. Значение ячейки G14 можно скрыть или заблокировать от редактирования. Один из способов описан в статье Кроссворд. Формулы. |