Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
58
Добавлен:
12.04.2015
Размер:
310.78 Кб
Скачать

Процесс отладки программы

Начинается самый трудоемкий и, в профессиональном плане, самый сложный этап разработки приложения – ОТЛАДКА ПРОГРАММЫ. Сложно написать программу сразу без ошибок. И при этом ошибки бывают разные как по природе из возникновения, так и по трудоемкости исправления.

Самые простые ошибки – синтаксические. Их интерпретатор VBA «вылавливает» сразу, как только Вы нажимаете на клавишу Enter после ввода очередной строки кода программы. Вам остается только внимательно вчитаться в напечатанный Вами текст, найти и исправить опечатку.

Более сложные ошибки – ошибки ВЫПОЛНЕНИЯ ПРОГРАММЫ. Они проявляются только во время работы программы. Вот ими мы и займемся.

Запуск программы на выполнение

Запустить программу в VBA можно несколькими путями.

Запуск через главное меню приложения – самый длинный, но и в то же время, самый типовой прием. Перейдите на лист EXCEL, наберите на чистом листе табличку рисунок 11а, выделите ее как блок (либо мышкой, либо другим путем), поскольку наша программа начнет свою работу с поиска выделенного блока.

Войдите в меню СЕРВИС-МАКРОС-МАКРОСЫ (или Alt+F8) и вы получите окно со списками всех программных модулей (макросов), какие есть сейчас у Вас в приложении (рисунок 13). В нашем случае виден только один макрос – это наша подпрограмма Poradok. Установите на нее курсор и нажмите кнопку ВЫПОЛНИТЬ.

Миг и наша таблица на экране превращается в нечто, следующего вида:

-12

0

5

1

6

9


Что-то это не похоже на нужную нам сортировку.

Половина начальных цифр исчезла, появились пустые клетки… Значит где-то в нашей программе «дыра». И может быть не одна. Ну что же, приступим, как говорят хирурги, беря в руки скальпель.

Инструменты отладки программ в vba.

Во-первых снова восстановим на листе EXCEL исходную таблицу рисунок 11а и выделим ее блоком. После этого клавишами Alt+F11 перейдем в инструментальную среду программирования VBA (ИС VBA).

Сначала проверим правильность работы блоков ввода данных. Для этого поставим точку останова программы на оператор следующий за блоком «Получить из выделенной зоны данные “. Точка останова ставится щелчком левой кнопки мыши на левом поле окна модуля с текстом программы напротив того оператора, на котором должна остановиться программа при своем выполнении (появляется коричневая жирная точка, и вся помеченная строка тоже становится коричневая).

Для запуска программы нажмем кнопку запуска приложения , расположенную в инструментальной линейке ИС VBA вверху экрана. Приложение запустится сразу, если ИС VBA разобралась в обстановке, или опять появится окно рисунок 13, если ИС VBA требуются пояснения, что же все-таки следует запустить. После запуска практически сразу программа остановится на нашей «точке останова», что будет видно по ярко желтой полосе на тексте программы. Теперь мы можем проанализировать ситуацию, создавшуюся в программе в текущему моменту. Для анализа раскроем окно локальных переменных (см. выше) и в нем, как в окне системного ПРОВОДНИКА откроем содержимое компонентов массива Mass (рисунок 14).

Видно, что к моменту, когда все данные с экрана должны быть перенесены в этот массив, на самом деле элемент Mass(1,1) – пустой, Mass(1,2) – тоже пустой, а элемент Mass(1,2) содержит 5, хотя должен содержать (см.рисунок 11а) – 8. Значит что-то не в порядке с циклом переноса данных в массив Mass. Анализируем его и видим, что в строке

Mass(i, j) = Cells(X + i, Y + j - 1)

при наборе текста программы мы пропустили -1 в первом индексе ячейки. Исправим эту ошибку:

Mass(i, j) = Cells(X + i - 1, Y + j - 1)

Остановим работу программы клавишейв инструментальной линейке ИС VBA и снова запустим клавишей. Теперь содержимое массива Mass в окне локальных переменных (рисунок 15) соответствует действительности .

