Здравствуйте. Корень моего вопроса в следующем: в функции, что я сейчас пытаюсь написать, нескольким переменным, как и самой функции, присвоен тип данных 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
Специальный метод объекта Err для таких случаев есть: [vba]
Код
Function МОИТест(Optional x As Double) As Long If x <> CLng(x) _ Then Err.Raise -99, , "В функции возникла ошибка": Exit Function _ Else: МОИТест = x End Function
Специальный метод объекта Err для таких случаев есть: [vba]
Код
Function МОИТест(Optional x As Double) As Long If x <> CLng(x) _ Then Err.Raise -99, , "В функции возникла ошибка": Exit Function _ Else: МОИТест = x End Function
Pelena, да, как вариант можно и на ноль делить. Тоже об этом обходном пути подумал. Но для углубления познаний в ВБА интересовало существование прямого вызова ошибки оператором или методом, конкретно предназначенным для этого.
Gustav, Спасибо, именно то что я и хотел узнать , ещё и со ссылкой на полезный сайт с инструкцией. Для моей функции, правда, достаточно лишь "Err.Raise 0", но и другой функционал этого метода может пригодиться где-нибудь когда-нибудь)
doober,
Цитата
А не проще проверять результат сравнения
Нет, моя функция должна выдавать значения типа Long, и для правильного вычисления, исходные данные должны быть целыми числами. Переменная типа лонг округляет число с запятой автоматом, а не выдаёт ошибку, в результате вычисления всё равно идут, но с погрешностью, чего быть не должно.
RAN, не совсем понял от кого, по вашему мнению, я пытался спрятаться, но вот он Я
Pelena, да, как вариант можно и на ноль делить. Тоже об этом обходном пути подумал. Но для углубления познаний в ВБА интересовало существование прямого вызова ошибки оператором или методом, конкретно предназначенным для этого.
Gustav, Спасибо, именно то что я и хотел узнать , ещё и со ссылкой на полезный сайт с инструкцией. Для моей функции, правда, достаточно лишь "Err.Raise 0", но и другой функционал этого метода может пригодиться где-нибудь когда-нибудь)
doober,
Цитата
А не проще проверять результат сравнения
Нет, моя функция должна выдавать значения типа Long, и для правильного вычисления, исходные данные должны быть целыми числами. Переменная типа лонг округляет число с запятой автоматом, а не выдаёт ошибку, в результате вычисления всё равно идут, но с погрешностью, чего быть не должно.
RAN, не совсем понял от кого, по вашему мнению, я пытался спрятаться, но вот он Я ZetMenChavo
Сообщение отредактировал ZetMenChavo - Воскресенье, 11.09.2022, 19:39