Сообщество программистов Autodesk в СНГ

ADN Club => Inventor API => Тема начата: R.I.Chernov от 20-05-2015, 16:19:36

Название: Сравнение значений переменной и текстбокса в VBA.
Отправлено: R.I.Chernov от 20-05-2015, 16:19:36
Здравствуйте, уважаемые форумчане. Помогите пожалуйста решить такую вот задачу:
Не знаю даже, как описать проблему, чтобы побыстрее и попонятнее... Прикладываю файл детали с кодом VBA внутри.

В общем, у меня есть параметр в детали (мм), к нему я приравниваю переменную в VBA (double), а затем к этой переменной приравниваю значение текстбокса и загружаю форму. Получается что значение текстбокса численно равно значению параметра в модели. Пользователь меняет текстбокс и нажимает применить, после чего запускается обратная операция (текстбокс-->переменная-->модель). Но вначале, программа сравнивает значение текстбокса и переменной VBA, и если они равны, всплывает сообщение, что параметр не изменен.
Суть проблемы такова, что написанный мною код проверки работает не при всех значениях. Примеры нерабочих значений параметра:7, 12, 14, 23, 666...
Т.е. если установить значение, например, 666 и закрыть форму, затем снова ее открыть и ничего не меняя нажать "применить значение", то сообщения, что параметр не изменен не появится.
П.С. Всю голову себе сломал, не могу найти, как это исправить. Буду признателен за любую идею!
Единственное решение пришедшее на ум - сравнивать значение текстбокса и переменной в формате стринг, используя Cstr. Но оно мне что-то не очень нравится.
Название: Re: Сравнение значений переменной и текстбокса в VBA.
Отправлено: Виктор Чекалин от 20-05-2015, 16:58:56
Единственное решение пришедшее на ум - сравнивать значение текстбокса и переменной в формате стринг, используя Cstr. Но оно мне что-то не очень нравится.
Почти. Только наоборот. Значение, введенное в текстбоксе нужно привести к типу Double с помощью функции CDbl и уже это значение сравнивать со значением переменной.
Только имейте ввиду, что в текстбокс можно вбить не только числа, и тогда при вызове функции  CDbl возникнет ошибка.
Также можно использовать другой контрол вместо текстбокса (не подскажу точно какой это контрол в VBA), который позволяет вводить только числа. Как правило, у таких контролов есть свойства типа Value с типом данных Double. В этом случае не нужно делать дополнительное преобразование и беспокоиться о валидности введенных данных.
Название: Re: Сравнение значений переменной и текстбокса в VBA.
Отправлено: Владимир Ананьев от 20-05-2015, 18:38:07
В параметрах Инвентора вы можете видеть, скажем, значение 7, а на самом деле, оказывается, там хранится действительное число 7.000000000001.  Лобовое сравнение даст неравенство.  Именно поэтому действительные числа следует сравнивать между собой, непременно учитывая некоторую точность.  Точность обычно вытекает из особенностей предметной области.  Одному миллиметра достаточно, а другому и микрон – грубо.

Итак, сравниваем два числа x и y:

Вариант 1.
If (Math.Abs(x-y) < Точность) then
    ‘числа можно считать равными
Else
    ‘числа отличаются
End if

Вариант 2.
Округляем оба числа до некоторого знака после запятой, после чего уже и проверяем равенство
X = Math.Round(x, 6)
Y = Math.Round(y, 6)
If x = y then
    ‘числа можно считать равными
Else
    ‘числа отличаются
End if
Название: Re: Сравнение значений переменной и текстбокса в VBA.
Отправлено: Александр Ривилис от 20-05-2015, 19:52:52
Вариант 2.
Может запросто не сработать. Вариант 1 значительно лучше.
Название: Re: Сравнение значений переменной и текстбокса в VBA.
Отправлено: Владимир Ананьев от 20-05-2015, 20:09:01
Согласен.  Вариант 1  -  канонический.

Название: Re: Сравнение значений переменной и текстбокса в VBA.
Отправлено: R.I.Chernov от 21-05-2015, 06:57:59
Почти. Только наоборот. Значение, введенное в текстбоксе нужно привести к типу Double с помощью функции CDbl и уже это значение сравнивать со значением переменной.
Спасибо, Виктор, за ответ. К сожалению CDbl я уже пробовал, и точно также не работает. Тут загвоздка идет с каким-то некорректным экспортом из инвентора походу.
Также можно использовать другой контрол вместо текстбокса (не подскажу точно какой это контрол в VBA), который позволяет вводить только числа. Как правило, у таких контролов есть свойства типа Value с типом данных Double
Мне такой не знаком ;(  Был бы безгранично признателен, если бы кто-нибудь подсказал, где искать :) а то каждый раз приходится проверять, число ли ввели в текстбоксе
Название: Re: Сравнение значений переменной и текстбокса в VBA.
Отправлено: R.I.Chernov от 21-05-2015, 07:31:47
числа следует сравнивать между собой
Спасибо, Владимир Николаевич, за ответ. Сейчас доеду до работы, обязательно попробую предложенные вами варианты.
Название: Re: Сравнение значений переменной и текстбокса в VBA.
Отправлено: R.I.Chernov от 21-05-2015, 09:19:35
Владимир Николаевич оказался прав. Нашел разность между значением текстбокса и переменной:  1E-13. Откуда она берется - непонятно,  да и не важно - вопрос решен! Еще раз большое спасибо!
П.С. В моей работе точность идет до второго знака после запятой, за погрешность взял на порядок меньше - 0,001. Все корректно начало работать:
Вместо  "If param=textbox.value Then" теперь такой вот аналог "If Abs(param-textbox.value)<0.001 Then".