Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
ru:manual:report:use_macros_in_reports:debug [2013/10/11 07:35] radchenko [Полезные ссылки] |
— (текущий) | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Подходы к отладке кода ====== | ||
- | Некоторые подходы по нахождению ошибок и их исправлению приведены ниже. | ||
- | |||
- | ===== Ошибки ===== | ||
- | |||
- | Конечная цель при выполнении макроса -- это получение требуемого для нас отчета. Если отчет выполнился с другим результатом, чем ожидалось, -- это ошибка. Ошибки могут быть явными -- выдается какое-либо предупреждение, и неявными -- сообщений нет, но требуемый результат не достигнут. Возможные ситуации, которые сопровождают ошибки, приведены ниже. | ||
- | |||
- | ==== Отчет выполнился не верно, сообщение в Business Studio ==== | ||
- | |||
- | Отчет выполняется не с ожидаемым результатом. При этом в [[ru/manual/interface/main_form|окне системных сообщений Business Studio]] выдается текст вида: | ||
- | <code text> | ||
- | 17.07.2013 9:07:18 Ошибка при выполнении макроса ПослеВыполненияОтчета: Адресат вызова создал исключение.. | ||
- | Действия не будут выполнены. | ||
- | </code> | ||
- | __Причина__: причины различные. Например, попыткой обработки текстовых переменных арифметическими операциями. | ||
- | |||
- | __Решение__: запустить отчет на выполнение в режиме отладки кода (см. [[#отладка_кода| Отладка кода]]). | ||
- | |||
- | ==== Отчет выполнился не верно, сообщений об ошибках нет ==== | ||
- | |||
- | При просмотре выполненного отчета, видим, что необходимый результат не достигнут. При этом не было никаких сообщений об ошибке. | ||
- | |||
- | __Причина:__ ошибка в логике кода, не указаны полностью все необходимые действия в коде, ошибочные вводные параметры. | ||
- | |||
- | __Решение:__ запустить отчет на выполнение в режиме отладки кода (см. [[#отладка_кода| Отладка кода]]). | ||
- | |||
- | ==== Никаких сообщений, отчет выполняется "вечно" ==== | ||
- | |||
- | Никаких сообщений не выводится и выполнение одного отчета длится очень долго. "Очень долго" - от нескольких минут и более. Если обработка не связана с очень большим объёмом данных, то, возможно, получился бесконечный цикл, из которого макрос не может выйти. | ||
- | |||
- | __Причина__: Разработчик кода макроса допустил логическую ошибку, задав неверные условия в циклических операциях. | ||
- | |||
- | __Решение__: завершить выполнение MS Word (MS Excel) через Диспетчер задач (Alt+Ctrl+Del). Возможно, для работы над отчетом потребуется перегрузить Windows. | ||
- | |||
- | Далее отчет следует запускать на выполнение при отладке макроса (см. [[#отладка_кода| Отладка кода]]). | ||
- | |||
- | ==== Другие сообщения об ошибках ==== | ||
- | |||
- | Вариантов и причин ошибок может быть множество. Как правило, характер ошибки пишется в сообщения. И для их исправления необходимо использовать отладку кода. | ||
- | |||
- | ===== Отладка кода ===== | ||
- | |||
- | Если путем логических размышлений о причине ошибке исправить её не получается, необходимо детально рассмотреть выполнение макроса -- отладить код. Отладка кода подразумевает определение конкретного проблемного места в коде, который приводит к ошибке, и его исправление для получения желаемого результата. | ||
- | |||
- | Для того чтобы "залезть в отладку" и пошагово пройтись по выполнению макроса необходимо первыми строками макроса написать следующие строки: | ||
- | |||
- | <code vb> | ||
- | |||
- | 'Для отладки | ||
- | Dim DebugVar As Variant | ||
- | Set DebugVar = 0 | ||
- | 'конец "для отладки" | ||
- | |||
- | </code> | ||
- | |||
- | При выполнении макроса будет выдано сообщение об ошибке на фоне еще одного окна среды VBA. К этой ошибке привел вышеуказанный код. | ||
- | |||
- | [{{ ru:manual:report:use_macros_in_reports:debug:debug1.png?nolink |Рисунок 1. Сообщение об ошибке, созданной умышленно | ||
- | }}] | ||
- | |||
- | Далее необходимо: | ||
- | |||
- | - Нажать в сообщении "Ок"; | ||
- | - Закомментировать указанные ранее строки; | ||
- | - Продолжит работу с макросом пошагово или через точки прерывания -- Breakpoint | ||
- | - Найти место ошибки и понять, как ее исправить. | ||
- | - Внести исправление в код в среде VBA разрабатываемого отчета. | ||
- | |||
- | [{{ ru:manual:report:use_macros_in_reports:debug:debug2.png?nolink |Рисунок 2. Комментирование строк, приведших к ошибке | ||
- | }}] | ||
- | |||
- | |||
- | == Внимание! == | ||
- | |||
- | Окно среды VBA, вызванное в ходе перехода к отладке, является окном для отладки конкретного вызываемого отчета и не относится к шаблону отчета Business Studio. Изменения кода в таком окне не будут сохранены в макросе шаблона разрабатываемого отчета. Поэтому окно VBA для отладки лучше использовать для понимания выполнения текущего кода. Изменения же кода необходимо делать в основном окне VBA разрабатываемого отчета. | ||
- | ====== ====== | ||
- | |||
- | ==== Видеть значения переменных ==== | ||
- | |||
- | В ходе отладки макроса необходимо видеть значения некоторых переменных. Возможные пути их получения приведены ниже. | ||
- | |||
- | **Значения переменных в окне** **Watches** | ||
- | |||
- | Значения необходимых переменных можно получить в ходе отладки в среде VBA: меню Debug -- Add Watch… | ||
- | |||
- | Дополнительно: | ||
- | |||
- | * [[http://www.youtube.com/watch?v=19JTjCtFPeI|Excel VBA - Debug with the Watch Window]] | ||
- | * [[http://msdn.microsoft.com/en-us/library/ms172744(v=vs.80).aspx|Debugging Your Visual Basic Application]] | ||
- | |||
- | **Значения переменных в сообщениях** | ||
- | |||
- | Значения необходимых переменных также можно получить путем их вывода в отдельных сообщениях в ходе выполнения макроса. Что и когда выводить определяется непосредственно в коде макроса. | ||
- | |||
- | Например, вывести какое-то сообщение можно так: | ||
- | <code vb> | ||
- | MsgBox "Текст сообщения" | ||
- | </code> | ||
- | |||
- | Значение переменной типа текст можно вывести так: | ||
- | <code vb> | ||
- | txtVar = "Какое-то значение переменной" | ||
- | MsgBox "Значение txtVar = " & txtVar | ||
- | </code> | ||
- | |||
- | Значение числовой переменной можно вывести так: | ||
- | <code vb> | ||
- | digitalVar = 10 | ||
- | MsgBox "Значение digitalVar = " & Str(digitalVar) | ||
- | </code> | ||
- | |||
- | Для вывода сообщения в разных строках необходимо использовать вставить Chr(13): | ||
- | <code vb> | ||
- | MsgBox "Текст первой строки" & Chr(13) & _ | ||
- | "Текст второй строки" | ||
- | </code> | ||
- | ===== Полезные ссылки ===== | ||
- | |||
- | *[[http://office.microsoft.com/ru-ru/access-help/HP005186717.aspx|Отладка программ Visual Basic]] | ||
- | *[[https://www.google.com/search?client=safari&rls=en&q=%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0+%D0%BA%D0%BE%D0%B4%D0%B0+vba&ie=UTF-8&oe=UTF-8|Google.com]] |