Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Получить ошибку при соблюдении условии - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Получить ошибку при соблюдении условии (Макросы/Sub)
Получить ошибку при соблюдении условии
ZetMenChavo Дата: Воскресенье, 11.09.2022, 13:35 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 138
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте. Корень моего вопроса в следующем: в функции, что я сейчас пытаюсь написать, нескольким переменным, как и самой функции, присвоен тип данных Long. При проверке работоспособности функции заметил, что даже если подставлять числа с запятой, функция всё равно вычисляет, просто число автоматом округляется, и получается что в функцию можно ввести неправильные, для текущей задачи, исходные данные, и это даже не получиться никак заметить по итогам вычислений.
Я придумал как проверять исходные данные на соответсвие нужному типу, но вот как заставить функцию сообщить мне, что в исходных данных ошибка, я не знаю.

В укороченной функции ниже, я заменил тип вводимой переменной на Double, и уже в самом коде проверяется, измениться ли переменная если сменить её тип на Long. Если да, то в immediate window появиться сообщение True и функция завершиться.
Если же переменная Double равна своей версии Long, то функция просто равна этой переменной.

Задача заменить "Debug.Print True" на то что заставит функию выдать ошибку. Расчитываю на опыт местных знатаков
[vba]
Код
Function МОИТест(Optional x As Double) As Long
    If x <> CLng(x) _
    Then Debug.Print True: Exit Function _
    Else МОИТест = x
End Function
[/vba]
 
Ответить
СообщениеЗдравствуйте. Корень моего вопроса в следующем: в функции, что я сейчас пытаюсь написать, нескольким переменным, как и самой функции, присвоен тип данных Long. При проверке работоспособности функции заметил, что даже если подставлять числа с запятой, функция всё равно вычисляет, просто число автоматом округляется, и получается что в функцию можно ввести неправильные, для текущей задачи, исходные данные, и это даже не получиться никак заметить по итогам вычислений.
Я придумал как проверять исходные данные на соответсвие нужному типу, но вот как заставить функцию сообщить мне, что в исходных данных ошибка, я не знаю.

В укороченной функции ниже, я заменил тип вводимой переменной на Double, и уже в самом коде проверяется, измениться ли переменная если сменить её тип на Long. Если да, то в immediate window появиться сообщение True и функция завершиться.
Если же переменная Double равна своей версии Long, то функция просто равна этой переменной.

Задача заменить "Debug.Print True" на то что заставит функию выдать ошибку. Расчитываю на опыт местных знатаков
[vba]
Код
Function МОИТест(Optional x As Double) As Long
    If x <> CLng(x) _
    Then Debug.Print True: Exit Function _
    Else МОИТест = x
End Function
[/vba]

Автор - ZetMenChavo
Дата добавления - 11.09.2022 в 13:35
Pelena Дата: Воскресенье, 11.09.2022, 16:34 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 18605
Репутация: 4216 ±
Замечаний: ±

Excel 2016 & Mac Excel
Здравствуйте.
то что заставит функию выдать ошибку
как вариант
[vba]
Код
Function МОИТест(Optional x As Double) As Long
    If x <> CLng(x) _
    Then МОИТест = 1 / 0: Exit Function _
    Else: МОИТест = x
End Function
[/vba]


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЗдравствуйте.
то что заставит функию выдать ошибку
как вариант
[vba]
Код
Function МОИТест(Optional x As Double) As Long
    If x <> CLng(x) _
    Then МОИТест = 1 / 0: Exit Function _
    Else: МОИТест = x
End Function
[/vba]

Автор - Pelena
Дата добавления - 11.09.2022 в 16:34
Gustav Дата: Воскресенье, 11.09.2022, 17:57 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 2211
Репутация: 893 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Специальный метод объекта Err для таких случаев есть:
[vba]
Код
Function МОИТест(Optional x As Double) As Long
    If x <> CLng(x) _
    Then Err.Raise -99, , "В функции возникла ошибка": Exit Function _
    Else: МОИТест = x
