Консультация № 172280
17.09.2009, 19:44
0.00 руб.
0 8 1
Здраствуйте Уважаемые эксперты.
Программирую VBA. Не могу понять в чем моя ошибка, что у меня выполяется не то что надо.
Есть форма, обьявлены несколько пременных в модуле. И по нажатию на одну из кнопок действие(Смотрите приложение).
Я хочу сделать так, чтобы если число в textbox1.text больше чем textbox4.text то выводится число из textbox4.text в метке.
Проблема:
К примеру пишу такие числа 100 > 55
В метке ничего не выводится.
Если пишу 100 > 0,9 то все выводится. Как будто бы сравнение идет по первой цифре.
Пробовал еще и такую конструкцию:
Private Sub Button1_Click()
t1 = Formm.TextBox1.Text
t2 = Formm.TextBox4.Text
Label12.Caption = t1
Label13.Caption = t2
If t1 > t2 Then
Label14.Caption = t2
End If
End Sub

Не помогло. Тотже результат.
Помогите решить проблему.

Приложение:
Private Sub Button1_Click()
t1 = Formm.TextBox1.Text
t2 = Formm.TextBox4.Text
Label12.Caption = t1
Label13.Caption = t2
If Formm.TextBox4.Text <= Formm.TextBox1.Text Then
Label14.Caption = Formm.TextBox4.Text
End If
End Sub

Обсуждение

Неизвестный
17.09.2009, 19:48
общий
Все переменные типа integer
Неизвестный
17.09.2009, 20:30
общий
Сравнение идет скорее не по первой цифре, а по первой буквеПопробуйте явно переводить в число. Если все переменные типа Variant, то там что угодно может быть. А выглядеть будет как надо. По крайней мере, код в приложении точно сравнивает текст.
Неизвестный
17.09.2009, 20:40
общий
это ответ
Здравствуйте, Dimon4ik.
Вы пытаетесь сравнивать строки. Сравнение происходит по ASCII кодам первых символов строк. Если вы хотите сравнивать числа, то нужно преобразовать строку в число, а затем сравнивать. Например, так
Код:
Private Sub Button1_Click()
Dim t1 As Single, t2 As Single
t1 = CSng(Formm.TextBox1.Text)
t2 = CSng(Formm.TextBox4.Text)
Label12.Caption = CStr(t1)
Label13.Caption = CStr(t2)
If t1 > t2 Then
Label14.Caption = CStr(t2)
End If
End Sub

Переменные я объявил как Single, а не как Double, потому что никакой необходимости в повышенной точности нет. Переменные типа Single могут иметь значения от -3.402823[$149$]1038 до -1.401298[$149$]-45 для отрицательных значений и от 1.401298[$149$]-45 до 3.402823[$149$]38 для положительных. Думаю, что для вашей задачи этого хватит за глаза.
5
Спасибо. Теперь все работает!
Неизвестный
17.09.2009, 20:44
общий
Evgenijm:
If t1 > t2 Then
Label14.Caption = t2

Здесь сравниваются две переменные. Они являются переменными типа Integer
Dim t1%
Dim t2%
Здесь же уже целые данные а не буквы. Я вывожу промежуточные данные
Label12.Caption = t1
Label13.Caption = t2
Где вижу что в переменных занесены те значения которые надо. Но при сравнении тот же результат что и с текстом.

Неизвестный
17.09.2009, 21:04
общий
Когда то писал программу и вней применял такие строки:
a = Form.TextBox1.Text
b = Form.TextBox2.Text
c = Form.TextBox3.Text
d = b ^ 2 - 4 * a * c
Дискриминант.Caption = "D=b^2-4*a*c = " & b ^ 2 & "-4 * " & a & " * " & c & " = " & d
И в ней результаты были числовые и совершенно правильные. Даже без переводов из строк и наоборот...
Неизвестный
17.09.2009, 21:09
общий
Если Integer, то о дробных числах можно забыть. Если дробные не нужны, тогда вместо функции CSng можно использовать CInt или Val
Неизвестный
17.09.2009, 21:12
общий
[q=218629][/q]
Когда производятся арифметические действия, то компилятор сам выполняет неявные преобразования типов. Лучше и грамотнее делать это самому, чтобы держать под контролем все, что делает программа.. Перемножать числа, а в строковые переменные передавать строки.
Неизвестный
18.09.2009, 12:20
общий
Витер Александр Анатольевич:
Цитата: 180743
Если дробные не нужны, тогда вместо функции CSng можно использовать CInt или Val

Функция Val возвращяет не целое число, а дробное типа Double.
Форма ответа