Как исправить макрос в экселе

Excel для Microsoft 365 Excel 2021 Excel 2019 Excel 2016 Excel 2013 Excel 2010 Excel 2007 Еще…Меньше

Чтобы изменить макрос, прикрепленный к книге Microsoft Excel, используйте редактор Visual Basic.

Важно: Для работы с макросами необходимо включить вкладку Разработчик. Дополнительные сведения см. в статье Отображение вкладки «Разработчик».

Изменение параметров безопасности макросов

Чтобы редактировать и запускать макрос, необходимо установить уровень безопасности, чтобы временно включить все макрос.

  1. На вкладке Разработчик в группе Код выберите элемент Безопасность макросов.

    Группа "Код" на вкладке "Разработчик"

  2. В группе Параметры макросов выберите переключатель Включить все макросы (не рекомендуется, возможен запуск опасной программы), а затем дважды нажмите кнопку ОК.

    Предупреждение: Чтобы предотвратить запуск потенциально опасного кода, мы рекомендуем вернуться к любому параметру, который отключает все макросы после завершения работы с макросами.

Редактирование макроса

  1. На вкладке Разработчик в группе Код нажмите кнопку Макросы.

  2. В поле Имя макроса выберите макрос, который вы хотите изменить.

  3. и нажмите кнопку Изменить. Откроется редактор Visual Basic.

Совет: Чтобы получить справку во время работы в редакторе Visual Basic, в меню Справка выберите Microsoft Visual Basic Справкаили нажмите F1.

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.

В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.

В этой статье я расскажу, как можно редактировать макрос, записанный с помощью команды «Запись макроса…».

Файлы для скачивания:

Файл Описание Размер файла: Скачивания
Скачать этот файл (P_Macros_02.zip)Пример   11 Кб 1545

Давайте возьмем файл с предварительно записанным макросом или запишем новый макрос, как это сделать описано в статье «Как записать макрос не зная языка VBA?«.

Напомню, мы записывали макрос, который копирует данные из диапазона ячеек E2:E6, и вставляет их как значения в ячейки G2:G6. Допустим, у нас увеличился диапазон копирования и теперь нам нужно копировать данные из диапазона E2:E10, не переписывать же из-за этого макрос. Нам будет достаточно его отредактировать.

Итак, давайте откроем наш файл с записанным макросом, нажмем сочетания клавиш Alt+F8, должно будет открыться диалоговое окно макрос:

kak-otredaktirovat-zapisannyj-makros_2.png

В данном окне мы выбираем наш макрос «Макрос1» и нажимаем кнопку «Изменить», откроется окно редактора Visual Basic for Application, в котором мы увидим VBA-код нашего макроса:

Как отредактировать записанный макрос?

Нам необходимо перейти курсором в окно кода и поменять в строке кода Range(«E2:E6»).Select на Range(«E2:E10»).Select и закрыть редактор, после чего сохранить файл.

Sub Макрос1()
'
' Макрос1 Макрос
'
 
