Программирование VBA. Федеральное агентство по образованию государственное образовательное учреждение высшего профессионального образования
Скачать 2.93 Mb.
|
ВЕДОМОСТЬ) шрифтом. 4. Ввести шапку таблицы (Фамилия И.О., №зач.кн., Дисциплина, Оценка). 5. Обвести рамкой каждую ячейку шапки таблицы. Порядок записи макроса следующий. 1. Открыть новую рабочую книгу. 2. Выполнить команду Сервис > Макрос > Начать запись. Поя- вится диалоговое окно Запись макроса, показанное ниже. 3. Ввести название макроса, например ВЕДОМОСТЬ_1, и щёлкнуть кнопку OK. 4. Выполнить действия по формированию заголовка и шапки таблицы, перечисленные выше в п.п. 1÷5 5. Щёлкнуть на кнопке Остановить запись одноименной пане- ли инструментов. Сеанс записи макроса закончен. Обычно (но не всегда!) на экране появляется панель инструментов Остановить запись. Если эта панель не появилась, то нужно щёлкнуть правой кнопкой мыши на любой панели инструментов и в открывшемся контекстном меню 120 панели выбрать команду Настройка, а затем в одноименном диалоговом окне в списке Панели инструментов установить флажок возле пункта Остановить запись. Как альтернативу можно выполнить команду Сервис > Макрос > Остановить макрос. Для выполнения макроса необходимо выполнить команду Сервис > Макрос > Макросы. Отобразится диалоговое окно Макрос. Выделить мак- рос ВЕДОМОСТЬ_1 и щёлкнуть на кнопке Выполнить. Можно также выполнить макрос из окна редактора VBA, используя команду RunSub|UserForm из меню Run или щелкнуть на кнопке Run Sub|UserForm стандартной панели инструментов или нажать клавишу F5. 2.19. Просмотр кода макроса По ходу записи макроса Excel запоминает действия пользователя и одновременно преобразует их в код VBA. Чтобы увидеть полученный код, нужно выполнить следующие действия. 1. Выберать команду Сервис > Макрос > Макросы. Отобразится диало- говое окно Макрос. 2. Выделите макрос ВЕДОМОСТЬ_1 и щёлкнуть на кнопке Изменить. Откроется окно редактора Microsoft Visual Basic, в котором отобра- зится код этого макроса. Sub ВЕДОМОСТЬ_1() ' ' ВЕДОМОСТЬ_1 Макрос ' Макрос записан 15.06.2009 (VAM) ' Range("A1:D1").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Selection.Merge Range("A1:D1").Select ActiveCell.FormulaR1C1 = "ВЕДОМОСТЬ" With ActiveCell.Characters(Start:=1, Length:=9).Font .Name = "Arial Cyr" .FontStyle = "полужирный" .Size = 12 .Strikethrough = False 121 .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With Range("A2").Select ActiveCell.FormulaR1C1 = "Фамилия И.О." Range("B2").Select ActiveCell.FormulaR1C1 = "№зач.кн." Range("C2").Select ActiveCell.FormulaR1C1 = "Дисциплина" Range("D2").Select ActiveCell.FormulaR1C1 = "Оценка" Range("A2:D2").Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With End Sub 122 Количество строк в коде макроса не соответствует тому незначи- тельному количеству действий, которые совершены при записи макроса. Дело в том, что хотя устанавливался только формат шрифта и вид рамки ячеек, в коде макроса сохранена вся информация, представленная кноп- кой Ж выбора шрифта панели инструментов и характеристикой границы ячеек. Кроме того, здесь используется относительная адресация ячеек, для которой необходимо выделять ячейки. В приведённом ниже макросе ВЕДОМОСТЬ_2 удалена вся лишняя информация и изменён способ адресации ячеек, что привело к значи- тельному уменьшению макроса и увеличению его наглядности. Это оказа- лось проще, чем разрабатывать макрос на пустом месте. Sub ВЕДОМОСТЬ_2() ' ' ВЕДОМОСТЬ Макрос ' Макрос записан 15.06.2009 (VAM) Range("A1:D1").Select Selection.HorizontalAlignment = xlCenter Selection.Merge ActiveCell.FormulaR1C1 = "ВЕДОМОСТЬ" With ActiveCell.Characters(Start:=1, Length:=9).Font .FontStyle = "полужирный" End With Range("A2") = "Фамилия И.О." Range("B2") = "№Зач.кн." Range("C2") = "Дисциплина" Range("D2") = "Оценка" Range("A2:D2").Select Selection.Borders(xlEdgeLeft).Weight = xlThin Selection.Borders(xlEdgeTop).Weight = xlThin Selection.Borders(xlEdgeBottom).Weight = xlThin Selection.Borders(xlEdgeRight).Weight = xlThin Selection.Borders(xlInsideVertical).Weight = xlThin End Sub 3. Отладка программ В редакторе VBA имеется большой набор инструментов и средств для тестирования и отладки разрабатываемых приложений. В этом пункте рассматриваются следующие вопросы. Тестирование и отладка программ. Остановка выполнения приложений. Использование окна Immediate. Пошаговое выполнение процедур. Отслеживание значений переменных и свойств. 123 3.1. Тестирование и отладка как этап разработки приложений Тестирование – это процесс выполнения процедуры и исследование всех аспектов ее работы. Цель тестирования – проверить правильность результатов выполнения процедуры и ее реакцию на разнообразные дей- ствия пользователя. Если во время работы процедуры получены невер- ные результаты вычислений, непредвиденная реакция на те или иные действия пользователя, либо вообще произошла остановка выполнения, то это говорит о том, что код процедуры имеет ошибки. Необходимо вводить комментарии в коде процедур. Комментарии позволяют разобраться в назначении того или иного фрагмента кода и тем самым облегчить поиск ошибок. Кроме того, без понятных комментариев трудно поддерживать приложение в будущем. Ошибки в коде процедур подразделяются на три типа: синтаксические ошибки, ошибками выполнения, логические ошибки. Синтаксические ошибки. Это ошибки, связанные с неправильным форматом кода. По умолчанию редактор Visual Basic отслеживает синтак- сические ошибки в коде процедур после нажатия клавиши Enter. Это по- лезное средство, но при желании его можно отключить (или восстановить), удалив (или установив) флажок опции Auto Syntax Check (Автоматическая проверка синтаксиса) на вкладке Editor (Редактор) диалогового окна Options (Параметры). Ошибки выполнения (runtime error). Это такие ошибки, которые при- водят к остановке выполнения приложения. Например, введено имя объ- екта с ошибкой. VBA может обнаружить такую ошибку только во время вы- полнения программы. Ошибки выполнения также могут быть реакцией на действия пользователя, которые не предусмотрены в программе, напри- мер, на ввод некорректного значения аргумента функции, которая вы соз- дана. Логические ошибки (logic error). VBA не может отследить такой тип ошибок, так как в этом случае обычно нет грамматических и синтаксиче- ских ошибок в написании операторов, т.е. нарушена логика выполнения операторов. 3.1.1. Отладка Процесс локализации и исправления ошибок называется отладкой (debugging). Для этих целей можно использовать функцию MsgBox и спе- циальные средства отладки. Функцию MsgBox можно использовать для вывода значений перемен- ных в любом месте процедуры, чтобы контролировать изменение пере- менных в процессе выполнения процедуры. В процессе отладки можно по- следовательно выявлять ошибки, и чтобы ускорить процесс отладки мож- но “нейтрализовать” выполнение функции MsgBox, помещая перед ней символ “одиночная кавычка” ( ' ), превращая тем самым строку кода в при- 124 мечание. После отладки программы строки с отладочными строками мож- но удалить. К специальным средствам отладки VBA относятся: окно быстрого выполнения Immediate, наблюдение за значениями переменных, точки останова, пошаговое выполнение кода. Чтобы исследовать процесс отладки на практике, необходимо создать процедуру, содержащую ошибку. Для этого нужно выполнить следующие действия. 1. Закрыть все открытые книги. 2. Открыть новую рабочую книгу. 3. Нажать комбинацию клавиш Visual Basic. 4. Вставить модуль в текущую рабочую книгу. 5. Создать новую процедуру и назвать её, например, Ошибка. 6. Ввести код этой процедуры Sub Ошибка() Dim response response = Application.InputBox("Введите ваше имя") If response = "" Then MsgBox "Процедура завершена" Exit Sub Else MsgBox "Ваше имя - " & response End If End sub 7. Выполнить процедуру. В окне ввода ввести ваше имя и нажать кла- вишу Enter. Появится окно сообщения, содержащее введённое имя. Итак, пока процедура работает как надо. 1. Щёлкнуть на кнопке ОК для закрытия окна сообщения. 8. Нажать F5 для повторного выполнения процедуры. 9. В окне ввода щёлкнуть на кнопке Отмена. на экран будет выведено следующее диалоговое окно: В диалоговом окне получено сообщение Ваше имя False! Но должны были получить Процедура завершена! 125 10. Щёлкнуть на кнопке ОК для удаления окна сообщения. Итак, процедура работает неправильно. Она определенно содержит ошибку, но как найти эту ошибку? На примере этой процедуры рассмотрим различные методы отладки. 3.1.1.1. Режим останова Чтобы отладить процедуру "вручную", необходимо просмотреть каж- дую строку кода. В VBA для локализации ошибки имеется несколько спо- собов остановить выполнение процедуры в определенных точках кода. Это называется перевести процедуру в режим останова. Режим останова временно приостанавливает выполнение процедуры. В этом режиме мож- но проверить значения переменных и свойств, применить другие средства отладки. Режим останова позволяет выполнить следующие действия. Редактировать код процедуры. Просматривать значения переменных, свойств и выражений. Изменять значения переменных и свойств. Выполнять операторы Visual Basic в окне быстрого выполнения Immediate. В рассматриваемой процедуре ошибка как-то связана с оператором InputBox. Поэтому после его выполнения следует остановить процедуру. Место в коде программы, где остановится выполнение процедуры, назы- вается точкой останова (breakpoint). Есть несколько способов пометить строку кода точкой останова. Выбрать строку кода и выполнить команду Debug > Toggle Breakpoint (Отладка > Установка точки останова). Выбрать строку кода и нажать клавишу F9. Точку останова можно установить только на строке, содержащей ис- полняемый код. В строке, содержащей неисполняемый код, установить точку останова нельзя. К неисполняемому коду относятся комментарии, операторы объявления переменных и констант, пустые строки. Когда на строке кода установлена точка останова, то она меняет цвет (в соответст- вии с текущими установками среды редактора VBA). Удалить точки останова можно точно теми же описанными выше способа- ми, что и установить. Если в коде установлены несколько точек останова, чтобы удалить их все за один раз, нужно выполнить команду Debug > Clear All Breakpoint (Отладка > Удалить все точки останова) или нажать комбинацию клавиш В процедуре Ошибка точку останова надо установить после строки, содержащей оператор InputBox. Для этого нужно выполнить следующие действия. Поместить текстовый курсор где-нибудь в строке, расположенной ниже строки, содержащей оператор InputBox. Нажать клавишу F9. Строка изменит цвет. Можно установить больше одной точки останова. 126 Теперь необходимо выполнить процедуру Ошибка и посмотреть, ка- кой эффект произведет точка останова. 1. Выполнить процедуру Ошибка. 2. В окно ввода ввести свое имя и нажать клавишу Enter. Появится окно редактора Visual Basic, где будет выделена строка, на которой уста- новлена точка останова: Теперь процедура находится в режиме останова, и есть возможность узнать значение, которое в данный момент приняла переменная response. Самый простой путь сделать это – поместить указатель мыши на имя пе- ременной. Появится маленькое окошко, показывающее текущее значение переменной: response = “МАРИЯ” Таким же образом можно просмотреть значения других переменных и свойств. Просмотр значений переменных – это самое наименьшее, что можно сделать для поиска и устранения ошибок. Имеются и другие способы просмотра значений переменных и свойств, например, использование окна Immediate, которое позволяет не только просматривать значения переменных и свойств, но и изменять их. 3.1.1.2. Использование окна Immediate Окно быстрого выполнения Immediate предоставляет доступ ко всем переменным и свойствам, используемым в процедуре. С помощью этого окна можно решать различные задачи, включая следующие. Задать значения переменных и свойств. 127 Изменить значения переменных и свойств. Увидеть результат отладочных действий. Вызвать на исполнение любую процедуру. Ввести новые операторы и сразу их выполнить. Это позволяет экспериментировать с различными вариантами кода процедуры. Копировать и вставлять фрагменты кода процедуры в окно Immediate и сразу их выполнять. 3.1.1.2.1. Просмотр значений в окне Immediate Как было показано ранее, можно просмотреть текущие значения перемен- ных в режиме останова, поместив указатель мыши на имя переменной. Другой путь просмотра значений переменных и свойств – окно Immediate. Для этого также предусмотрено несколько способов. Во-первых, в окне Immediate можно ввести слово Print (Печать) или знак вопроса (?), а за- тем – имя переменной или свойства. Во-вторых, можно ввести непосред- ственно в процедуру оператор Debug.Print, который будет показывать в окне Immediate значения заданных переменных. Ниже рассмотрены оба эти способа. Сначала испробуем способ со словом Print (или что то же самое, со знаком вопроса). 1. Если процедура Ошибка все еще находится в режиме останова, нужно привести её в исходное состояние, выполнив команду Run > Reset (Выполнить > Восстановить) или щелкнув на кнопке Reset стандартной панели инструментов. 2. Начать выполнение процедуры, нажав клавишу F5. В окне ввода щёлкнуть на кнопке Отмена. Поскольку при выполнении процедуры достигнута точка останова, то откроется редактор VBA. 3. Если в окне редактора отсутствует окно Immediate, нажать комби- нацию клавиш Immediate). 4. Чтобы узнать значение переменной response, щёлкнуть в окне Immediate и ввести ?response (между знаком ? и словом response не должно быть пробела!). 5. Нажать клавишу Enter. В следующей строке окна Immediate появится значение переменной response. В данном случае эта переменная имеет значение False: Выше указано, что в окне Immediate можно не только просмотреть значения переменных, но и задавать эти значения. Это позволяет прове- рить логику выполнения программы. В нашей процедуре оператор If дол- 128 жен вывести соответствующее окно сообщения, если переменная response имеет значение пустой строки. Для проверки этого необходимо: 1. В окне Immediate ввести строчку response = "" 2. Нажать клавишу Enter. Теперь переменная response имеет значение пустой строки. 3. Нажать клавишу F5, чтобы продолжить выполнение процедуры. На эк- ран будет выведено диалоговое окно: 4. Щёлкнуть на кнопке ОК в окне сообщения для завершения процедуры. В предыдущем примере для получения доступа к окну Immediate бы- ла установлена точка останова, которая переводила процедуру в режим останова. Но если по каким-либо причинам нет необходимости останавли- вать выполнение процедуры, но нужно знать значения переменных или свойств во время выполнения, то необходимо использовать оператор Debug.Print. Этот оператор вставляется непосредственно в код процеду- ры и выводит соответствующий текст в окно Immediate во время ее вы- полнения. Чтобы воспользоваться этим оператором в процедуре Ошибка, нужно проделать следующее. 1. Выполнить команду Debug > Clear All Breakpoints для удаления всех точек останова из процедуры. 2. Удалить текст из окна Immediate. 3. Измените код процедуры следующим образом (изменения выделены полужирным шрифтом): Public Sub Ошибка_2() Dim response response = Application.InputBox("Введите свое имя") Debug.Print "Значение response: " & response If response = " " Then MsgBox "Процедура завершена" Exit Sub Else MsgBox "Ваше имя - " & response. End If End Sub 4. Нажав клавишу F5, начать выполнение процедуры. 5. Ввести имя в окне ввода и нажать клавишу Enter. 6. Щёлкнуть на кнопке OK для закрытия окна сообщения. |