Пока программа находится в состоянии останова, проверим также содержимое переменных X, Y, H и W. Их можно тоже посмотреть в окне локальных переменных, либо на них можно просто навести курсор мыши в любом месте текста программы и на секунду задержать его. ИС VBA тут же покажет небольшое окошко с содержимым указанной переменной (рисунок 16). Посмотрев все переменные убеждаемся, что блок ввода данных отработал нормально и во всех ячейках разместил именно те числа, которые должны быть.

-12

0

5

1

6

8

9

34

123

П

Рисунок 17

родолжим выполнение программы и посмотрим, как она переставит числа теперь. Для продолжения нажмем кнопку. Программа быстро завершилась, что видно по очистке окна локальных переменных (после завершения программы все переменные уходят из поля видимости ИС VBA). Чтобы посмотреть результат переключимся на лист EXCEL. Видим таблицу рисунок 17. Чувство радости при внимательном рассмотрении таблицы сменяется унынием. Перестановка произошла, но как-то не до конца. В частности цифра 1 оказалась после цифры 5. Значит где-то еще «дыра». И скорее всего в блоке перестановки данных. Что ж, продолжим операцию отладки.

Опять придется восстановить таблицу на листе EXCEL в исходное состояние и выделить ее блоком. Снова переключимся в ИС VBA и запустим программу.

Программа остановится на «точке останова» сразу после ввода данных. Чтобы выяснить что происходит при перестановке чисел продолжим выполнение программы в пошаговом режиме.

Если вы откроете меню ОТЛАДКА в верхней строке ИС VBA, то увидите, что режимов пошаговой отладки три. Они вызываются горячими клавишами F8, Shift+F8 и Ctrl+Shift+F8. Названия режимов написаны там же в меню. Нам нужен первый режим: «с заходом» в каждый оператор программы. Поэтому закрываем меню и нажимаем F8. Программа выполнила следующий оператор и остановилась. Теперь Вы можете проанализировать содержимое всех переменных в программе и оценить правильность хода выполнения программы. Снова нажимаете F8 и снова анализ. И так до тех пор пока не выявите ошибку или пока не закончится программа.

Предположим, что произошло второе, а мы так и не заметили где же наша программа ошибается. Тогда немного изменим технологию контроля за ходом выполнения программы. В циклах перестановки в нашей программе сравниваются всего пара ячеек Mass(i,j) и Mass(K,M). Настроим ИС VBA так, чтобы она показывала нам именно эти сравниваемые величины и индексы K и M, целевой ячейки (индексы i, j настольно просто изменяются, что ошибиться в них невозможно (почти)).

Для контроля используем окно контрольных значений (меню ВИД…). Чтобы добавить в окно интересующие нас величины удобно выделить их в тексте программы, щелкнуть правой клавишей мыши и в появившемся динамическом меню выбрать режим «Добавить контрольное значение». Появится окно с настройками контрольного значения (рисунок 18).

Здесь можно откорректировать (или вписать другое) переменную или выражение, которое Вы хотите контролировать и установить тип контроля. В нашем случае тип контроля – контрольное выражение. После нажатия на кнопку ОК, заказанное выражение попадает в окно контрольных значений. Вводим в окно все четыре интересующие нас величины.

Снова восстанавливаем таблицу на листе EXCEL в исходное состояние, выделяем ее блоком. Снова переключаемся в ИС VBA и запускаем программу. Снова, после останова программы, жмем F8, пошагово проходя по каждому оператору и анализируя изменение контрольных значений наших переменных (рисунок 19). И в какой-то момент с удивлением замечаем, что когда на следующем шаге индекс M должен был приобрести значение 1, этого не произошло. Внимательно посмотрев на текст программы, мы наконец замечаем, что пропустили оператор установки переменной L в 1.

Остановим программу. Добавим пропущенный оператор. Снова восстанавливаем таблицу на листе EXCEL в исходное состояние, выделяем ее блоком. Снова переключаемся в ИС VBA. Снимаем точку останова на операторе

For i = 1 To H