'
    Range("E2:E6").Select 'Надо поменять данные в этой строке
    Selection.Copy
    Range("G2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub 
Sub Макрос1()
'
' Макрос1 Макрос
'
 
'
    Range("E2:E10").Select 'Вместо ("E2:E6") написать ("E2:E10")
    Selection.Copy
    Range("G2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub

После чего наш макрос будет копировать данные уже из нового диапазона.

Добавить комментарий

Excel предусматривает огромное количество функций по автоматизации вычислений и обработки данных. Тем не менее, объем человеческих задач очень большой, и не всегда встроенного функционала достаточно. Да, даже если он очень широкий. В этих случаях ситуацию спасают макросы.

Они значительно увеличивают эффективность работы с информацией. Дело в том, что они не только помогают реализовать некоторые функции, которые отсутствуют в стандартном комплекте, но и автоматизировать часто повторяющиеся действия. Сегодня мы более детально разберемся в том, что такое макросы, как они работают и как создавать новые и редактировать старые макросы.

Содержание

  1. Что такое макрос и для чего он применяется
  2. Как создать новый макрос в Excel
  3. Способ 1. Автоматический запуск макроса
  4. Запуск выполнения макроса
  5. Корректировка макроса
  6. Способ 2. Создание макроса в ручном режиме
  7. Как изменять существующие макросы
  8. Заключение

Что такое макрос и для чего он применяется

Итак, макрос – это набор команд, которые должен выполнить Эксель. Они дают возможность автоматизировать почти любые часто повторяющиеся задачи. Достаточно просто выбрать одну команду один раз, воспользовавшись комбинацией горячих клавиш или панелью инструментов.

Макросы пишутся с помощью языка программирования VBA, но простой макрос можно записать и без него. Технически он ничем не отличается от программы, потому что содержит набор инструкций, которые компьютеру нужно выполнить. Нередко макрос сравнивается с кулинарным рецептом, где также описывается, в какой последовательности нужно выполнить какие действия, чтобы получить желаемый результат.

Но у макроса и рецепта есть одно ключевое различие. Макрос запускается один раз, после чего все остальные действия выполняет вручную. Поэтому если использовать кухонные метафоры, его проще сравнить с мультиваркой, в которую достаточно один раз положить нужные ингредиенты, после чего блюдо будет приготовлено самостоятельно.

Инструкции, которые передаются макросу, содержат макрооператоры – конкретные команды, которые офисному пакету нужно выполнить. Ряд из них являются специфическими, но большая часть соответствует командам из главного меню. Это делается для того, чтобы сделать процесс создания макросов более дружелюбным для пользователя.

Давайте приведем один пример. Любое приложение, независимо от используемой операционной системы, содержит кнопку «Закрыть». Если мы хотим сделать это через макрос, нам нужно ввести в среду разработки команду ActiveWindow.Close. Видим, что по названиям операторов можно много чего понять, поскольку все они пишутся на английском языке. Это также упрощает задачу пользователя, который знает английский язык.

Бояться макросов не нужно, поскольку VBA – очень простой язык программирования. Большую часть действий можно запрограммировать, даже не написав ни строчки кода. Достаточно просто эти действия записать один раз. При этом важно помнить, что редактор кода значительно функциональнее по сравнению с визуальными методами написания макросов.

Как создать новый макрос в Excel

Как мы уже поняли, есть два способа записи макросов в Excel: ручной или автоматический. Чтобы воспользоваться последним методом, не требуется наличие каких-либо навыков программирования. Правда, он ограничен и не дает возможности записывать условия, формировать сложные циклы и так далее.

Поэтому для профессионального овладения электронными таблицами умение программировать обязательно. Ведь нередко кроме непосредственно написания кода невозможно вообще как-либо решать поставленные задачи.

Способ 1. Автоматический запуск макроса

Перед тем, как записывать макросы, необходимо провести ряд несложных настроек, прежде всего, включить сами макросы. Правда, на данном этапе начинающего пользователя могут встретить некоторые трудности. Дело в том, что настройки макросов находятся на вкладке «Разработчик», доступ к которой изначально закрыт. Поэтому нужно сначала включить эту возможность. Последовательность действий следующая:

  1. Найти меню «Файл» и сделать по нему левый клик мышью. Как создавать, изменять и запускать макросы в Excel
  2. Далее появляется экран с набором подпунктов. Нам нужно выбрать меню «Параметры».Как создавать, изменять и запускать макросы в Excel
  3. После этого находим пункт «Настройка ленты» и ищем в нем флажок, активирующий вкладку «Разработчик».
  4. Подтверждаем свои действия путем нажатия клавиши «ОК».

После этого мы увидим вкладку «Разработчик» в нашей программе. Делаем переход по ней. Перед нами появляется большое количество инструментов разработчика. Из всего этого ассортимента нас интересует группа «Код». Там находится маленькая кнопка «Записать макрос», после клика по которой осуществляется непосредственная запись этой программы. Как создавать, изменять и запускать макросы в Excel

Далее пользователь увидит диалоговое окно. С него можно задать параметры для нашей будущей подпрограммы. Здесь доступны следующие настройки:

  1. Имя макроса. Допустимо использование какого-угодно имени за исключением того, которое начинается с числа или символа. При этом нельзя в качестве имени использовать больше одного слова.
  2. Комбинация клавиш. Это некий пусковой крючок для макроса. Он используется для того, чтобы включить макрос. Все горячие клавиши начинаются с клавиши Ctrl, а вторую можно настроить самостоятельно. Например, можно использовать горячую клавишу r. Также возможен ввод большой буквы. Для этого необходимо воспользоваться клавишей Shift, которая автоматически добавляется в комбинацию горячих клавиш.
  3. Место хранения. По умолчанию предусмотрен вариант, когда макрос применяется к текущей книге. Тем не менее, пользователь может выбрать новую или создать собственную книгу для макросов.
  4. Описание. При желании пользователь может в нескольких предложениях описать, что будет делать макрос. Это будет особенно полезно, если одной и той же книгой пользуются несколько человек.

После выполнения всех действий нужно нажать клавишу ОК, тем самым подтвердив изменения. Теперь все действия, совершаемые пользователем, будут автоматически записываться в макрос. Это будет продолжаться ровно до тех пор, пока запись программы не будет остановлена. Значительно проще разобрать это на реальном примере. Давайте сделаем программку, которая будет умножать содержимое двух ячеек. Для этого нужно запустить запись макроса, ввести в ячейку формулу (в нашем случае это =B2*B3), нажать клавишу Enter, после чего остановить запись. Кнопка остановки записи макроса находится на вкладке «Разработчик» в группе «Код».

Запуск выполнения макроса

Как же проверить, работает ли наш макрос? Для этого нужно выполнить следующие действия:

  1. Открыть вкладку «Разработчик». Там в самой левой части есть кнопка «Макросы», по которой нужно сделать левый клик мышью один раз. Кроме этого, пользователь может открыть аналогичную опцию путем нажатия горячих клавиш Alt + F8. Как создавать, изменять и запускать макросы в Excel
  2. После этого у нас откроется окно настройки макросов. Нужно выбрать тот, который мы только что создали, и нажать на кнопку «Выполнить». Этот же результат можно получить, если нажать сочетание клавиш, которое мы назначили для макроса раньше.Как создавать, изменять и запускать макросы в Excel
  3. О том, что макрос работает, мы можем судить по действиям программы. Если они повторяют те, которые были сделаны раньше, значит все ОК. Как создавать, изменять и запускать макросы в Excel

Таким способом можно проверить любой макрос. Но что делать, если оказывается, что он работает не совсем так, как нам нужно было?

Корректировка макроса

Если в ходе исполнения макроса появляются какие-то проблемы, их можно исправить. Самая распространенная проблема, по которой команды не выполняются, как надо – ошибки пользователя на этапе первичной записи команд. Чтобы отредактировать созданный макрос, нужно выполнить следующие действия.

  1. Открыть окошко макросов путем нажатия на ту же кнопку, что была описана выше или же воспользоваться комбинацией клавиш.
  2. Выбираем наш макрос. Находим кнопку «Изменить», которая находится справа от него. Делаем единичный левый клик мышью по ней.Как создавать, изменять и запускать макросы в Excel
  3. После этого откроется редактор Visual Basic. Правки придется вносить в код, поэтому если навыков программирования нет, нужно быть очень внимательным при записи макроса.

На данном этапе нужно уже немного переходить к следующей теме: ручное редактирование макроса. Любой макрос начинается командой Sub. О том, что макрос заканчивается, компьютер понимает по команде End Sub. После слова Sub показывается название макроса. После этого в структуре записывается описание макроса и та комбинация клавиш, которая необходима для его запуска.

Далее следуют команды, которые выполняют конкретные действия. Например, номер ячейки мы получаем с помощью оператора Range. В нашем примере, мы получаем ячейку B2 с помощью команды Range(“B2″).Select. Это действие аналогично выбору ячейки левой кнопкой мышки. Значение ячейки, которая выбрана на данный момент указывается с помощью оператора ActiveCell.FormulaR1C1. Как создавать, изменять и запускать макросы в Excel

Давайте попробуем наш макрос немного отредактировать. Допустим, нам нужно выполнить такую задачу: добавить дополнительную ячейку  с адресом B4 и значением 3. В таком случае в код необходимо добавить такие строки:

Range(«B4»).Select

ActiveCell.FormulaR1C1 = «3»

Как создавать, изменять и запускать макросы в Excel

На первый взгляд это может показаться довольно сложной задачей, но на самом деле, команды – это полноценный язык, который нужно просто изучить. Представьте, что вы пишете сообщение, только не человеку, а компьютеру с просьбой сделать то-то и то-то. Да, программирование именно так и устроено по факту. Все намного проще, чем кажется.

Но это уже лирическое отступление. Нам еще осталось совершить одно действие – изменить первоначальное выражение, которое касалось ячейки D2, на это: ActiveCell.FormulaR1C1 = «=RC[-2]*R[1]C[-2]*R[2]C[-2]»

Как создавать, изменять и запускать макросы в Excel

Внимание! Видим, что адреса в ячейках в данном примере записываются, как R1C1.

После того, как мы выполним все описанные выше действия, можно закрыть редактор макросов. Для этого достаточно просто кликнуть по крестику. То есть, выполнить действия, аналогичные закрытию любого окна в операционной системе.

Далее нужно перепроверить макрос еще раз. Видим, что после его исполнения в таблице появилась еще одна ячейка. Если макрос очень большой, то ручное редактирование имеет множество преимуществ перед повторной его записью. Также оно позволяет избежать повторных ошибок.

Также можно ускорить работу макроса путем добавления команды Application.ScreenUpdating = False. После этого на экране не будут показываться те промежуточные шаги, которые выполняет макрос, лишь конечный результат. Если же нужно, чтобы отображение на экране было вновь включено, тогда нужно заменить False на True.

Способ 2. Создание макроса в ручном режиме

Автоматическая запись макроса – это хорошо, но данный метод имеет множество недостатков. Профессионалы создают макросы вручную. Для этого нужно выучить язык VBA и выполнять следующие действия:

  1. Перейти во вкладку «Разработчик» и нажать на кнопку «Visual Basic». Она находится в самой левой части панели инструментов в этой вкладке. Как создавать, изменять и запускать макросы в Excel
  2. Далее появится окно, которое мы уже знаем по предыдущему разделу. Как создавать, изменять и запускать макросы в Excel
  3. Весь код пишется здесь.

Надо отметить, что все детали сегодня рассмотреть не получится, поскольку нужно знать язык VBA для этого. Тем не менее, общий механизм такой. А после того, как вы освоите язык VBA, вы сможете уже учиться и более сложным языкам программирования, поскольку логика одинаковая что для написания макроса, что для написания полноценных компьютерных программ.

Как изменять существующие макросы

Детали о том, как изменять существующие макросы, описывались выше. В целом логика остается той же самой, за тем лишь исключением, что коррекция макросов –  это точечные изменения (например, отредактировать ячейку, если случайно была выбрана неправильно). В то время как изменение –  более фундаментальное редактирование, включая добавление новых строк кода и так далее.

Заключение

Мы видим, что макросы  – это высокоэффективный инструмент, позволяющий автоматизировать огромные массивы работы. Если пользователю приходится выполнять огромное количество однотипных действий, или имеющихся возможностей Excel не хватает, они способны легко и просто исправить ситуацию.

Оцените качество статьи. Нам важно ваше мнение:

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Excel Macro is a set of actions that can be recorded, saved, used multiple times. This feature saves us a lot of time when dealing with repetitive tasks and huge data sets. We can always make changes to an existing Macro in Excel. 

    There are two ways to record and run macros: 

    1. Excel Commands 
    2. Excel Visual Basic for Applications(VBA).

    1. Copying a Macro Code

    We can reuse the existing macro code while creating new Macros. For example, if you have existing macros created using the record function, we can reuse the code to write new macros. 

    To open the code follow the below steps:

    • Select Tools –> Macros –> Visual Basic Editor.

    • Copy code from the existing macros(use Command + C) and paste(use Command + V) in the new macro

    2. Renaming a Macro

    Follow the below steps to rename a Macro in Excel:

    • Select Tools –> Macros –> Visual Basic Editor.

    • Select name on the left plane.

    • Edit the name.

    3. Deleting a Macro 

    Follow the below steps to delete a macro in Excel:

    • Select Tools –> Macros –> Macros…

    • Select the macro to be deleted.

    • Click on the minus(-) symbol at the bottom.
    • Select yes to delete the macro.

    Last Updated :
    01 Jun, 2021

    Like Article

    Save Article

    На чтение 25 мин. Просмотров 16.1k.

    VBA Error Handling

    Эта статья содержит полное руководство по обработке ошибок VBA. Если вы ищете краткое резюме, посмотрите таблицу быстрого руководства в первом разделе.

    Если вы ищете конкретную тему по обработке ошибок VBA, ознакомьтесь с приведенным ниже содержанием.

    Если вы новичок в VBA, то вы можете прочитать пост от начала до конца, так как он выложен в логическом порядке.

    Содержание

    1. Краткое руководство по обработке ошибок
    2. Введение
    3. Ошибки VBA
    4. Заявление об ошибке
    5. Err объект
    6. Логирование
    7. Другие элементы, связанные с ошибками
    8. Простая стратегия обработки ошибок
    9. Полная стратегия обработки ошибок
    10. Обработка ошибок в двух словах

    Краткое руководство по обработке ошибок

    Пункт Описание
    On Error Goto 0 При возникновении ошибки код останавливается и отображает
    ошибку.
    On Error Resume Next Игнорирует ошибку и
    продолжает.
    On Error Goto [Label] Переход к определенной метке при возникновении ошибки.
    Это позволяет нам справиться
    с ошибкой.
    Err Object При возникновении ошибки
    информация об ошибке
    сохраняется здесь.
    Err.Number Номер ошибки.
    (Полезно, только если вам
    нужно проверить, произошла ли конкретная ошибка.)
    Err.Description Содержит текст ошибки.
    Err.Source Вы можете заполнить это, когда используете Err.Raise.
    Err.Raise Функция, которая позволяет
    генерировать вашу собственную ошибку.
    Error Function Возвращает текст ошибки из
    номера ошибки.
    Вышло из употребления.
    Error Statement Имитирует ошибку. Вместо этого используйте Err.Raise.

    Введение

    Обработка ошибок относится к коду, который написан для обработки ошибок, возникающих во время работы вашего приложения. Эти ошибки обычно вызваны чем-то вне вашего контроля, например отсутствующим файлом, недоступностью базы данных, недействительными данными и т.д.

    Если мы считаем, что ошибка может произойти в какой-то
    момент, рекомендуется написать специальный код для обработки ошибки, если она
    возникнет, и устранить ее.

    Для всех остальных ошибок мы используем общий код для их
    устранения. Это где оператор обработки ошибок VBA вступает в игру. Они
    позволяют нашему приложению корректно обрабатывать любые ошибки, которые мы не
    ожидали.

    Чтобы понять обработку ошибок, мы должны сначала понять
    различные типы ошибок в VBA.

    VBA Error Handling

    Ошибки VBA

    В VBA есть три типа ошибок

    1. Синтаксис
    2. Компиляция
    3. Время выполнения

    Мы используем обработку ошибок для устранения ошибок во
    время выполнения. Давайте посмотрим на каждый из этих типов ошибок, чтобы было
    ясно, что такое ошибка во время выполнения.

    Синтаксические ошибки

    Если вы использовали VBA в течение какого-то времени, вы
    увидите синтаксическую ошибку. Когда вы набираете строку и нажимаете return,
    VBA оценивает синтаксис и, если он неверен, выдает сообщение об ошибке.

    Например, если вы введете If и забудете ключевое слово Then,
    VBA отобразит следующее сообщение об ошибке.

    VBA Error Handling

    Некоторые примеры синтаксических ошибок

    ' then отсутствует
    If a > b
    
    ' не хватает = после i
    For i 2 To 7
    
    ' отсутствует правая скобка
    b = left("АБВГ",1
    

    Синтаксические ошибки относятся только к одной строке. Они
    возникают, когда синтаксис одной строки неверен.

    Примечание. Диалоговое окно «Ошибка синтаксиса» можно отключить, выбрав «Сервис» -> «Параметры» и отметив «Автосинтаксическая проверка». Строка по-прежнему будет отображаться красным цветом в случае ошибки, но диалоговое окно не появится.

    Ошибки компиляции

    Ошибки компиляции происходят более чем в одной строке.
    Синтаксис в одной строке правильный, но неверный, если учесть весь код проекта.

    Примеры ошибок компиляции:

    • Оператор If без соответствующего оператора End If
    • For без Next
    •  Select без End Select
    • Вызов Sub или Function, которые не существуют
    • Вызов Sub или Function с неверными параметрами
    • Присвоение Sub или Function того же имени, что и для модуля
    • Переменные не объявлены (Option Explicit должен присутствовать в верхней части модуля)

    На следующем снимке экрана показана ошибка компиляции,
    которая возникает, когда цикл For не имеет соответствующего оператора Next.

    VBA Error Handling

    Использование 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 Error Handling

    Например, представьте, что ваше приложение читает из внешней
    рабочей книги. Если этот файл будет удален, то VBA отобразит ошибку, когда ваш
    код попытается открыть его.

    Другие примеры ошибок времени выполнения

    • база данных недоступна
    • пользователь вводит неверные данные
    • ячейка, содержащая текст вместо числа

    Как мы уже видели, целью обработки ошибок является обработка
    ошибок времени выполнения, когда они возникают.

    Ожидаемые и неожиданные ошибки

    Когда мы думаем, что может произойти ошибка во время
    выполнения, мы помещаем код на место для ее обработки. Например, мы обычно
    помещаем код на место, чтобы иметь дело с файлом, который не найден.

    Следующий код проверяет, существует ли файл, прежде чем он
    пытается его открыть. Если файл не существует, отображается сообщение, удобное
    для пользователя, и код выходит из подпрограммы.

    Sub OtkritFail()
        
        Dim sFile As String
        sFile = "C:ДокументыОтчет.xlsx"
        
        ' Используйте Dir, чтобы проверить, существует ли файл
        If Dir(sFile) = "" Then
            ' если файл не существует, отобразить сообщение
            MsgBox "Файл не найден" & sFile
            Exit Sub
        End If
        
        ' Код достигнет только если файл существует
        Workbooks.Open sFile
        
    End Sub
    

    Когда мы думаем, что в какой-то момент может произойти
    ошибка, рекомендуется добавить код для обработки ситуации. Мы обычно называем
    эти ошибки ожидаемыми.

    Если у нас нет специального кода для обработки ошибки, это
    считается неожиданной ошибкой. Мы используем операторы обработки ошибок VBA для
    обработки непредвиденных ошибок.

    Ошибки времени выполнения, которые не являются ошибками VBA

    Прежде чем мы рассмотрим VBA Handling, мы должны упомянуть
    один тип ошибок. Некоторые ошибки во время выполнения не рассматриваются как
    ошибки VBA, а только пользователем.

    Позвольте мне объяснить это на примере. Представьте, что у
    вас есть приложение, которое требует, чтобы вы добавили значения в переменные a
    и b

    Допустим, вы по ошибке используете звездочку вместо знака
    плюс

    Это не ошибка VBA. Ваш синтаксис кода является совершенно
    законным. Однако, с вашей точки зрения, это ошибка.

    Эти ошибки не могут быть обработаны с помощью обработки ошибок, поскольку они, очевидно, не будут генерировать никаких ошибок. Вы можете справиться с этими ошибками, используя Unit Testing and Assertions.

    Заявление об ошибке

    Как мы видели, есть два способа обработки ошибок во время
    выполнения

    1. Ожидаемые ошибки — напишите конкретный код для
      их обработки.
    2. Неожиданные ошибки — используйте операторы
      обработки ошибок VBA для их обработки.

    Оператор VBA On Error используется для обработки ошибок.
    Этот оператор выполняет некоторые действия при возникновении ошибки во время
    выполнения.

    Есть четыре различных способа использовать это утверждение

    1. On Error Goto 0 — код останавливается на строке с ошибкой и отображает сообщение.
    2. On Error Resume Next — код перемещается на следующую строку. Сообщение об ошибке не отображается.
    3. On Error Goto [label] — код перемещается на определенную строку или метку. Сообщение об ошибке не отображается. Это тот, который мы используем для обработки ошибок.
    4. On Error Goto -1 — очищает текущую ошибку.

    Давайте посмотрим на каждое из этих утверждений по очереди.

    On Error Goto 0

    Это поведение по умолчанию VBA. Другими словами, если вы не
    используете On Error, это поведение вы увидите.

    При возникновении ошибки VBA останавливается на строке с
    ошибкой и отображает сообщение об ошибке. Приложение требует вмешательства
    пользователя с кодом, прежде чем оно сможет продолжить. Это может быть
    исправление ошибки или перезапуск приложения. В этом случае обработка ошибок не
    происходит.

    Давайте посмотрим на пример. В следующем коде мы не
    использовали строку On Error, поэтому VBA будет использовать поведение On Error
    Goto 0 по умолчанию.

    Sub IspDefault()
    
        Dim x As Long, y As Long
        
        x = 6
        y = 6 / 0
        x = 7
    
    End Sub
    

    Вторая строка присваивания приводит к ошибке деления на ноль. Когда мы запустим этот код, мы получим сообщение об ошибке, показанное на скриншоте ниже.

    VBA Error Handling

    Когда появляется ошибка, вы можете выбрать End или Debug

    Если вы выберете Конец, то приложение просто остановится.

    Если вы выберете Отладить, приложение остановится на строке
    ошибки, как показано на скриншоте ниже.

    VBA Error Handling

    Это нормально, когда вы пишете код VBA, поскольку он
    показывает вам точную строку с ошибкой.

    Это поведение не подходит для приложения, которое вы
    передаете пользователю. Эти ошибки выглядят непрофессионально и делают
    приложение нестабильным.

    Подобная ошибка, по сути, приводит к сбою приложения.
    Пользователь не может продолжить работу без перезапуска приложения. Они могут
    вообще не использовать его, пока вы не исправите для них ошибку.

    Используя On Error Goto [label], мы можем дать пользователю
    более контролируемое сообщение об ошибке. Это также предотвращает остановку
    приложения. Мы можем заставить приложение работать предопределенным образом.

    On Error Resume Next

    Использование On Error Resume Next указывает VBA
    игнорировать ошибку и продолжать работу.

    Есть конкретные случаи, когда это полезно. Большую часть
    времени вы должны избегать его использования.

    Если мы добавим Resume Next к нашему примеру Sub, то VBA
    проигнорирует ошибку деления на ноль

    Sub UsingResumeNext()
    
        On Error Resume Next
        
        Dim x As Long, y As Long
        
        x = 6
        y = 6 / 0
        x = 7
    
    End Sub
    

    Это не очень хорошая идея, чтобы сделать это. Если вы
    игнорируете ошибку, то поведение может быть непредсказуемым. Ошибка может
    повлиять на приложение несколькими способами. Вы можете получить неверные
    данные. Проблема в том, что вы не знаете, что что-то пошло не так, потому что
    вы подавили ошибку.

    Приведенный ниже код является примером использования Resume
    Next.

    Sub OtprSoobsch()
    
       On Error Resume Next
       
        ' Требуется ссылка:
        ' Библиотека объектов Microsoft Outlook 15.0
        Dim Outlook As Outlook.Application
        Set Outlook = New Outlook.Application
    
        If Outlook Is Nothing Then
            MsgBox " Не удается создать сеанс Microsoft Outlook." _
                       & " Письмо не будет отправлено."
            Exit Sub
        End If
        
    End Sub
    

    В этом коде мы проверяем, доступен ли Microsoft Outlook на компьютере. Все,
    что мы хотим знать — это доступно или нет. Нас не интересует конкретная ошибка.

    В приведенном выше коде мы продолжаем, если есть ошибка.
    Затем в следующей строке мы проверяем значение переменной Outlook. Если произошла ошибка, тогда
    значение этой переменной будет установлено равным Nothing.

    Это пример того, когда Резюме может быть полезным. Дело в
    том, что, хотя мы используем Resume,
    мы все равно проверяем наличие ошибки. Подавляющее большинство времени вам не
    нужно будет использовать Resume.

    On Error Goto [label]

    Вот как мы используем обработку ошибок в VBA. Это эквивалент функциональности Try and Catch, которую вы видите на
    таких языках, как C # и
    Java.

    При возникновении ошибки вы отправляете ошибку на
    определенный ярлык. Обычно это внизу саба.

    Давайте применим это к подводной лодке, которую мы
    использовали

    Sub IspGotoLine()
    
        On Error Goto eh
        
        Dim x As Long, y As Long
        
        x = 6
        y = 6 / 0
        x = 7
        
    Done:
        Exit Sub
    eh:
        MsgBox "Произошла следующая ошибка: " & Err.Description
    End Sub
    
    

    Снимок экрана ниже показывает, что происходит при возникновении ошибки.

    VBA Error Handling

    VBA переходит на метку eh, потому что мы указали это в
    строке «Перейти к ошибке».

    Примечание 1: Метка, которую мы используем в операторе On… Goto, должна быть в текущей Sub / Function. Если нет, вы получите ошибку компиляции.

    Примечание 2: Когда возникает ошибка при использовании On Error Goto [label], обработка ошибок возвращается к поведению по умолчанию, т.е. код остановится на строке с ошибкой и отобразит сообщение об ошибке. См. Следующий раздел для получения дополнительной информации об этом.

    On Error Goto -1

    Это утверждение отличается от других трех. Он используется
    для очистки текущей ошибки, а не для настройки конкретного поведения.

    При возникновении ошибки с помощью функции On Error Goto [label] поведение обработки ошибки возвращается к поведению по умолчанию, т.е. On Error Goto 0 . Это означает, что если произойдет другая ошибка, код остановится на текущей строке.

    Это поведение относится только к текущей подпрограмме. Как
    только мы выйдем из саба, ошибка будет очищена автоматически.

    Посмотрите на код ниже. Первая ошибка приведет к переходу
    кода на метку eh. Вторая ошибка остановится на строке с ошибкой 1034.

    Sub DveOshibki()
    
        On Error Goto eh
            
        ' генерировать ошибку «Несоответствие типов»
        Error (13)
    
    Done:
        Exit Sub
    eh:
        ' генерировать «определенную приложением» ошибку
        Error (1034)
    End Sub
    

    Если мы добавим дальнейшую обработку ошибок, она не будет
    работать, поскольку ловушка ошибок не была очищена.

    В коде ниже мы добавили строку

    после того как мы поймаем первую ошибку.

    Это не имеет никакого эффекта, так как ошибка не была
    очищена. Другими словами, код остановится на строке с ошибкой и отобразит
    сообщение.

    Sub DveOshibki()
    
        On Error Goto eh
            
        ' генерировать ошибку «Несоответствие типов»
        Error (13)
    
    Done:
        Exit Sub
    eh:
        On Error Goto eh_other
        ' генерировать «определенную приложением» ошибку
        Error (1034)
    Exit Sub
    eh_other:
        Debug.Print "ehother " & Err.Description
    End Sub
    

    Для устранения ошибки мы используем On Error Goto -1.
    Думайте об этом как об установке ловушки для мыши. Когда ловушка сработает, вам
    нужно установить ее снова.

    В приведенном ниже коде мы добавляем эту строку, и вторая
    ошибка теперь приведет к переходу кода на метку eh_other.

    Sub DveOshibki()
    
        On Error Goto eh
            
        ' генерировать ошибку «Несоответствие типов»
        Error (13)
    
    Done:
        Exit Sub
    eh:
        ' явная ошибка
        On Error Goto -1
        
        On Error Goto eh_other
        ' генерировать «определенную приложением» ошибку
        Error (1034)
    Exit Sub
    eh_other:
        Debug.Print "ehother " & Err.Description
    End Sub
    

    Примечание 1. Вероятно, в редких случаях полезно использовать On Error Goto -1. Мне лично никогда не приходилось пользоваться этой линией. Помните, что как только вы выйдете из Sub, ошибка все равно будет очищена.

    Примечание 2. у объекта Err есть член Clear. Использование Clear очищает текст и цифры в объекте Err, но НЕ сбрасывает ошибку.

    Использование On Error

    Как мы уже видели, VBA будет делать одну из трех вещей при возникновении ошибки:

    • Остановитесь и отобразите ошибку.
    • Игнорируйте ошибку и продолжайте.
    • Перейти к определенной строке.

    VBA всегда будет настроен на одно из этих действий. Когда вы
    используете On Error, VBA изменит ваше поведение и забудет о любом предыдущем.

    В следующем подпункте VBA изменяет поведение ошибки каждый
    раз, когда мы используем оператор On Error

    Sub ErrorSostoyaniya()
    
        Dim x As Long
        
        ' Перейти на этикетке, если ошибка
        On Error Goto eh
        
        ' это проигнорирует ошибку в следующей строке
        On Error Resume Next
        x = 1 / 0
        
        ' это отобразит сообщение об ошибке в следующей строке
        On Error Goto 0
        x = 1 / 0
      
    Done:  
       Exit Sub
    eh:
        Debug.Print Err.Description
    End Sub
    

    Err объект

    При возникновении ошибки вы можете просмотреть детали
    ошибки, используя объект Err.

    При возникновении ошибки времени выполнения VBA
    автоматически заполняет объект Err деталями.

    Приведенный ниже код выведет «Error Number: 13 Type
    Mismatch», которое возникает, когда мы пытаемся поместить строковое значение в
    длинное целое число.

    Sub IspErr()
    
        On Error Goto eh
        
        Dim total As Long
        total = "aa"
    
    Done:
        Exit Sub
    eh:
        Debug.Print "Номер ошибки: " & Err.Number _
                & " " & Err.Description
    End Sub
    
    

    Err.Description предоставляет подробную информацию об ошибке, которая происходит. Это текст, который вы обычно видите, когда возникает ошибка, например, «Несоответствие типов»

    Err.Number — это идентификационный номер ошибки, например, номер ошибки для «Несоответствие типов» — 13. Единственное время, когда вам действительно нужно это, если вы проверяете, что произошла конкретная ошибка, и это необходимо только в редких случаях.

    Свойство Err.Source кажется отличной идеей, но оно не работает при ошибке VBA. Источник вернет имя проекта, которое вряд ли сузит место возникновения ошибки. Однако, если вы создаете ошибку с помощью Err.Raise, вы можете установить источник самостоятельно, и это может быть очень полезно.

    Получение номера строки

    Функция Erl используется для возврата номера строки, где
    произошла ошибка.

    Это часто вызывает путаницу. В следующем коде Erl вернет ноль.

    Sub IspErr()
    
        On Error Goto eh
        
        Dim val As Long
        val = "aa"
    
    Done:
        Exit Sub
    eh:
        Debug.Print Erl
    End Sub
    

    Это потому, что нет номеров строк. Большинство людей не
    понимают этого, но VBA позволяет вам иметь номера строк.

    Если мы изменим подпрограмму, указав номер строки, она теперь выведет 20.

    Sub IspErr()
    
    10        On Error Goto eh
              
              Dim val As Long
    20        val = "aa"
    
    Done:
    30        Exit Sub
    eh:
    40        Debug.Print Erl
    End Sub
    

    Добавление номеров строк в код вручную затруднительно.
    Однако есть инструменты, которые позволят вам легко добавлять и удалять номера
    строк в подпрограмме.

    Когда вы закончите работу над проектом и передадите его
    пользователю, в этот момент может быть полезно добавить номера строк. Если вы
    используете стратегию обработки ошибок в последнем разделе этого поста, то VBA
    сообщит строку, где произошла ошибка.

    Использование Err.Raise

    Err.Raise позволяет нам создавать ошибки. Мы можем
    использовать его для создания пользовательских ошибок для нашего приложения,
    что очень полезно. Это эквивалент оператора Throw в Java C #.

    Формат следующий

    Err.Raise [error number], [error source], [error description]
    

    Давайте посмотрим на простой пример. Представьте, что мы
    хотим убедиться, что в ячейке есть запись длиной 5 символов. Мы могли бы иметь конкретное сообщение для
    этого

    Public Const ERROR_INVALID_DATA As Long = vbObjectError + 513
    
    Sub ReadWorksheet()
    
        On Error Goto eh
        
        If Len(Sheet1.Range("A1")) <> 5 Then
            Err.Raise ERROR_INVALID_DATA, "ReadWorksheet" _
                , "Значение в ячейке A1 должно иметь ровно 5 символов."
        End If
        
        ' продолжить, если ячейка имеет действительные данные
        Dim id As String
        id = Sheet1.Range("A1")
        
    
    Done:
        Exit Sub
    eh:
        ' Err.Raise отправит код сюда
        MsgBox " Обнаружена ошибка: " & Err.Description
    End Sub
    

    Когда мы создаем ошибку, используя Err.Raise, нам нужно присвоить ей номер. Мы можем использовать любое
    число от 513 до 65535 для нашей ошибки. Мы должны использовать vbObjectError с номером,
    например

    Err.Raise vbObjectError + 513
    

    Использование Err.Clear

    Err.Clear используется для очистки текста и чисел из объекта
    Err.Object. Другими словами, он очищает описание и номер.

    Редко вам понадобится его использовать, но давайте
    рассмотрим пример, где вы могли бы.

    В приведенном ниже коде мы подсчитываем количество ошибок,
    которые могут возникнуть. Для простоты мы генерируем ошибку для каждого
    нечетного числа.

    Мы проверяем номер ошибки каждый раз, когда проходим цикл.
    Если число не равно нулю, то произошла ошибка. Как только мы посчитаем ошибку,
    нам нужно установить номер ошибки на ноль, чтобы он был готов проверить
    следующую ошибку.

    Sub IspErrClear()
    
        Dim count As Long, i As Long
    
        ' Продолжите, если ошибка, так как мы проверим номер ошибки
        On Error Resume Next
        
        For i = 0 To 9
            ' генерировать ошибку для каждого второго
            If i Mod 2 = 0 Then Error (13)
            
            ' Проверьте на ошибку
            If Err.Number <> 0 Then
                count = count + 1
                Err.Clear    ' Очистить Err, как только он считается
            End If
        Next
    
        Debug.Print " Количество ошибок было: " & count
    End Sub
    

    Примечание: Err.Clear сбрасывает текст и цифры в объекте ошибки, но не очищает ошибку — см. On Error Goto -1 для получения дополнительной информации об очистке фактической ошибки.

    Логирование

    Ведение журнала означает запись информации из вашего
    приложения, когда оно запущено. При возникновении ошибки вы можете записать
    детали в текстовый файл, чтобы у вас была запись об ошибке.

    Код ниже показывает очень простую процедуру регистрации

    Sub Logger(sType As String, sSource As String, sDetails As String)
        
        Dim sFilename As String
        sFilename = "C:templogging.txt"
        
        ' Архивный файл определенного размера
        If FileLen(sFilename) > 20000 Then
            FileCopy sFilename _
                , Replace(sFilename, ".txt", Format(Now, "ddmmyyyy hhmmss.txt"))
            Kill sFilename
        End If
        
        ' Откройте файл для записи
        Dim filenumber As Variant
        filenumber = FreeFile 
        Open sFilename For Append As #filenumber
        
        Print #filenumber, CStr(Now) & "," & sType & "," & sSource _
                                    & "," & sDetails & "," & Application.UserName
        
        Close #filenumber
        
    End Sub
    

    Вы можете использовать это так:

    ' Создать уникальный номер ошибки
    Public Const ERROR_DATA_MISSING As Long = vbObjectError + 514
    
    Sub CreateReport()
    
        On Error Goto eh
        
        If Sheet1.Range("A1") = "" Then
           Err.Raise ERROR_DATA_MISSING, "CreateReport", "Данные отсутствуют в ячейке A1"
        End If
    
        ' другой код здесь
    Done:
        Exit Sub
    eh:
        Logger "Error", Err.Source, Err.Description
    End Sub
    

    Журнал не только для записи ошибок. Вы можете записывать
    другую информацию во время работы приложения. При возникновении ошибки вы
    можете проверить последовательность событий до того, как произошла ошибка.

    Ниже приведен пример регистрации. То, как вы реализуете
    журналирование, зависит от характера приложения и его полезности.

    Sub ReadingData()
        
        Logger "Information", "ReadingData()", "Starting to read data."
           
        Dim coll As New Collection
        ' Read data
        Set coll = ReadData
        
        If coll.Count < 10 Then
            Logger "Warning", "ReadingData()", "Number of data items is low."
        End If
        Logger "Information", "ReadingData()", "Number of data items is " & coll.Count
        
        Logger "Information", "ReadingData()", "Finished reading data."
    
    End Sub
    

    Наличие большого количества информации при работе с ошибкой
    может быть очень полезным. Часто пользователь может не дать вам точную информацию
    об ошибке, которая произошла. Глядя на журнал, вы можете получить более точную
    информацию об информации.

    Другие элементы, связанные с ошибками

    В этом разделе рассматриваются некоторые другие инструменты
    обработки ошибок, которые есть в VBA. Эти элементы считаются устаревшими, но я
    включил их, поскольку они могут существовать в устаревшем коде.

    Функция ошибки

    Функция Error используется для печати описания ошибки с
    заданным номером ошибки. Он включен в VBA для обеспечения обратной
    совместимости и не нужен, поскольку вместо него можно использовать описание
    Err.Description.

    Ниже приведены некоторые примеры

    ' Распечатать текст «Деление на ноль»
    Debug.Print Error(11)
    ' Распечатать текст "Несоответствие типов"
    Debug.Print Error(13)
    ' Распечатать текст "Файл не найден"
    Debug.Print Error(53)
    

    Заявление об ошибке

    Заявление об ошибке позволяет имитировать ошибку. Он включен
    в VBA для обратной совместимости. Вместо этого вы должны использовать
    Err.Raise.

    В следующем коде мы моделируем ошибку «Разделить на ноль».

    Sub ZayavlObOshibke()
    
        On Error Goto eh
            
        ' Это создаст деление на ноль ошибок
        Error 11
        
        Exit Sub
    eh:
        Debug.Print Err.Number, Err.Description
    End Sub
    
    

    Это утверждение включено в VBA для обратной совместимости.
    Вместо этого вы должны использовать Err.Raise.

    Простая стратегия обработки ошибок

    Со всеми различными опциями вы можете быть озадачены тем,
    как использовать обработку ошибок в VBA. В этом разделе я покажу вам, как
    реализовать простую стратегию обработки ошибок, которую вы можете использовать
    во всех своих приложениях.

    Основная реализация

    Это простой обзор нашей стратегии

    1. Поместите строку On Error Goto Label  в начале нашего верхнего Sub.
    2. Поместите Label у обработки ошибок в конце нашего верхнего
      Sub.
    3. Если происходит ожидаемая ошибка, обработайте ее и продолжайте.
    4. Если приложение не может продолжить работу, используйте Err.Raise для перехода к метке обработки ошибок.
    5. В случае непредвиденной ошибки код автоматически перейдет к метке обработки ошибок.

    На следующем рисунке показан обзор того, как это выглядит

    error-handling

    Следующий код показывает простую реализацию этой стратегии

    Public Const ERROR_NO_ACCOUNTS As Long = vbObjectError + 514
    
    Sub BuildReport()
    
        On Error Goto eh
        
        ' Если ошибка в ReadAccounts, то перейти к ошибке
        ReadAccounts
        
        ' Сделай что-нибудь с кодом
        
    Done:
        Exit Sub
    eh:
        ' Все ошибки будут прыгать сюда
        MsgBox Err.Source & ": Произошла следующая ошибка  " & Err.Description
    End Sub
    
    Sub ReadAccounts()
        
        ' ОЖИДАЕМАЯ ОШИБКА - Может обрабатываться кодом
        ' Приложение может обрабатывать A1 равным нулю
        If Sheet1.Range("A1") = 0 Then
            Sheet1.Range("A1") = 1
        End If
        
        ' ОЖИДАЕМАЯ ОШИБКА - не может быть обработана кодом
        ' Приложение не может быть продолжено, если нет учетной записи
        If Dir("C:ДокументыОтчет.xlsx") = "" Then
            Err.Raise ERROR_NO_ACCOUNTS, "UsingErr" _
                    , "There are no accounts present for this month."
        End If
    
        ' НЕОЖИДАННАЯ ОШИБКА - не может быть обработана кодом
        ' Если ячейка B3 содержит текст, мы получим ошибку несоответствия типов
        Dim total As Long
        total = Sheet1.Range("B3")
        
        
        ' продолжить и читать счета
        
    End Sub
    

    Это хороший способ реализации обработки ошибок, потому что

    • Нам не нужно добавлять код обработки ошибок в
      каждую подпрограмму.
    • Если возникает ошибка, то VBA корректно
      завершает работу приложения.

    Полная стратегия обработки ошибок

    Стратегия выше имеет один недостаток. Он не сообщает вам,
    где произошла ошибка. VBA не наполняет Err.Source чем-либо полезным, поэтому мы
    должны сделать это сами.

    В этом разделе я собираюсь представить более полную
    стратегию ошибок. Я написал два сабвуфера, которые выполняют всю тяжелую
    работу, поэтому все, что вам нужно сделать, это добавить их в свой проект.

    Целью этой стратегии является предоставление вам стека * и
    номера строки в случае возникновения ошибки.

    * Стек — это список вспомогательных функций, которые
    использовались в данный момент при возникновении ошибки.

    Это наша стратегия

    1. Разместите обработку ошибок во всех
      подпрограммах.
    2. Когда происходит ошибка, обработчик ошибок
      добавляет подробности к ошибке и вызывает ее снова.
    3. Когда ошибка достигает самой верхней
      подпрограммы, она отображается.

    Мы просто «всплываем» из-за ошибки. Следующая диаграмма
    показывает простое визуальное представление о том, что происходит, когда в Sub3
    возникает ошибка

    Error Handling – bubbling

    Единственная грязная часть этого — правильное форматирование
    строк. Я написал две подводные лодки, которые справляются с этим, поэтому он
    позаботится о вас.

    Это две вспомогательные подводные лодки

    Option Explicit
    
    Public Const MARKER As String = "NOT_TOPMOST"
    
    ' Вызывает ошибку и добавляет номер строки и имя текущей процедуры
    Sub RaiseError(ByVal errorno As Long, ByVal src As String _
                    , ByVal proc As String, ByVal desc As String, ByVal lineno As Long)
        
        Dim sLineNo As Long, sSource As String
        
        ' Если маркера нет, тогда RaiseError вызывается впервые.
        If Left(src, Len(MARKER)) <> MARKER Then
    
            ' Добавить номер строки ошибки, если она есть
            If lineno <> 0 Then
                sSource = vbCrLf & "Line no: " & lineno & " "
            End If
       
            ' Добавить маркер и процедуру к источнику
            sSource = MARKER & sSource & vbCrLf & proc
            
        Else
            ' Если ошибка уже возникла, просто добавьте имя процедуры
            sSource = src & vbCrLf & proc
        End If
        
        ' Если код останавливается здесь, убедитесь, что DisplayError находится в верхней части Sub
        Err.Raise errorno, sSource, desc
        
    End Sub
    
    ' Отображает ошибку, когда она достигает самого верхнего sub
    ' Примечание: вы можете добавить вызов для входа из этого подпункта
    Sub DisplayError(ByVal src As String, ByVal desc As String _
                        , ByVal sProcname As String)
    
        ' Удалить маркер
        src = Replace(src, MARKER, "")
        
        Dim sMsg As String
        sMsg = " Произошла следующая ошибка: " & vbCrLf & Err.Description _
                        & vbCrLf & vbCrLf & " Расположение ошибки: "
        
        sMsg = sMsg + src & vbCrLf & sProcname
        
        ' Показать сообщение
        MsgBox sMsg, Title:="Ошибка "
        
    End Sub
    
    

    Пример использования этой стратегии

    Вот простое кодирование, которое использует эти Sub. В этой стратегии мы не размещаем какой-либо код в верхнем подпрограмме. Мы только вызываем подводные лодки.

    Sub Topmost()
    
        On Error Goto EH
        
        Level1
    
    Done:
        Exit Sub
    EH:
        DisplayError Err.source, Err.Description, "Module1.Topmost"
    End Sub
    
    Sub Level1()
    
        On Error Goto EH
        
        Level2
    
    Done:
        Exit Sub
    EH:
       RaiseError Err.Number, Err.source, "Module1.Level1", Err.Description, Erl
    End Sub
    
    Sub Level2()
    
        On Error Goto EH
        
        ' Ошибка здесь
        Dim a As Long
        a = "7 / 0"
    
    Done:
        Exit Sub
    EH:
        RaiseError Err.Number, Err.source, "Module1.Level2", Err.Description, Erl
    End Sub
    

    Результат выглядит так

    error handling output

    Если в вашем проекте есть номера строк, результат будет содержать номер строки ошибки.

    error handling output line

    Примечание: вы можете получить следующую ошибку при использовании этого кода:

    “Programmatic Access to Visual Basic Project is not trusted”

    Чтобы решить эту проблему, выполните следующие действия.

    1. Перейдите в раздел «Разработчик» на ленте и
      нажмите «Macro Security», которая находится под кодом.
    2. Нажмите «Настройка макроса» в левом списке.
    3. Поставьте флажок в поле «Доверительный доступ к
      объектной модели проекта VBA».
    4. Нажмите Ok.

    Обработка ошибок в двух словах

    • Обработка ошибок используется для обработки ошибок, возникающих во время работы приложения.
    • Вы пишете определенный код для обработки ожидаемых ошибок. Вы используете оператор обработки ошибок VBA
      On Error Goto [label] для отправки VBA на метку при возникновении непредвиденной ошибки.
    • Вы можете получить подробную информацию об ошибке из Err.Description.
    • Вы можете создать свою собственную ошибку, используя Err.Raise.
    • Использование одного оператора On Error в самой верхней подпрограмме перехватит все ошибки в подпрограммах, которые вызываются отсюда.
    • Если вы хотите записать имя Sub с ошибкой, вы можете обновить ошибку и сбросить ее.
    • Вы можете использовать журнал для записи информации о приложении, когда оно запущено.

    Понравилась статья? Поделить с друзьями:
  • Как найти площадь параллелепипеда через высоту
  • Как найти длину волны в дифракции
  • Как найти поставщика для своего бизнеса
  • Пожалуйста сопоставьте watch call x8 pro как исправить
  • Как составить продаваемое коммерческое предложение