Vba 5460 ошибка файла
Конфигурация компьютера | |
Процессор: AMD Ryzen 5 1600 | |
Материнская плата: GIGABYTE B450M DS3H | |
Память: Kingston ValueRAM [KVR24N17S8/8] 8 ГБ | |
HDD: KINGSTON SV300S37A120G ATA 120ГБт SSD; SAMSUNG HD501LJ, SATA, 500ГБт; ST2000VM003-1CT164 ATA Device 2ТБт | |
Видеокарта: GIGABYTE Radeon R7 250 1100Mhz PCI-E 3.0 2048Mb 1800Mhz 128 bit DVI HDMI HDCP | |
Звук: Realtek ALC887 | |
Блок питания: CoolerMaster MasterWatt Lite 600W, 2019 | |
Монитор: Samsung SyncMaster 2443, 24'' | |
ОС: Windows 10 Pro 64Bit |
Понятно, что ей библиотек не хватает. Но как узнать, чего именно? » |
Зайдите в Tools-References, проверьте наличие пунктов с надписью MISSING, если присутствуют - уберите галочки.
Если проблема сохранится - запустите код, получите ошибку, после чего в VBA редакторе посмотрите какая строчка выделена. Озвучьте, либо посмотрите в поиске, какую библиотеку нужно подключить.
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
dislike, коль Вы не приложили архив с документом, надо полагать он особо секретный?
Alt-F11, ищете обработчик «любой кнопки», устанавливаете точку останова, нажимаете кнопку и начинаете отлаживать. Для начала можете действительно проверить наличие всех необходимых библиотек (\Tools\References). Разумеется, если проект не закрыт от просмотра.
Update: Коллега a_axe оказался быстрее .
у вас есть доступ к VBA-проекту в редакторе по alt+F11? » |
Это я уже пробовал, эта менюшка неактивна совсем (
коль Вы не приложили архив с документом, надо полагать он особо секретный? » |
Да фиг его знает. Бухгалтерская приблуда с информациями по банковским картам, лучше не светить, а то б конечно выложил
Alt-F11, ищете обработчик «любой кнопки», устанавливаете точку останова, нажимаете кнопку и начинаете отлаживать. |
Make sure you're not in Break Mode. Try clicking Run->Reset. |
Конфигурация компьютера | |
Процессор: AMD Ryzen 5 1600 | |
Материнская плата: GIGABYTE B450M DS3H | |
Память: Kingston ValueRAM [KVR24N17S8/8] 8 ГБ | |
HDD: KINGSTON SV300S37A120G ATA 120ГБт SSD; SAMSUNG HD501LJ, SATA, 500ГБт; ST2000VM003-1CT164 ATA Device 2ТБт | |
Видеокарта: GIGABYTE Radeon R7 250 1100Mhz PCI-E 3.0 2048Mb 1800Mhz 128 bit DVI HDMI HDCP | |
Звук: Realtek ALC887 | |
Блок питания: CoolerMaster MasterWatt Lite 600W, 2019 | |
Монитор: Samsung SyncMaster 2443, 24'' | |
ОС: Windows 10 Pro 64Bit |
Цитата a_axe: у вас есть доступ к VBA-проекту в редакторе по alt+F11? » Есть » |
dislike, имеется ввиду, что вы можете увидеть и отредактировать любую часть текста кода VBA?
Т.е. в VBA редакторе в project explorer (окошко в левой части экрана с отображением проекта вида VBAProject(Имя_файла) ), по нажатию на плюсик у вас открывается содержимое, и вы видите код любого листа/модуля (а не просто ограничились фактом открытием редактора)?
Если нажатие на плюсик дает ошибку, то возможны варианты:
PS. ну понятное дело - указанный Break Mode нужно проверить в первую очередь.
Make sure you're not in Break Mode. Try clicking Run->Reset. » |
Ага, сделал, там ошибка
Missing: OnBttnAddInForWord 1.0 Type Library
и ссылается это все в директорию офиса / Office14 / onbttnwd.dll
Файла такого естественно нет
Отключил галку, вроде других ошибок не выдает, отдал бухам тестировать, посмотрим что скажут.
При программировании приложения нужно учитывать, что происходит при возникновении ошибки. Ошибка в приложении может возникнуть по одной из двух причин. Во-первых, во время работы приложения могут возникать некоторые условия, приводящие к сбою кода, ранее работавшего исправно. Например, если код пытается открыть таблицу, удаленную пользователем, возникает ошибка. Во-вторых, код может содержать неправильную логику, препятствующую выполнению нужных действий. Например, ошибка возникает, если код пытается разделить значение на ноль.
Направление выполнения при возникновении ошибки
Обработчик ошибок указывает, что происходит в процедуре при возникновении ошибки. Например, может потребоваться завершение процедуры, если возникает определенное событие, или может потребоваться исправление условия, вызвавшего ошибку, и возобновление выполнения. Операторы On Error и Resume определяют, как продолжается выполнение в случае ошибки.
Оператор On Error
Оператор On Error включает или отключает процесс обработки ошибки. Если процесс обработки ошибки включен, при возникновении ошибки выполнение передается в него.
Существует три формы оператора On Error: On Error GoTo label, On Error GoTo 0 и On Error Resume Next. Оператор On Error GoTo label позволяет выполнять процесс обработки ошибок, начиная со строки, в которой находится оператор. Нужно включить процесс обработки ошибок перед первой строкой, в которой произошла ошибка. Если обработчик ошибок активен и происходит ошибка, выполнение передается в строку, указанную аргументом label.
Строка, указанная аргументом label, должна быть началом процесса обработки ошибок. Например, приведенные ниже процедуры указывают, что при возникновении ошибки выполнение передается в помеченную строку:
Оператор On Error GoTo 0 отключает обработку ошибки в процедуре. Он не должен указывать строку 0 в качестве начала для кода обработки ошибок, даже если в процедуре есть строка с номером 0. Если оператор On Error GoTo 0 отсутствует в коде, обработчик ошибок автоматически отключается, когда процедура полностью завершена. Оператор On Error GoTo 0 сбрасывает свойства объекта Err, оказывая такое же действие, как метод Clear объекта Err.
Оператор On Error Resume Next игнорирует строку, которая вызывает ошибку, и направляет выполнение к следующей за ней строке. Выполнение не прерывается. Можно использовать оператор On Error Resume Next, если нужно проверить свойства объекта Err сразу после строки, в которой ожидается возникновение ошибки, и обработать ошибку в процедуре, а не обработчике ошибок.
Оператор Resume
Оператор Resume направляет выполнение обратно к телу процедуры из процесса обработки ошибок. Оператор Resume можно добавить в процесс обработки ошибок, если нужно продолжить выполнение в определенной точке процедуры. Однако оператор Resume не является обязательным; процедуру также можно завершить после процесса обработки ошибок.
Существует три формы оператора Resume. Оператор Resume или Resume 0 возвращает выполнение в строку, в которой произошла ошибка. Оператор Resume Next возвращает выполнение в строку, расположенную непосредственно после строки, в которой произошла ошибка. Оператор Resume label возвращает выполнение в строку, указанную аргументом label. Аргумент label должен указывать на метку строки или на номер строки.
Используйте оператор Resume Next, если код исправляет ошибку в обработчике ошибок и вы хотите продолжить выполнение без повторного запуска строки, вызвавшей ошибку. Используйте оператор Resume label, если нужно продолжить выполнение в другой точке процедуры, указанной аргументом label. Например, можно продолжить выполнение с процесса выхода, как описано в разделе ниже.
Выход из процедуры
Если в процедуру добавляется процесс обработки ошибок, следует также добавить процесс выхода, чтобы процесс обработки ошибок запускался только при возникновении ошибки. Можно указать процесс выхода с помощью метки строки таким же образом, как указывается процесс обработки ошибок.
Например, можно добавить процесс выхода к примеру в предыдущем разделе. Если ошибка не возникает, процесс выхода запускается после тела процедуры. Если ошибка возникает, выполнение передается процессу выхода после завершения процесса обработки ошибок. Процесс выхода содержит оператор Exit.
Обработка ошибок во вложенных процедурах
Visual Basic также выполняет поиск включенного обработчика ошибок по списку вызовов в обратном направлении, если ошибка возникает в активном обработчике ошибок. Можно принудительно заставить Visual Basic выполнять поиск по списку вызовов в обратном направлении, запустив ошибку в активном обработчике ошибок с помощью метода Raise объекта Err. Это удобно для обработки ошибок, которые не ожидаются в обработчике ошибок. Если возникает неожиданная ошибка и она воспроизводится в обработчике ошибок, выполнение передается назад по списку вызовов для поиска другого обработчика, который может быть настроен для обработки такой ошибки.
Чтобы проиллюстрировать этот принцип, предположим, что у вас есть вложенная процедура, содержащая средство обработки ошибок несоответствия типов (ожидаемой ошибки). В какой-то момент в процедуре С возникает неожиданная ошибка деления на ноль. Если вы добавили оператор для воспроизведения исходной ошибки, выполнение передается назад по списку вызовов другому включенному обработчику ошибок, если он существует. Если вы исправляли ошибку деления на ноль в другой процедуре в списке вызовов, ошибка будет исправлена. Если код не воспроизводит ошибку, процедура продолжает выполнение без исправления ошибки деления на ноль. Это, в свою очередь, может вызывать другие ошибки в наборе вложенных процедур.
Таким образом, Visual Basic выполняет поиск включенного обработчика ошибок по списку вызовов в обратном направлении, если:
Ошибка возникает в процедуре, не содержащей включенного обработчика ошибок.
Ошибка возникает в активном обработчике ошибок. Если для запуска ошибки используется метод Raise объекта Err, можно принудительно заставить Visual Basic выполнять поиск включенного обработчика ошибок по списку вызовов в обратном направлении.
Получение сведений об ошибке
После передачи выполнения процессу обработки ошибок код должен определить, какая ошибка произошла, и устранить ее. Visual Basic и Access предоставляют несколько элементов языка, которые можно использовать для получения сведений о конкретной ошибке. Каждый предназначен для разного типа ошибок. Так как ошибки могут возникать в различных частях приложения, необходимо определить, какой из них использовать в коде на основе ожидаемых ошибок.
Элементы языка, доступные для обработки ошибок, включают:
Объект Err
Объект Error и коллекция Errors ADO
Объект Error и коллекция Errors DAO
Метод AccessError
Событие Error
Объект Err
Объект Err представлен в Visual Basic. При возникновении ошибки Visual Basic сведения об этой ошибке сохраняются в объекте Err. Объект Err хранит сведения только об одной ошибке одновременно. При возникновении новой ошибки объект Err изменяется для включения сведений об этой ошибке вместо старой.
Чтобы получить сведения об определенной ошибке, можно использовать свойства и методы объекта Err:
- Свойство Number — это свойство по умолчанию объекта Err. Оно возвращает идентификационный номер возникшей ошибки.
- Свойство Description объекта Err возвращает строку описания, связанную с ошибкой Visual Basic.
- Метод Clear очищает текущие сведения об ошибке из объекта Err.
- Метод Raise создает определенную ошибку и заполняет свойства объекта Err сведениями об этой ошибке.
В приведенном ниже примере показано, как использовать объект Err в процедуре, которая может вызывать ошибку несоответствия типов:
Обратите внимание, что в приведенном выше примере метод Raise используется для воспроизведения исходной ошибки. Если возникает ошибка, отличная от ошибки несоответствия типов, выполнение передается назад по списку вызовов в другой включенный обработчик ошибок, если он существует.
Объект Err предоставляет все необходимые сведения об ошибках Visual Basic. Однако он не предоставляет полные сведения об ошибках Access или ошибках ядра СУБД Access. Access и объекты доступа к данным (DAO) предоставляют дополнительные элементы языка, помогающие устранять ошибки.
Объект Error и коллекция Errors
Объект Error и коллекция Errors предоставляются интерфейсами ADO и DAO. Объект Error представляет ошибку ADO или DAO. Отдельная операция ADO или DAO может вызвать несколько ошибок, особенно при выполнении операций ODBC DAO. У каждой ошибки, возникающей во время определенной операции доступа к данным, есть соответствующий объект Error. Все объекты Error, связанные с определенной операцией ADO или DAO, хранятся в коллекции Errors. Ошибки нижнего уровня являются первыми объектами в коллекции, а ошибки верхнего уровня являются последними объектами в коллекции.
При возникновении ошибки ADO или DAO объект Err Visual Basic сохраняет номер ошибки для первого объекта в коллекции Errors. Чтобы определить, происходили ли дополнительные ошибки ADO или DAO, проверьте коллекцию Errors. Значения свойств Number ADO или Number DAO и свойств Description ADO или Description DAO первого объекта Error в коллекции Errors должны совпадать со значениями свойств Number и Description объекта Err Visual Basic.
Метод AccessError
Можно использовать метод Raise объекта Err, чтобы создать ошибку Visual Basic, не происходившую на самом деле, и определить строку описания, связанную с этой ошибкой. Однако нельзя использовать метод Raise, чтобы создать ошибку Access, ошибку ADO или ошибку DAO. Чтобы определить строку описания, связанную с ошибкой Access, ошибкой ADO или ошибкой DAO, не происходившей на самом деле, используйте метод AccessError.
Событие Error
Событие Error можно использовать для перехвата ошибок в форме или отчете Access. Например, если пользователь пытается ввести текст в поле с типом данных "Дата и время", возникает событие Error. Если добавить процедуру обработки события Error в форму Employees, а затем попытаться ввести текстовое значение в поле HireDate, запустится процедура обработки события Error.
Процедура обработки события Error использует целочисленный аргумент DataErr. Когда запускается процедура обработки события Error, аргумент DataErr сохраняет номер возникшей ошибки Access. Проверка значения аргумента DataErr в процедуре обработки событий — это единственный способ определить номер возникшей ошибки. Объект Err не заполняется сведениями об ошибке после возникновения события Error. Можно использовать значение аргумента DataErr вместе с методом AccessError, чтобы определить номер ошибки и его строку описания.
Оператор Error и функция Error предоставляются только для обеспечения обратной совместимости. При создании нового кода используйте объекты Err и Error, функцию AccessError и событие Error для получения сведений об ошибке.
Об участниках
Ссылка предоставлена сообществом UtterAccess.
UtterAccess — это премиальный вики-портал и форум, посвященный Microsoft Access.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Не так давно очередной раз столкнулся с ошибками приложения Excel при попытке включения макросов после открытия файлов .xlsm. Вспомнил, что подобные проблемы преследуют пользователей довольно давно, но чаще всего они наблюдались с Excel 2013 и Excel 2016. Характерные особенности этой группы ошибок следующие:
- Приложение Excel закрывается при открытии файла с макросами (при включенном режиме безопасности Включить все макросы );
- Ошибка приложения Excel возникает при попытке включить содержимое (нажатии соответствующей кнопки);
- Ошибка приложения Excel возникает при сохранении файла с макросами;
Ну и по горячим следам очередного инцидента, дабы не откладывать на потом, решил для себя собрать небольшой хаб по ошибкам приложения Excel с последующей модификацией, дабы опять не терять время на поиск информации в Сети и на составление облака причин.
Суть в том, что в процессе открытия файла xlsm, и при отключенных макросах, в верхней части основного окна (над таблицей), высвечивается строка уведомления: ПРЕДУПРЕЖДЕНИЕ СИСТЕМЫ БЕЗОПАСНОСТИ Запуск макросов отключен , с кнопкой включения содержимого (макросов). Как только пользователь её нажимает, Excel попросту аварийно завершается (падает) с ошибкой Программа Microsoft Excel не работает и характерным окном уведомления:
При этом было замечено, что непосредственно перед возникновением ошибки приложения Excel никаких системных обновлений и обновлений пакета Office не устанавливалось. Возможно, каким-то образом задействованы последние обновления на Office, но прямой связи я не заметил, а подробного исследования проблемы не проводил. При этом зависимости от версии операционной системы (мною лично сбои наблюдались на Windows 10 LTSC и Windows 7 Professional) так же выявлено не было. При анализе аварийного дампа приложения ( *.hdmp ) обычно можно увидеть подобную информацию исключения (вывод урезан):
ExceptionAddress : 00007ff86a1e05ac ( VBE 7+ 0x00000000001405ac ) ERROR_CODE : ( NTSTATUS ) 0xc0000005 - < Unable to get error code text > EXCEPTION_CODE : ( NTSTATUS ) 0xc0000005 - < Unable to get error code text >обычно это NTSTATUS с кодом c0000005 - Access violation, доступ запрещен. И чаще всего в дампе можно увидеть такой вот стек потока (вывод оптимизирован для улучшения представления):
000000b9 ` 1acfdd00 000001d3 ` 2fb24e90 : 000001d3 ` 5a0e0ef0 00000000 ` 00000000 : VBE 7+ 0x1405ac 000000b9 ` 1acfdd08 000001d3 ` 24c1fe20 : 00000000 ` 00000000 000001d3 ` 2fda9640 : 0x000001d3 ` 2fb24e90 000000b9 ` 1acfdd10 000001d3 ` 6cf35760 : 000001d3 ` 2fda9640 000001d3 ` 045c9b30 : 0x000001d3 ` 24c1fe20 000000b9 ` 1acfdd18 000001d3 ` 5a0e0ef0 : 000001d3 ` 045c9b30 000001d3 ` 2fcbb2b0 : 0x000001d3 ` 6cf35760 000000b9 ` 1acfdd20 00000000 ` 00000000 : 000001d3 ` 2fcbb2b0 000001d3 ` 2fcbb318 : 0x000001d3 ` 5a0e0ef0из которого единственное что понятно, так это то, что падение Excel происходит в недрах функций библиотеки vbe7.dll (среда исполнения VBA), подгруженной в адресное пространство процесса. Это указывает на проблемы с обработчиком VBA-скриптов, в контексте Excel чаще именуемых макросами.
НЕРЕШЕННОЕ: при отладке приложений из комплекта MS Office, вы не увидите имен функций в стеке вызовов, поскольку отсутствуют отладочные символы как к основным исполняемым файлам (Excel/Word/Outlook), так и к многочисленным библиотекам. Интересно, есть ли какое-либо решение?Так что же такое VBA и для чего он предназначается?
VBA (Visual Basic for Application) - язык макропрограммирования, основанный на языке Visual Basic.В приложениях, входящих в комплект MS Office, таких как Excel, Word, PowerPoint и Access, VBA используется для автоматизации множества рутинных задач (напр.: повторяющихся однотипных действий), позволяет создавать формы для общения с пользователем и предлагает множество иного богатого функционала. При помощи VBA доступно управление электронной таблицей посредством объектно-ориентированной модели кода/данных, при помощи VBA-кода входные данные таблиц могут быть обработаны и представлены в итоговых (результирующих) таблицах и диаграммах (графиках). Таблица становится интерфейсом кода, позволяя легко работать, изменять его и управлять расчётами. На выходе VBA проект, используемый в структурах описанных выше приложений (электронные таблицы Excel, презентации PowerPoint, базы Access), компилируется в специальный бинарный исполняемый файл, который размещается внутри файла основного формата. Применительно к Excel это файл vbaProject.bin , который располагается внутри *.xslm-файла в директории /xl , представляющий собой бинарный исполняемый файл проекта, содержащий макрос в откомпилированном (готовом к исполнению) виде.
Наиболее вероятной причиной сбоя является повреждение блока кода VBA, содержащегося в книге Excel. Об истоках этого остается только догадываться, возможно что в структуре .xlsm-файла, в процессе работы с документом, происходят какие-то [непредвиденные разработчиками] изменения, способные приводить блок кода в неработоспособное состояние.Решение 1: вставка нового листа
Выполните приведенную последовательность действий:
- Открываем [проблемный] .xlsm-файл (файл с макросами).
- Не нажимаем кнопку Включить содержимое .
- Добавляем в книгу Excel новый лист: правая кнопка мыши на ярлыках Лист1/Лист2/Лист3 → Вставить → Лист .
- Сохраняем электронную таблицу. Закрываем Excel.
- Открываем проблемный файл заново и включаем макросы.
Решение 2: перекомпиляция проекта
Выполните последовательность действий:
- Запускаем и открываем новую книгу Excel (не ваш проблемный файл).
- Открываем меню Файл - выбираем Параметры - далее открываем Центр управления безопасностью и заходим в Параметры центра управления безопасностью .
- В разделе Параметры макросов - выставляем чекбокс Отключить все макросы с уведомлением .
- В разделе Надежные расположения - выставляем чекбокс Отключить все надежные расположения .
- В разделе Надежные документы - выставляем чекбокс Отключить надежные документы .
- Жмем везде OK . Закрываем Excel.
- Открываем [проблемный] .xlsm-файл (файл с макросами).
- Не нажимаем кнопку Включить содержимое .
- Открывает редактор Visual Basic при помощи комбинации клавиш Alt + F11 . Либо можно использовать обходной маневр: в настройках включаем меню Разработчик , после этого в появившемся сверху в ленте меню Разработчик выбираем пункт Visual Basic .
- В открывшемся окне редактора Visual Basic (VBA редактор) пересохраняем проект: для этого жмем на панели инструментов кнопку Сохранить (изображение дискетки или комбинация Ctrl + S ).
- Выбираем из меню Debug - выбираем пункт меню Compile VBA Project :
Решение 3: добавление модуля
Дополнительное решение состоит в том, что бы внести изменения в макрос без перекомпиляции.
- Открываем [проблемный] .xlsm-файл (файл с макросами).
- Не нажимаем кнопку Включить содержимое .
- Открывает редактор Visual Basic (при помощи комбинации клавиш Alt + F11 ).
- Открываем меню Tools → пункт Options . В открывшемся окне переходим на вкладку General и деактивируем чекбокс Compile on Demand :
Эта статья содержит полное руководство по обработке ошибок VBA. Если вы ищете краткое резюме, посмотрите таблицу быстрого руководства в первом разделе.
Если вы ищете конкретную тему по обработке ошибок VBA, ознакомьтесь с приведенным ниже содержанием.
Если вы новичок в VBA, то вы можете прочитать пост от начала до конца, так как он выложен в логическом порядке.
Краткое руководство по обработке ошибок
Введение
Обработка ошибок относится к коду, который написан для обработки ошибок, возникающих во время работы вашего приложения. Эти ошибки обычно вызваны чем-то вне вашего контроля, например отсутствующим файлом, недоступностью базы данных, недействительными данными и т.д.
Если мы считаем, что ошибка может произойти в какой-то момент, рекомендуется написать специальный код для обработки ошибки, если она возникнет, и устранить ее.
Для всех остальных ошибок мы используем общий код для их устранения. Это где оператор обработки ошибок VBA вступает в игру. Они позволяют нашему приложению корректно обрабатывать любые ошибки, которые мы не ожидали.
Чтобы понять обработку ошибок, мы должны сначала понять различные типы ошибок в VBA.
Ошибки VBA
В VBA есть три типа ошибок
- Синтаксис
- Компиляция
- Время выполнения
Мы используем обработку ошибок для устранения ошибок во время выполнения. Давайте посмотрим на каждый из этих типов ошибок, чтобы было ясно, что такое ошибка во время выполнения.
Синтаксические ошибки
Некоторые примеры синтаксических ошибок
Синтаксические ошибки относятся только к одной строке. Они возникают, когда синтаксис одной строки неверен.
Примечание. Диалоговое окно «Ошибка синтаксиса» можно отключить, выбрав «Сервис» -> «Параметры» и отметив «Автосинтаксическая проверка». Строка по-прежнему будет отображаться красным цветом в случае ошибки, но диалоговое окно не появится.
Ошибки компиляции
Ошибки компиляции происходят более чем в одной строке. Синтаксис в одной строке правильный, но неверный, если учесть весь код проекта.
Примеры ошибок компиляции:
- Оператор If без соответствующего оператора End If
- For без Next
- Select без End Select
- Вызов Sub или Function, которые не существуют
- Вызов Sub или Function с неверными параметрами
- Присвоение Sub или Function того же имени, что и для модуля
- Переменные не объявлены (Option Explicit должен присутствовать в верхней части модуля)
На следующем снимке экрана показана ошибка компиляции, которая возникает, когда цикл For не имеет соответствующего оператора Next.
Использование Debug-> Compile
Чтобы найти ошибки компиляции, мы используем Debug-> Compile VBA Project из меню Visual Basic.
Когда вы выбираете Debug-> Compile, VBA отображает первую обнаруженную ошибку.
Когда эта ошибка исправлена, вы можете снова запустить Compile, и VBA найдет следующую ошибку.
Debug-> Compile также будет включать синтаксические ошибки в поиск, что очень полезно.
Если ошибок не осталось и вы запускаете Debug-> Compile, может показаться, что ничего не произошло. Однако «Компиляция» будет недоступна в меню «Отладка». Это означает, что ваше приложение не имеет ошибок компиляции в текущий момент.
Debug->Compile Error Summary
Debug-> Compile находит ошибки компиляции (проекта).
Он также найдет синтаксические ошибки.
Он находит одну ошибку каждый раз, когда вы ее используете.
Если нет ошибок компиляции, оставленная опция Компиляция будет отображаться серым цветом в меню.
Debug-> Compile Usage
Вы должны всегда использовать Debug-> Compile, прежде чем запускать свой код. Это гарантирует, что ваш код не будет иметь ошибок компиляции при запуске.
Если вы не запускаете Debug-> Compile, то VBA может обнаружить ошибки компиляции при запуске. Их не следует путать с ошибками времени выполнения.
Ошибки во время выполнения
Ошибки во время выполнения возникают, когда ваше приложение работает. Обычно они находятся вне вашего контроля, но могут быть вызваны ошибками в вашем коде.
Например, представьте, что ваше приложение читает из внешней рабочей книги. Если этот файл будет удален, то VBA отобразит ошибку, когда ваш код попытается открыть его.
Другие примеры ошибок времени выполнения
- база данных недоступна
- пользователь вводит неверные данные
- ячейка, содержащая текст вместо числа
Как мы уже видели, целью обработки ошибок является обработка ошибок времени выполнения, когда они возникают.
Ожидаемые и неожиданные ошибки
Когда мы думаем, что может произойти ошибка во время выполнения, мы помещаем код на место для ее обработки. Например, мы обычно помещаем код на место, чтобы иметь дело с файлом, который не найден.
Когда мы думаем, что в какой-то момент может произойти ошибка, рекомендуется добавить код для обработки ситуации. Мы обычно называем эти ошибки ожидаемыми.
Если у нас нет специального кода для обработки ошибки, это считается неожиданной ошибкой. Мы используем операторы обработки ошибок VBA для обработки непредвиденных ошибок.
Ошибки времени выполнения, которые не являются ошибками VBA
Прежде чем мы рассмотрим VBA Handling, мы должны упомянуть один тип ошибок. Некоторые ошибки во время выполнения не рассматриваются как ошибки VBA, а только пользователем.
Позвольте мне объяснить это на примере. Представьте, что у вас есть приложение, которое требует, чтобы вы добавили значения в переменные a и b
Допустим, вы по ошибке используете звездочку вместо знака плюс
Это не ошибка VBA. Ваш синтаксис кода является совершенно законным. Однако, с вашей точки зрения, это ошибка.
Заявление об ошибке
Как мы видели, есть два способа обработки ошибок во время выполнения
Оператор VBA On Error используется для обработки ошибок. Этот оператор выполняет некоторые действия при возникновении ошибки во время выполнения.
Есть четыре различных способа использовать это утверждение
Давайте посмотрим на каждое из этих утверждений по очереди.
On Error Goto 0
Это поведение по умолчанию VBA. Другими словами, если вы не используете On Error, это поведение вы увидите.
Давайте посмотрим на пример. В следующем коде мы не использовали строку On Error, поэтому VBA будет использовать поведение On Error Goto 0 по умолчанию.
Когда появляется ошибка, вы можете выбрать End или Debug
Если вы выберете Конец, то приложение просто остановится.
Если вы выберете Отладить, приложение остановится на строке ошибки, как показано на скриншоте ниже.
Это нормально, когда вы пишете код VBA, поскольку он показывает вам точную строку с ошибкой.
Это поведение не подходит для приложения, которое вы передаете пользователю. Эти ошибки выглядят непрофессионально и делают приложение нестабильным.
Подобная ошибка, по сути, приводит к сбою приложения. Пользователь не может продолжить работу без перезапуска приложения. Они могут вообще не использовать его, пока вы не исправите для них ошибку.
On Error Resume Next
Использование On Error Resume Next указывает VBA игнорировать ошибку и продолжать работу.
Есть конкретные случаи, когда это полезно. Большую часть времени вы должны избегать его использования.
Если мы добавим Resume Next к нашему примеру Sub, то VBA проигнорирует ошибку деления на ноль
Это не очень хорошая идея, чтобы сделать это. Если вы игнорируете ошибку, то поведение может быть непредсказуемым. Ошибка может повлиять на приложение несколькими способами. Вы можете получить неверные данные. Проблема в том, что вы не знаете, что что-то пошло не так, потому что вы подавили ошибку.
Приведенный ниже код является примером использования Resume Next.
В приведенном выше коде мы продолжаем, если есть ошибка. Затем в следующей строке мы проверяем значение переменной Outlook. Если произошла ошибка, тогда значение этой переменной будет установлено равным Nothing.
Это пример того, когда Резюме может быть полезным. Дело в том, что, хотя мы используем Resume, мы все равно проверяем наличие ошибки. Подавляющее большинство времени вам не нужно будет использовать Resume.
On Error Goto [label]
При возникновении ошибки вы отправляете ошибку на определенный ярлык. Обычно это внизу саба.
Давайте применим это к подводной лодке, которую мы использовали
Снимок экрана ниже показывает, что происходит при возникновении ошибки.
VBA переходит на метку eh, потому что мы указали это в строке «Перейти к ошибке».
Примечание 1: Метка, которую мы используем в операторе On… Goto, должна быть в текущей Sub / Function. Если нет, вы получите ошибку компиляции.
On Error Goto -1
Это утверждение отличается от других трех. Он используется для очистки текущей ошибки, а не для настройки конкретного поведения.
При возникновении ошибки с помощью функции On Error Goto [label] поведение обработки ошибки возвращается к поведению по умолчанию, т.е. On Error Goto 0 . Это означает, что если произойдет другая ошибка, код остановится на текущей строке.
Это поведение относится только к текущей подпрограмме. Как только мы выйдем из саба, ошибка будет очищена автоматически.
Посмотрите на код ниже. Первая ошибка приведет к переходу кода на метку eh. Вторая ошибка остановится на строке с ошибкой 1034.
Если мы добавим дальнейшую обработку ошибок, она не будет работать, поскольку ловушка ошибок не была очищена.
В коде ниже мы добавили строку
после того как мы поймаем первую ошибку.
Для устранения ошибки мы используем On Error Goto -1. Думайте об этом как об установке ловушки для мыши. Когда ловушка сработает, вам нужно установить ее снова.
В приведенном ниже коде мы добавляем эту строку, и вторая ошибка теперь приведет к переходу кода на метку eh_other.
Примечание 1. Вероятно, в редких случаях полезно использовать On Error Goto -1. Мне лично никогда не приходилось пользоваться этой линией. Помните, что как только вы выйдете из Sub, ошибка все равно будет очищена.
Примечание 2. у объекта Err есть член Clear. Использование Clear очищает текст и цифры в объекте Err, но НЕ сбрасывает ошибку.
Использование On Error
Как мы уже видели, VBA будет делать одну из трех вещей при возникновении ошибки:
- Остановитесь и отобразите ошибку.
- Игнорируйте ошибку и продолжайте.
- Перейти к определенной строке.
VBA всегда будет настроен на одно из этих действий. Когда вы используете On Error, VBA изменит ваше поведение и забудет о любом предыдущем.
В следующем подпункте VBA изменяет поведение ошибки каждый раз, когда мы используем оператор On Error
Err объект
При возникновении ошибки вы можете просмотреть детали ошибки, используя объект Err.
При возникновении ошибки времени выполнения VBA автоматически заполняет объект Err деталями.
Приведенный ниже код выведет «Error Number: 13 Type Mismatch», которое возникает, когда мы пытаемся поместить строковое значение в длинное целое число.
Свойство Err.Source кажется отличной идеей, но оно не работает при ошибке VBA. Источник вернет имя проекта, которое вряд ли сузит место возникновения ошибки. Однако, если вы создаете ошибку с помощью Err.Raise, вы можете установить источник самостоятельно, и это может быть очень полезно.
Получение номера строки
Функция Erl используется для возврата номера строки, где произошла ошибка.
Это часто вызывает путаницу. В следующем коде Erl вернет ноль.
Это потому, что нет номеров строк. Большинство людей не понимают этого, но VBA позволяет вам иметь номера строк.
Если мы изменим подпрограмму, указав номер строки, она теперь выведет 20.
Добавление номеров строк в код вручную затруднительно. Однако есть инструменты, которые позволят вам легко добавлять и удалять номера строк в подпрограмме.
Когда вы закончите работу над проектом и передадите его пользователю, в этот момент может быть полезно добавить номера строк. Если вы используете стратегию обработки ошибок в последнем разделе этого поста, то VBA сообщит строку, где произошла ошибка.
Использование Err.Raise
Когда мы создаем ошибку, используя Err.Raise, нам нужно присвоить ей номер. Мы можем использовать любое число от 513 до 65535 для нашей ошибки. Мы должны использовать vbObjectError с номером, например
Использование Err.Clear
Err.Clear используется для очистки текста и чисел из объекта Err.Object. Другими словами, он очищает описание и номер.
Редко вам понадобится его использовать, но давайте рассмотрим пример, где вы могли бы.
В приведенном ниже коде мы подсчитываем количество ошибок, которые могут возникнуть. Для простоты мы генерируем ошибку для каждого нечетного числа.
Мы проверяем номер ошибки каждый раз, когда проходим цикл. Если число не равно нулю, то произошла ошибка. Как только мы посчитаем ошибку, нам нужно установить номер ошибки на ноль, чтобы он был готов проверить следующую ошибку.
Логирование
Ведение журнала означает запись информации из вашего приложения, когда оно запущено. При возникновении ошибки вы можете записать детали в текстовый файл, чтобы у вас была запись об ошибке.
Код ниже показывает очень простую процедуру регистрации
Вы можете использовать это так:
Журнал не только для записи ошибок. Вы можете записывать другую информацию во время работы приложения. При возникновении ошибки вы можете проверить последовательность событий до того, как произошла ошибка.
Ниже приведен пример регистрации. То, как вы реализуете журналирование, зависит от характера приложения и его полезности.
Наличие большого количества информации при работе с ошибкой может быть очень полезным. Часто пользователь может не дать вам точную информацию об ошибке, которая произошла. Глядя на журнал, вы можете получить более точную информацию об информации.
Другие элементы, связанные с ошибками
В этом разделе рассматриваются некоторые другие инструменты обработки ошибок, которые есть в VBA. Эти элементы считаются устаревшими, но я включил их, поскольку они могут существовать в устаревшем коде.
Функция ошибки
Функция Error используется для печати описания ошибки с заданным номером ошибки. Он включен в VBA для обеспечения обратной совместимости и не нужен, поскольку вместо него можно использовать описание Err.Description.
Ниже приведены некоторые примеры
Заявление об ошибке
Заявление об ошибке позволяет имитировать ошибку. Он включен в VBA для обратной совместимости. Вместо этого вы должны использовать Err.Raise.
В следующем коде мы моделируем ошибку «Разделить на ноль».
Это утверждение включено в VBA для обратной совместимости. Вместо этого вы должны использовать Err.Raise.
Простая стратегия обработки ошибок
Со всеми различными опциями вы можете быть озадачены тем, как использовать обработку ошибок в VBA. В этом разделе я покажу вам, как реализовать простую стратегию обработки ошибок, которую вы можете использовать во всех своих приложениях.
Основная реализация
Это простой обзор нашей стратегии
- Поместите строку On Error Goto Label в начале нашего верхнего Sub.
- Поместите Label у обработки ошибок в конце нашего верхнего
Sub. - Если происходит ожидаемая ошибка, обработайте ее и продолжайте.
- Если приложение не может продолжить работу, используйте Err.Raise для перехода к метке обработки ошибок.
- В случае непредвиденной ошибки код автоматически перейдет к метке обработки ошибок.
На следующем рисунке показан обзор того, как это выглядит
Следующий код показывает простую реализацию этой стратегии
Это хороший способ реализации обработки ошибок, потому что
- Нам не нужно добавлять код обработки ошибок в каждую подпрограмму.
- Если возникает ошибка, то VBA корректно завершает работу приложения.
Полная стратегия обработки ошибок
Стратегия выше имеет один недостаток. Он не сообщает вам, где произошла ошибка. VBA не наполняет Err.Source чем-либо полезным, поэтому мы должны сделать это сами.
В этом разделе я собираюсь представить более полную стратегию ошибок. Я написал два сабвуфера, которые выполняют всю тяжелую работу, поэтому все, что вам нужно сделать, это добавить их в свой проект.
Целью этой стратегии является предоставление вам стека * и номера строки в случае возникновения ошибки.
Это наша стратегия
- Разместите обработку ошибок во всех подпрограммах.
- Когда происходит ошибка, обработчик ошибок добавляет подробности к ошибке и вызывает ее снова.
- Когда ошибка достигает самой верхней подпрограммы, она отображается.
Мы просто «всплываем» из-за ошибки. Следующая диаграмма показывает простое визуальное представление о том, что происходит, когда в Sub3 возникает ошибка
Это две вспомогательные подводные лодки
Пример использования этой стратегии
Вот простое кодирование, которое использует эти Sub. В этой стратегии мы не размещаем какой-либо код в верхнем подпрограмме. Мы только вызываем подводные лодки.
Результат выглядит так
Если в вашем проекте есть номера строк, результат будет содержать номер строки ошибки.
Примечание: вы можете получить следующую ошибку при использовании этого кода:
Читайте также: