Ошибка 438 в vba excel
У меня есть следующий код в VBA, который я пишу в MS Project, который вызывает электронную таблицу Excel. Я обновил библиотеки времени выполнения v15 для Project, Excel и Officeв этом порядке. Когда я запускаю его, он не компилируется из-за ошибки 438 объект не поддерживает это свойство или метод.
Прежде всего, вы должны знать, что некоторые функции, используемые на рабочем листе, имеют ограничения. Поэтому я хочу сказать, что избегайте их использования в VBA, если в этом нет необходимости.
Например, функция POWER() возвращает ошибку при попытке поднять нуль до нуля. Альтернативой является использование комбинации 0 ^ 0 , которая делает то же самое, но выглядит более просто и работает без такой ошибки.
Но также в VBA нет встроенной альтернативы функции FACT() , поэтому вы можете использовать ее или просто добавить свой собственный function factor() - это ваш выбор.
Если вы только начали изучать VBA, я бы рекомендовал вам использовать Option Explicit . Это поможет вам выяснить, какие переменные не определены, а иногда и избежать ошибок, связанных с пропуском имен переменных.
Вот ваш код, исправленный и немного оптимизированный:
ОБНОВЛЕНИЕ
Вот несколько примеров факторных расчетов.
Удачи в ваших дальнейших действиях VBA!
Я новичок в VBA, и у меня есть следующий код. Я хочу суммировать в переменной SumDef значения всех текстовых полей в фрейме пользовательской формы, если textbox не является пустым. Но я получаю Ошибка времени выполнения 438: объект не поддерживает это свойство или метод Private Sub.
Я пытаюсь написать код, чтобы открыть файл PPTX из excel VBA и обновить ссылки в ppt. ниже приведен код, который у меня есть, но в то время как код пытается обновить ссылки, я получаю Ошибка времени выполнения 438 объект не поддерживает это свойство или метод Sub kunal() Dim PPObj As Object Set.
Я не могу найти метод pow для объекта WorksheetFunction . Однако существует метод Power . Возможно, вы это имели в виду?
Похожие вопросы:
Пожалуйста, помогите отладить: Ошибка времени выполнения '438' объект не поддерживает это свойство или метод Я не уверен, почему моя функция ConvertToStdDateFormat (InputRange As Range) не принимает.
Я не знаю, почему он дает мне '438' - object не поддерживает это свойство или ошибку метода в строке функции Sumif. Как я могу выполнить функцию sumif в VBA.
отвечая на мой собственный вопрос здесь. Я проделал некоторую работу с JSON в Excel VBA и много выводов для публикации, которые я сделаю в формате Q & A.
У меня есть следующий код в VBA, который я пишу в MS Project, который вызывает электронную таблицу Excel. Я обновил библиотеки времени выполнения v15 для Project, Excel и Officeв этом порядке. Когда.
Я новичок в VBA, и у меня есть следующий код. Я хочу суммировать в переменной SumDef значения всех текстовых полей в фрейме пользовательской формы, если textbox не является пустым. Но я получаю.
Я пытаюсь написать код, чтобы открыть файл PPTX из excel VBA и обновить ссылки в ppt. ниже приведен код, который у меня есть, но в то время как код пытается обновить ссылки, я получаю Ошибка времени.
Ниже приведен мой код. Весь код работает, но я получаю ошибку 438 объект не поддерживает это свойство или метод vba в этой строке. i.offset(-7,-8).вставить Sub insert_6_rows() Dim rActive As Range.
Я пытаюсь вызвать публичный макрос, хранящийся в ThisOutlookSession, из макроса excel. outlook открыт в любое время. Я нашел следующее: Звоните outlook VBA из Excel Мой код excel: Set myOutlookApp =.
«Excel Error 438» обычно является ошибкой (ошибкой), обнаруженных во время выполнения. Разработчики программного обеспечения, такие как Microsoft Corporation, обычно принимают Microsoft Excel через несколько уровней отладки, чтобы сорвать эти ошибки перед выпуском для общественности. Ошибки, такие как ошибка 438, иногда удаляются из отчетов, оставляя проблему остается нерешенной в программном обеспечении.
Что запускает ошибку времени выполнения 438?
Сбой устройства или Microsoft Excel обычно может проявляться с «Excel Error 438» в качестве проблемы во время выполнения. Рассмотрим распространенные причины ошибок ошибки 438 во время выполнения:
Ошибка 438 Crash - Ошибка 438 остановит компьютер от выполнения обычной программной операции. Это возникает, когда Microsoft Excel не реагирует на ввод должным образом или не знает, какой вывод требуется взамен.
Утечка памяти «Excel Error 438» - ошибка 438 утечка памяти приводит к увеличению размера Microsoft Excel и используемой мощности, что приводит к низкой эффективности систем. Потенциальные триггеры могут быть «бесконечным циклом», или когда программа выполняет «цикл» или повторение снова и снова.
Error 438 Logic Error - Ошибка программной логики возникает, когда, несмотря на точный ввод от пользователя, производится неверный вывод. Он материализуется, когда исходный код Microsoft Corporation ошибочен из-за неисправного дизайна.
Microsoft Corporation проблемы файла Excel Error 438 в большинстве случаев связаны с повреждением, отсутствием или заражением файлов Microsoft Excel. Как правило, самый лучший и простой способ устранения ошибок, связанных с файлами Microsoft Corporation, является замена файлов. Запуск сканирования реестра после замены файла, из-за которого возникает проблема, позволит очистить все недействительные файлы Excel Error 438, расширения файлов или другие ссылки на файлы, которые могли быть повреждены в результате заражения вредоносным ПО.
Типичные ошибки Excel Error 438
Типичные ошибки Excel Error 438, возникающие в Microsoft Excel для Windows:
- "Ошибка приложения Excel Error 438."
- "Excel Error 438 не является приложением Win32."
- «Извините, Excel Error 438 столкнулся с проблемой. «
- «Excel Error 438 не может быть найден. «
- "Excel Error 438 не найден."
- "Ошибка запуска программы: Excel Error 438."
- «Excel Error 438 не работает. «
- «Excel Error 438 остановлен. «
- «Неверный путь к программе: Excel Error 438. «
Корень проблем Excel Error 438
Проблемы Excel Error 438 могут быть отнесены к поврежденным или отсутствующим файлам, содержащим ошибки записям реестра, связанным с Excel Error 438, или к вирусам / вредоносному ПО.
у меня есть следующий код:
Однако когда я запускаю скрипт ниже он перестает работать на :
кто-нибудь знает, почему есть исключение?
1 Ответ
У вас есть несколько проблем
Ниже приведен пример кода для адаптации
Следовать за
Да, вы могли бы использовать
но я думаю, что Find чище, т. е.
Похожие вопросы:
Я пытаюсь запустить этот макрос, чтобы переместить вложение email из папки в моем почтовом ящике (называемом toolkit downloads) в папку на моем рабочем столе и переименовать вложение. Я получаю.
Я пытаюсь вызвать публичный макрос, хранящийся в ThisOutlookSession, из макроса excel. outlook открыт в любое время. Я нашел следующее: Звоните outlook VBA из Excel Мой код excel: Set myOutlookApp =.
У меня есть этот код, в котором мне немного помогли, но я столкнулся с проблемой или с тем, что я считаю проблемой. В последнем поиске мне говорят, что объект не поддерживает это свойство или метод.
У меня есть следующий код в VBA я пишу в MS Project, который вызывает Excel spread sheet. Я перенастроил librays среды выполнения v15 для Project, Excel и Officein в этом порядке. Когда я запускаю.
Я новичок в VBA и у меня есть следующий код. Я хочу суммировать в переменной SumDef значения всех текстовых полей в кадре пользовательской формы, если textbox не является пустым. Но я получаю ошибка.
Ошибка 438 excel
Question
I have an Office 2007 Excel workbook which has some TextBoxes on the spreadsheet and some VBA code that access the TextBox.Text property. This workbook has been working for years, and still works for me if I open it with Office 2007 Excel, but if I open it with Office 2010 Excel, a VBA error dialogbox pops up:
if I click [Debug] button on the dialog, the debugger highlights a line that assigns an empty string to the TextBox:
I already deleted all the .EXD files on the computer by doing a search from the c: root
- Edited by e_man_online Friday, February 13, 2015 12:52 AM
Answers
Have your tried to use the tool provide in KB3025036 to fix this issue?
Do you have all of the latest updates installed on both machines?
We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
Click HERE to participate the survey.
- Proposed as answer by L.Hl Moderator Tuesday, February 24, 2015 8:10 AM
- Marked as answer by Fei Xue Microsoft employee, Moderator Monday, March 2, 2015 1:36 PM
All replies
I still suspect that the update is the problem. What version of windows are you using? If win 7 then try the following.
Ensure you have all office programs closed. Can close any other programs that are not required but not essential.
Click the Windows colored ball bottom left of screen.
In the Search programs and files box enter the following and then press Enter.
Select all of the files and folders and then delete.
If you get a message re unable to delete any of them because of Admin permission or in use etc (and you will probably get quite a few) then just click the Skip button.
I did as instructed by OssieMac, but the problem persists.
Any help will be appreciated. TIA
Have your tried to use the tool provide in KB3025036 to fix this issue?
Do you have all of the latest updates installed on both machines?
We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
Click HERE to participate the survey.
- Proposed as answer by L.Hl Moderator Tuesday, February 24, 2015 8:10 AM
- Marked as answer by Fei Xue Microsoft employee, Moderator Monday, March 2, 2015 1:36 PM
Jeffrey was right. The old laptop had a ton of updates, but when infrastructure set up the new laptop they just installed Office 10 w/o any updates. Nobody foresaw that installing a brand new software out of the box would break an essential component, like the Office forms or VBA code. So after almost 1000 MB of updates, the VBA code started to run as expected w/o errors.
Thanks to Jeffrey and OsieMac for your help
Совместима с Windows 2000, XP, Vista, 7, 8 и 10
Признаки ошибки 438
Причины ошибки 438
- Поврежденная загрузка или неполная установка программного обеспечения Microsoft Excel.
- Повреждение реестра Microsoft Excel из-за недавнего изменения программного обеспечения (установка или удаление), связанного с Microsoft Excel.
- Вирус или вредоносное ПО, которые повредили файл Windows или связанные с Microsoft Excel программные файлы.
- Другая программа злонамеренно или по ошибке удалила файлы, связанные с Microsoft Excel.
Ошибки во время выполнения в базе знаний
star rating here
Ниже описана последовательность действий по устранению ошибок, призванная решить проблемы Ошибка 438. Данная последовательность приведена в порядке от простого к сложному и от менее затратного по времени к более затратному, поэтому мы настоятельно рекомендуем следовать данной инструкции по порядку, чтобы избежать ненужных затрат времени и усилий.
Пожалуйста, учтите: Нажмите на изображение [ ] , чтобы развернуть инструкции по устранению проблем по каждому из шагов ниже. Вы также можете использовать изображение [ ], чтобы скрывать инструкции по мере их выполнения.
Шаг 1: Восстановить записи реестра, связанные с ошибкой 438
Редактирование реестра Windows вручную с целью удаления содержащих ошибки ключей Ошибка 438 не рекомендуется, если вы не являетесь специалистом по обслуживанию ПК. Ошибки, допущенные при редактировании реестра, могут привести к неработоспособности вашего ПК и нанести непоправимый ущерб вашей операционной системе. На самом деле, даже одна запятая, поставленная не в том месте, может воспрепятствовать загрузке компьютера!
Предупреждение: Если вы не являетесь опытным пользователем ПК, мы НЕ рекомендуем редактирование реестра Windows вручную. Некорректное использование Редактора реестра может привести к серьезным проблемам и потребовать переустановки Windows. Мы не гарантируем, что неполадки, являющиеся результатом неправильного использования Редактора реестра, могут быть устранены. Вы пользуетесь Редактором реестра на свой страх и риск.
Перед тем, как вручную восстанавливать реестр Windows, необходимо создать резервную копию, экспортировав часть реестра, связанную с Ошибка 438 (например, Microsoft Excel):
Следующие шаги при ручном редактировании реестра не будут описаны в данной статье, так как с большой вероятностью могут привести к повреждению вашей системы. Если вы хотите получить больше информации о редактировании реестра вручную, пожалуйста, ознакомьтесь со ссылками ниже.
Ошибка 438 excel
Question
I have an Office 2007 Excel workbook which has some TextBoxes on the spreadsheet and some VBA code that access the TextBox.Text property. This workbook has been working for years, and still works for me if I open it with Office 2007 Excel, but if I open it with Office 2010 Excel, a VBA error dialogbox pops up:
if I click [Debug] button on the dialog, the debugger highlights a line that assigns an empty string to the TextBox:
I already deleted all the .EXD files on the computer by doing a search from the c: root
- Edited by e_man_online Friday, February 13, 2015 12:52 AM
Answers
Have your tried to use the tool provide in KB3025036 to fix this issue?
Do you have all of the latest updates installed on both machines?
We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
Click HERE to participate the survey.
- Proposed as answer by L.Hl Moderator Tuesday, February 24, 2015 8:10 AM
- Marked as answer by Fei Xue Microsoft employee, Moderator Monday, March 2, 2015 1:36 PM
All replies
I still suspect that the update is the problem. What version of windows are you using? If win 7 then try the following.
Ensure you have all office programs closed. Can close any other programs that are not required but not essential.
Click the Windows colored ball bottom left of screen.
In the Search programs and files box enter the following and then press Enter.
Select all of the files and folders and then delete.
If you get a message re unable to delete any of them because of Admin permission or in use etc (and you will probably get quite a few) then just click the Skip button.
Читать еще: Как подсчитать количество столбцов в excelI did as instructed by OssieMac, but the problem persists.
Any help will be appreciated. TIA
Have your tried to use the tool provide in KB3025036 to fix this issue?
Do you have all of the latest updates installed on both machines?
We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
Click HERE to participate the survey.
- Proposed as answer by L.Hl Moderator Tuesday, February 24, 2015 8:10 AM
- Marked as answer by Fei Xue Microsoft employee, Moderator Monday, March 2, 2015 1:36 PM
Jeffrey was right. The old laptop had a ton of updates, but when infrastructure set up the new laptop they just installed Office 10 w/o any updates. Nobody foresaw that installing a brand new software out of the box would break an essential component, like the Office forms or VBA code. So after almost 1000 MB of updates, the VBA code started to run as expected w/o errors.
Thanks to Jeffrey and OsieMac for your help
Рассмотрим несколько наиболее часто встречающихся ошибок.
Если эта ошибка появляется в надстройке Parser — ознакомьтесь с этой инструкцией
В этом случае, удалите файл надстройки, и заново скачайте последнюю версию со страницы программы.
При выполнении макросов Excel могут возникнуть ошибки, которые в VBA делят на три категории:
Далее мы поговорим о каждом из трёх типов ошибок VBA подробно.
Ошибки компиляции
Компилятор VBA рассматривает ошибки компиляции как недопустимые и выделяет их в коде ещё до того, как дело дойдёт до запуска макроса.
Ошибки выполнения
В случае если код сложнее, чем в нашем примере, то, чтобы получить больше информации о причине возникновения ошибки VBA, можно проверить значения используемых переменных. В редакторе VBA для этого достаточно навести указатель мыши на имя переменной, или можно открыть окно отслеживания локальных переменных (в меню редактора View > Locals Window).
Коды различных ошибок выполнения расшифрованы на сайте Microsoft Support (на английском). Наиболее часто встречающиеся ошибки VBA перечислены в этой таблице:
Перехват ошибок выполнения
Не все ошибки выполнения бывают вызваны недочётами в коде. Например, ошибки VBA не удастся избежать, если для работы макроса необходимо открыть файл с данными, а этого файла не существует. В таких случаях признаком профессионализма будет перехват ошибок и написание кода VBA, который будет выполняться при их возникновении. Таким образом, вместо неприятных сбоев будет происходить изящное завершение работы макроса.
В этом коде производится попытка открыть файл Excel с именем Data. Если файл не найден, то пользователю будет предложено поместить этот файл в нужную папку. После того, как пользователь сделает это и нажмёт ОК, выполнение кода продолжится, и попытка открыть этот файл повторится. При желании вместо попытки открыть нужный файл, выполнение процедуры Sub может быть прервано в этом месте при помощи команды Exit Sub.
Логические ошибки
Например, при создании макроса в процедуре случайно были просуммированы не те переменные, которые требовалось просуммировать. Результат будет ошибочным, но макрос будет продолжать выполняться до завершения.
Эта статья содержит полное руководство по обработке ошибок 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. В этой стратегии мы не размещаем какой-либо код в верхнем подпрограмме. Мы только вызываем подводные лодки.
Результат выглядит так
Если в вашем проекте есть номера строк, результат будет содержать номер строки ошибки.
Примечание: вы можете получить следующую ошибку при использовании этого кода:
Читайте также: