Доброго всем! Капитально подвис с этими обработчиками ошибок... Вот готовый макрос с какого-то сайта. Справки и кучу форумов уже перечитал. Да и раньше сталкивался с этим и всё работало. В старых моих макросах теперь тоже не работает. Везде примерно такой код. НО ошибки он у меня не ловит. Конкретно тут при нажатии ESC или закрытии диалогового окна возникает ошибка 13. Если прописать тип переменной a as range то ошибка будет 424. MS Office 2016рус. Основная суть чтобы во время выбора диапазона через Application.InputBox можно было нажать отмену или ESC и спокойно выйти из процедуры. [vba]
Код
Sub Test3() Dim a On Error GoTo ErrorHandler Set a = Application.InputBox("Пожалуйста," _ & vbNewLine & "Выберите диапазон:", _ "Наш диалог", , , , , , 8) MsgBox a.Cells(1) MsgBox a.Address Exit Sub ErrorHandler: On Error Resume Next Select Case Err Case 424: MsgBox "Наверное, борщ отсутствует в справочнике...", vbCritical Case 13: MsgBox "Наверное, у борща проблемы с калорийностью...", vbCritical End Select End Sub
[/vba]
Доброго всем! Капитально подвис с этими обработчиками ошибок... Вот готовый макрос с какого-то сайта. Справки и кучу форумов уже перечитал. Да и раньше сталкивался с этим и всё работало. В старых моих макросах теперь тоже не работает. Везде примерно такой код. НО ошибки он у меня не ловит. Конкретно тут при нажатии ESC или закрытии диалогового окна возникает ошибка 13. Если прописать тип переменной a as range то ошибка будет 424. MS Office 2016рус. Основная суть чтобы во время выбора диапазона через Application.InputBox можно было нажать отмену или ESC и спокойно выйти из процедуры. [vba]
Код
Sub Test3() Dim a On Error GoTo ErrorHandler Set a = Application.InputBox("Пожалуйста," _ & vbNewLine & "Выберите диапазон:", _ "Наш диалог", , , , , , 8) MsgBox a.Cells(1) MsgBox a.Address Exit Sub ErrorHandler: On Error Resume Next Select Case Err Case 424: MsgBox "Наверное, борщ отсутствует в справочнике...", vbCritical Case 13: MsgBox "Наверное, у борща проблемы с калорийностью...", vbCritical End Select End Sub
anvg, а можете подсказать как можно отказаться от этих обработчиков ошибок вообще, я так понял они не желательны так как при разных настройках VBE могут сработать а могут и нет? Конкретно надо предусмотреть возможность отмены (закрытия) Application.InputBox.
anvg, а можете подсказать как можно отказаться от этих обработчиков ошибок вообще, я так понял они не желательны так как при разных настройках VBE могут сработать а могут и нет? Конкретно надо предусмотреть возможность отмены (закрытия) Application.InputBox.fairylive
как можно отказаться от этих обработчиков ошибок вообще
Проверять перед каждым шагом возможность того, что некоторые данные, которые будут использоваться в нём, не удовлетворяют условиям использования. Но! В силу особенностей объектной модели, это фактически не возможно. Например, ListObject объект может содержать объект внешних данных QueryTable, но, увы, без обработчика событий вы это не сможете выяснить. Поэтому нужно как-то договариваться с пользователями, чтобы они не лезли в настройки. Единственное что нашёл по управлению Error Trapping, опять же, это работает, судя по ответу, только в Access. Скорее всего где-то это регистрируется в реестре... Но как правило изменения в нём могут потребовать перезагрузки Excel.
как можно отказаться от этих обработчиков ошибок вообще
Проверять перед каждым шагом возможность того, что некоторые данные, которые будут использоваться в нём, не удовлетворяют условиям использования. Но! В силу особенностей объектной модели, это фактически не возможно. Например, ListObject объект может содержать объект внешних данных QueryTable, но, увы, без обработчика событий вы это не сможете выяснить. Поэтому нужно как-то договариваться с пользователями, чтобы они не лезли в настройки. Единственное что нашёл по управлению Error Trapping, опять же, это работает, судя по ответу, только в Access. Скорее всего где-то это регистрируется в реестре... Но как правило изменения в нём могут потребовать перезагрузки Excel.anvg
Ок. Спасибо. Решил что в моём случае можно обойтись и без обработчика. У меня просто по логике программы надо было 2-3 раза выбрать диапазон на листе. Иногда уже после запуска программы обнаруживается что нужных данных на листе нет. Поэтому нужен выход из процедуры, чтобы не выбирать левые данные и не тратить время. В итоге по нажатию ESC (отмены) вылезает ошибка. Ну в каком-то роде желаемого мы добились. Ситуация довольно редкая сама по себе, так что терпимо. Не могу только понять почему это не делается красиво изначально. Ведь у Application.InputBox есть кнопка Отмена! Также как вариант в интернетах подсказывают сделать свою форму. Может чуть позже реализую.
Ок. Спасибо. Решил что в моём случае можно обойтись и без обработчика. У меня просто по логике программы надо было 2-3 раза выбрать диапазон на листе. Иногда уже после запуска программы обнаруживается что нужных данных на листе нет. Поэтому нужен выход из процедуры, чтобы не выбирать левые данные и не тратить время. В итоге по нажатию ESC (отмены) вылезает ошибка. Ну в каком-то роде желаемого мы добились. Ситуация довольно редкая сама по себе, так что терпимо. Не могу только понять почему это не делается красиво изначально. Ведь у Application.InputBox есть кнопка Отмена! Также как вариант в интернетах подсказывают сделать свою форму. Может чуть позже реализую.fairylive