Страницы: 1
RSS
TextBox по формуле выдаёт неправильный десятичный результат
 
Доброго дня всем!)
Ребят, помогите пожалуйста разобраться в такой проблеме:
Есть форма с 4мя текстбоксами. 4й должен дать результат по формуле но выводит его неправильно в случае который я описал в файле. Если ввести три например значения которые я указал должен выбить большую абракадабру! Есть бывает выдаёт правильный результат а бывает нет!(
Пожалуйста помогите решить
 
Val(1,1)=1
оператор игнорирует текст и знаки после запятой
Применяйте CDbl

На изменение каждого
Код
Private Sub TextBox1_Change()
    Call математика
End Sub

А в процедуре математика считать
 
vikttur,
Для каждого бокса_change вызываю процедуру M где М это
Код
Sub М()
TextBox4 = CDbl(TextBox1) + CDbl(TextBox2) - CDbl(TextBox3)
End Sub
Изменено: Azakia - 29.03.2016 15:23:15
 
vikttur, или я наверно неправильно понимаю
 
если на изменениях всё писать через CDbl то считает как и Val.
ведь Val в большинстве случаев дробь считает правильно... я чёт не пойму.
поясните пожалуйста
 
Код
Private Sub TextBox1_Change()
Call Mat
End Sub
Private Sub TextBox2_Change()
Call Mat
End Sub
Private Sub TextBox3_Change()
Call Mat
End Sub

Private Sub Mat()
Dim a@, b@, c@
If IsNumeric(TextBox1.Text) Then a = TextBox1.Text 
If IsNumeric(TextBox2.Text) Then b = TextBox2.Text 
If IsNumeric(TextBox3.Text) Then c = TextBox3.Text 
TextBox4.Text = a + b - c
End Sub
Изменено: devilkurs_now - 29.03.2016 18:49:12
MS Office 2007,2010

ЛЕНЬ-двигатель прогресса!
 
devilkurs_now, спасибо большое! работает! а зачем доставлять @ к переменным?
Цитата
vikttur написал:
Val(1,1)=1
оператор игнорирует текст и знаки после запятой
vikttur, да но ведь через точку он все равно считает даже если я введу в третью строку 23.125 то через вал мне выдаст верный ответ 0.975
если он не пригоден то почему он выдаёт правильный вариант и почему в случае с "24" он выдаёт кучу неправильных цифр не понимаю ...
 
Я бы на лету контролировал (заменял) разделитель, тогда бы всё корректно вычислялось. Вот попробуйте в своём варианте ввести в первое поле 12,1 или 12.1 и понаблюдайте в итоговом поле.
 
Юрий М, да да
поэтому я и пользовался постоянно точкой для того чтобы вал срабатывал или я неправильно вас понял?
а в случае который devilkurs_now, мне подсказал я просто в каждом риплэйс походу дела делаю чтоб на всяк...если вы об этом  
 
Всё верно: я сразу при вводе перевожу в нужный мне разделитель. Заодно контролирую и количество этих разделителей - при вводе всякое бывает )
 
Юрий М, так вы всё таки за риплэйс? а в каком смысле количество?
а подскажите как объяснить ему подбирать запятую если знаков после неё нет как это делает обычная ячейка
 
Если нет разделителя - и не надо )) Я использую вот такой макрос от Игоря (ex-EducatedFool):
Код
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    txt = Me.TextBox1    ' читаем текст из поля (для недопущения ввода двух и более запятых)
    If InStr(1, txt, ",") > 0 And Len(txt) - InStr(1, txt, ",") = 2 Then KeyAscii = 0  ' только 2 цифры после запятой
    Select Case KeyAscii
        Case 8:    ' нажат Backspace - ничего не делаем
        Case 44: KeyAscii = IIf(InStr(1, txt, ",") > 0, 0, 44)    ' если запятая уже есть - отменяем ввод символа
        Case 46: KeyAscii = IIf(InStr(1, txt, ",") > 0, 0, 44)    ' заменяем при вводе точку на запятую
        Case 48 To 57    ' если введена цифра  - ничего не делаем
        Case Else: KeyAscii = 0    ' иначе отменяем ввод символа
    End Select
End Sub
Только привожу всё к точке, а не к запятой.
Про количество: ведь оператор может вместо одного разделителя ввести два: 21,,14 ))
 
Юрий М, благодарю!
 
Azakia добрый день. Запоздалый ответ.
Если высказываюсь как-то не корректно прошу прощения (как в советской сказке: "Я только учусь")

Переменные a@, b@, c@ объявлены как Currency. (а@ - это краткое "a As Currency") Для вычислений финансового направления всегда использую именно этот тип данных. "Числа с фиксированной точностью. После запятой всегда 4 знака. Числа этого типа не имеют ошибок при округлении. Подходит для денежных вычислений.  Требует памяти 8 байт "

Функция Val возвращает число в типе данных Double или Integer (здесь бывают ошибки в округлении при вычислениях.(это из практики - почему так я детально не знаю)
Поэтому в предложенном мною коде идет проверка введенного значения что это действительно вообще число и заношу его в переменную объявленную как Currency. И далее уже вычисления идут с этими переменными.
MS Office 2007,2010

ЛЕНЬ-двигатель прогресса!
Страницы: 1
Наверх