Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
ru:creating_user_reports:use_macros_in_reports:debug [2020/07/17 12:14] 192.168.1.126 удалено |
— (текущий) | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Подходы к отладке кода ====== | ||
- | |||
- | Некоторые подходы по нахождению ошибок и их исправлению приведены ниже. | ||
- | |||
- | ===== Ошибки ===== | ||
- | |||
- | Конечная цель при выполнении макроса - это получение требуемого для нас отчета. Если отчет выполнился с другим результатом, чем ожидалось, это ошибка. Ошибки могут быть явными - выдается какое-либо предупреждение, и неявными - сообщений нет, но требуемый результат не достигнут. Возможные ситуации, которые сопровождают ошибки, приведены ниже. | ||
- | |||
- | ==== Отчет выполнился не верно, сообщение в Business Studio ==== | ||
- | |||
- | Отчет выполняется не с ожидаемым результатом. При этом в окне системных сообщений Business Studio (см. [[ru/manual/manual]] -> [[ru/manual/interface/main_form]]) выдается текст вида: | ||
- | |||
- | <code text> | ||
- | 17.07.2013 9:07:18 Ошибка при выполнении макроса ПослеВыполненияОтчета: Адресат вызова создал исключение. | ||
- | Действия не будут выполнены. | ||
- | </code> | ||
- | |||
- | __Причина__: причины могут быть различные. Например, попытка обработки текстовых переменных арифметическими операциями. | ||
- | |||
- | __Решение__: запустить отчет на выполнение в режиме отладки кода (см. [[#отладка_кода|Отладка кода]]). | ||
- | |||
- | ==== Отчет выполнился не верно, сообщений об ошибках нет ==== | ||
- | |||
- | При просмотре выполненного отчета видим, что необходимый результат не достигнут. При этом не было никаких сообщений об ошибке. | ||
- | |||
- | __Причина:__ ошибка в логике кода, не указаны полностью все необходимые действия в коде, ошибочные вводные параметры. | ||
- | |||
- | __Решение:__ запустить отчет на выполнение в режиме отладки кода (см. [[#отладка_кода|Отладка кода]]). | ||
- | |||
- | ==== Никаких сообщений, отчет выполняется "вечно" ==== | ||
- | |||
- | Никаких сообщений не выводится и выполнение одного отчета длится очень долго. "Очень долго" - от нескольких минут и более. Если обработка не связана с очень большим объёмом данных, то, возможно, получился бесконечный цикл, из которого макрос не может выйти. | ||
- | |||
- | __Причина__: Разработчик кода макроса допустил логическую ошибку, задав неверные условия в циклических операциях. | ||
- | |||
- | __Решение__: завершить выполнение MS Word (MS Excel) через Диспетчер задач Windows (Ctrl+Alt+Del). Возможно, для работы над отчетом потребуется перегрузить Windows. | ||
- | |||
- | Далее отчет следует запускать на выполнение при отладке макроса (см. [[#отладка_кода|Отладка кода]]). | ||
- | |||
- | ==== Другие сообщения об ошибках ==== | ||
- | |||
- | Вариантов и причин ошибок может быть множество. Как правило, характер ошибки понятен из выводимого сообщения. И для исправления ошибок необходимо использовать отладку кода. | ||
- | |||
- | ===== Отладка кода ===== | ||
- | |||
- | Если путем логических размышлений о причине ошибки исправить её не получается, необходимо детально рассмотреть выполнение макроса и отладить код. Отладка кода подразумевает определение конкретного проблемного места в коде, который приводит к ошибке, и его исправление для получения желаемого результата. | ||
- | |||
- | Для того чтобы "залезть в отладку" и пошагово пройтись по выполнению макроса, необходимо первыми строками макроса написать следующие: | ||
- | |||
- | <code vb> | ||
- | 'Для отладки | ||
- | Dim DebugVar As Variant | ||
- | Set DebugVar = 0 | ||
- | 'конец "для отладки" | ||
- | </code> | ||
- | |||
- | При выполнении макроса будет выдано сообщение об ошибке на фоне еще одного окна среды VBA. К этой ошибке привел вышеуказанный код. | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:debug:lang_debug1.png?nolink |Рисунок 1. Сообщение об ошибке, созданной умышленно | ||
- | }}] | ||
- | |||
- | Далее необходимо: | ||
- | |||
- | - Нажать в сообщении "Ок"; | ||
- | - Закомментировать указанные ранее строки; | ||
- | - Продолжить работу с макросом пошагово или через точки прерывания -- Breakpoint | ||
- | - Найти место ошибки и понять, как ее исправить. | ||
- | - Внести исправление в код в среде VBA разрабатываемого отчета. | ||
- | |||
- | [{{ ru:creating_user_reports:use_macros_in_reports:debug:lang_debug2.png?nolink |Рисунок 2. Комментирование строк, приведших к ошибке | ||
- | }}] | ||
- | |||
- | == == | ||
- | **Внимание!** Окно среды VBA, вызванное в ходе перехода к отладке, является окном для отладки конкретного вызываемого отчета и не относится к шаблону отчета Business Studio. Изменения кода в таком окне не будут сохранены в макросе шаблона разрабатываемого отчета. Поэтому окно VBA для отладки лучше использовать для понимания выполнения текущего кода. Изменения же кода необходимо делать в основном окне VBA разрабатываемого отчета. | ||
- | ==== ==== | ||
- | |||
- | ==== Видимость значений переменных ==== | ||
- | |||
- | В ходе отладки макроса необходимо видеть значения некоторых переменных. Возможные пути их получения приведены ниже. | ||
- | |||
- | **Значения переменных в окне** **Watches** | ||
- | |||
- | Значения необходимых переменных можно получить в ходе отладки в среде VBA: меню Debug -- Add Watch… | ||
- | |||
- | Дополнительно: | ||
- | |||
- | * [[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> | ||
- | |||
- | Сообщение в разных строках можно вывести так: | ||
- | <code vb> | ||
- | MsgBox "Текст первой строки" & Chr(13) & _ | ||
- | "Текст второй строки" | ||
- | </code> | ||
- | |||
- | ===== Полезные ссылки ===== | ||
- | |||
- | *[[https://www.google.ru/search?q=отладка+кода+vba|google.com]] | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | [<contextnavigator>] | ||
- | |||