(щелчком мыши на нем) и запускаем программу.

Проверяем результат на листе EXCEL:

-12

0

1

5

6

8

9

34

123

Ура! Наконец программа выдала то, что нам надо.

Тестируем программу еще и еще раз, выстраивая на листе EXCEL различные таблицы и упорядочивая в них данные. Все работает отлично!

Правда, через некоторое время Вы вспоминаете, что в условии задачи просили выдавать сообщение об ошибке, если в ячейках выделенной таблицы расположены не числовые данные. Как это сделать?

Придется порыться в справочной системе VBA, книгах по программированию на VBA и лекциях, чтобы найти функцию, определяющую тип переменной. В справочной системе описание этой функции выглядит так, как показано на рисунок 20. Функция имеет ключевое слово VarType( ), в качестве параметра требует переменную, которую Вы хотите проанализировать и возвращает коды, указанные в справке (рисунок 20) в зависимости от типа переменной.

Кроме того используем стандартную функцию для выдачи сообщений на экран MsgBox и команду принудительного выхода из подпрограммы Exit Sub (как записывается и используется эти функция и команда тоже можно посмотреть в справочной системе VBA).

Код программы, который использует эти функции и удобен для нас выглядит так:

obmen = Cells(X + i - 1, Y + j - 1)

If VarType(obmen) > 1 And VarType(obmen) < 6 Then

Mass(i, j) = obmen

Else

MsgBox "В ячейке "+Chr(Y + i + 63)+LTrim(Str(X + i - 1))+ _

" НЕ числовые данные"

Exit Sub

End If

Выводимый на экран текст в функции MsgBox составлен путем сложения отдельных фраз и номеров строки и столбца преобразованных в текст. С помощью стандартной функции языка Basic – Chr код столбца преобразовывается в букву его названия (но при этом, чтобы получилась буква к коду добавляется число 63 – смещение буква А в кодовой таблице символов).

Стандартная функция LTrim удаляет все левые пробелы из строки, в которую стандартная функция Str преобразовала число с номером строки ячейки. Обо всех этих функциях Вы более подробно можете посмотреть в справочной системе VBA.

Последнее требование к программе было – «снять выделение после отработки программы». Эту задачу легко выполнить, если дать команду выделить одну любую другую ячейку. Например, в нашей программе можно снять выделение блока командой:

Cells(X, Y).Select

которая переводит курсор выделения ячеек на ячейку в начале выделенной таблицы.

После внесения всех изменений окончательный текст нашей программы принимает вид:

Option Base 1

Sub Poradok()

Dim Mass() As Variant

Dim obmen As Variant

Dim i As Integer

Dim j As Integer

Dim X As Integer

Dim Y As Integer

Dim H As Integer

Dim W As Integer

Dim K As Integer

Dim L As Integer

Dim M As Integer

'Получить характеристики выделенной области

X = Selection.Row

Y = Selection.Column

H = Selection.Rows.Count

W = Selection.Columns.Count

'Заказать в памяти массив

ReDim Mass(H, W)

'Получить из выделенной зоны данные

For i = 1 To H

For j = 1 To W

obmen = Cells(X + i - 1, Y + j - 1)

If VarType(obmen) > 1 And VarType(obmen) < 6 Then

Mass(i, j) = obmen

Else

MsgBox "В ячейке " + Chr(Y + i + 63) + LTrim(Str(X + i - 1)) + _

" НЕ числовые данные"

Exit Sub

End If

Next j

Next i

'Переставить данные в порядке возрастания

For i = 1 To H

For j = 1 To W

K = i: L = j

For K = i To H

For M = L To W

If Mass(i, j) > Mass(K, M) Then

obmen = Mass(i, j)

Mass(i, j) = Mass(K, M)

Mass(K, M) = obmen

End If

Next M

L = 1

Next K

Next j

Next i

'Вывести новый порядок данных на лист EXCEL

For i = 1 To H

For j = 1 To W

Cells(X + i - 1, Y + j - 1) = Mass(i, j)

Next j

Next i

Cells(X, Y).Select

End Sub