Кроссворд. Макросы
Автор: Александр Хохлов   
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 можно скрыть или заблокировать от редактирования. Один из способов описан в статье Кроссворд. Формулы.

 

Добавить комментарий

Защитный код
Обновить