End Function
[/vba]
По поводу best practice назначения своего номера ошибки в Err.Raise (у меня -99) можно почитать, например, здесь: https://bettersolutions.com/vba/error-handling/raising-errors.htm


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеСпециальный метод объекта Err для таких случаев есть:
[vba]
Код
Function МОИТест(Optional x As Double) As Long
    If x <> CLng(x) _
    Then Err.Raise -99, , "В функции возникла ошибка": Exit Function _
    Else: МОИТест = x
End Function
[/vba]
По поводу best practice назначения своего номера ошибки в Err.Raise (у меня -99) можно почитать, например, здесь: https://bettersolutions.com/vba/error-handling/raising-errors.htm

Автор - Gustav
Дата добавления - 11.09.2022 в 17:57
doober Дата: Воскресенье, 11.09.2022, 18:02 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 901
Репутация: 314 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте.А не проще проверять
результат сравнения[vba]
Код
Function МОИТест(Optional x As Double) As Boolean
   МОИТест = x <> CLng(x)
End Function
[/vba]или[vba]
Код
Function МОИТест2(Optional x As Double) As Boolean
   МОИТест2 = x - Fix(x) = 0
End Function
[/vba]




Сообщение отредактировал doober - Воскресенье, 11.09.2022, 18:06
 
Ответить
СообщениеЗдравствуйте.А не проще проверять
результат сравнения[vba]
Код
Function МОИТест(Optional x As Double) As Boolean
   МОИТест = x <> CLng(x)
End Function
[/vba]или[vba]
Код
Function МОИТест2(Optional x As Double) As Boolean
   МОИТест2 = x - Fix(x) = 0
End Function
[/vba]

Автор - doober
Дата добавления - 11.09.2022 в 18:02
RAN Дата: Воскресенье, 11.09.2022, 18:26 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 5638
Репутация: 1144 ±
Замечаний: 0% ±

2010
ZetMenChavo, Спалился! :D
И стоило шифроваться?


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Воскресенье, 11.09.2022, 18:28
 
Ответить
СообщениеZetMenChavo, Спалился! :D
И стоило шифроваться?

Автор - RAN
Дата добавления - 11.09.2022 в 18:26
ZetMenChavo Дата: Воскресенье, 11.09.2022, 19:38 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 138
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Pelena, да, как вариант можно и на ноль делить. Тоже об этом обходном пути подумал. Но для углубления познаний в ВБА интересовало существование прямого вызова ошибки оператором или методом, конкретно предназначенным для этого.

Gustav, Спасибо, именно то что я и хотел узнать :) , ещё и со ссылкой на полезный сайт с инструкцией. Для моей функции, правда, достаточно лишь "Err.Raise 0", но и другой функционал этого метода может пригодиться где-нибудь когда-нибудь)

doober,
Цитата
А не проще проверять результат сравнения

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

RAN, не совсем понял от кого, по вашему мнению, я пытался спрятаться, но вот он Я :D


Сообщение отредактировал ZetMenChavo - Воскресенье, 11.09.2022, 19:39
 
Ответить
СообщениеPelena, да, как вариант можно и на ноль делить. Тоже об этом обходном пути подумал. Но для углубления познаний в ВБА интересовало существование прямого вызова ошибки оператором или методом, конкретно предназначенным для этого.

Gustav, Спасибо, именно то что я и хотел узнать :) , ещё и со ссылкой на полезный сайт с инструкцией. Для моей функции, правда, достаточно лишь "Err.Raise 0", но и другой функционал этого метода может пригодиться где-нибудь когда-нибудь)

doober,
Цитата
А не проще проверять результат сравнения

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

RAN, не совсем понял от кого, по вашему мнению, я пытался спрятаться, но вот он Я :D

Автор - ZetMenChavo
Дата добавления - 11.09.2022 в 19:38
RAN Дата: Воскресенье, 11.09.2022, 20:02 | Сообщение № 7
Группа: Друзья
Ранг: Экселист
Сообщений: 5638
Репутация: 1144 ±
Замечаний: 0% ±

2010
от кого, по вашему мнению, я пытался спрятаться

Не знаю...


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Понедельник, 12.09.2022, 08:44
 
Ответить
Сообщение
от кого, по вашему мнению, я пытался спрятаться

Не знаю...

Автор - RAN
Дата добавления - 11.09.2022 в 20:02
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Получить ошибку при соблюдении условии (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2022 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!