Страницы: 1
RSS
Как отформатировать число в TextBox?
 
Есть числовое значение в TextBox (оно может быть как целым (Long), так и с плавающей запятой).
Как отформатировать в TextBox значение с разделителем тысяч (например, пробелом).
 
функция Format()
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
В нем использовал предопределенный формат Standard, но он дает только 2 цифры после запятой, а мне нужны все!
 
Запишите рекордером нужно е форматирование ячейки и посмотрите получившийся код. Используйте аналогичный для ТекстБокса.
 
был один вопрос
Цитата
evgmaz пишет:
Как отформатировать в TextBox значение с разделителем тысяч (например, пробелом).
где здесь сказано про количество знаков после запятой?

так что надо-то на самом деле?
может быть, примеры привести, если словами не получается описать задачу?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
Юрий М пишет: Запишите рекордером...
Спасибо за совет! Попробуем!
 
воспользовался советом от Юрия М, но вот такой код в процедуре TextBox1_KeyPress:
st = TextBox1.Value

If KeyAscii >= 48 And KeyAscii <= 57 Then
TextBox1.Text = Format(st, "#,###" ;)
Exit Sub
Else
KeyAscii = 0
Exit Sub
End If

дает в итоге неправильный формат, типа 1 234 5678 (т.е. делит не по 3 разряда, а в конце оставляет 4).
А должно быть: 12 345 678

Не пойму то ли ошибка в использовании ф-ии Format, то ли не корректность ее использования в процедуре KeyPress (и надо поискать другую процедуру)?!
 
в окне immediate:
Код
? format(12345678, "#,##0")
12 345 678


а что там у вас в переменной st - нам, извините, не видно  :(
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
ikki пишет: а что там у вас в переменной st - нам, извините, не видно  :(  
Подозрение у вас правильное, в процедуре KeyPress в переменную st попадает число до нажатия клавиши, а не после, поэтому форматирование неверное.

Если сделал процедуру Change, типа
Private Sub TextBox1_Change()
st = TextBox1.Value
TextBox1.Text = Format(st, "#,##0")  
End Sub

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

не стоит пихать всё в один обработчик, создавая себе трудности и запутывая код.
ваш вариант с двумя процедурами кажется мне наиболее логичным.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Спасибо, всегда приятно, что свои мысли (подходы) одобряются профессионалами
 
И все таки продолжу:

Проблема с плавающей запятой.
Если все то же самое проделать с плавающей запятой (в процедуре TextBox1_Change())
st=TextBox1.Value
TextBox1 = Format(st, "#,##0.##")
то в итоге вообще я не понимаю Excel

Ввожу: 12345.6789
Полагаю, что получу: 12 345.67
А получаю: 1,23 (цифра 4 уже не вводится, а запятая ввелась сама). Запятая-это что делить разрядов, либо математический знак?

Запись "#,##0.##" проверял с NumberFormat применительно к ячейкам, то все работает ок!
В чем может быть проблема?
 
Цитата
evgmaz пишет:
Ввожу: 12345.6789... Полагаю, что получу: 12 345.67
Неправильно полагаете - должно получиться 12 345,68.
Не могу также понять необходимость переменной st - зачем она вообще?
Цитата
цифра 4 уже не вводится, а запятая ввелась сама
Наверное, Вы забываете, что событие Change возникает после ввода КАЖДОГО символа.
Также не могу понять, почему Вы вводите точку в качестве разделителя целой и дробной части - вводите запятую.
И сделайте всё на событие Exit:
Код
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Me.TextBox1 = Format(Me.TextBox1, "#,##0.##")
End Sub
 
Цитата
Юрий М пишет: Не могу также понять необходимость переменной st - зачем она вообще?
st можно не вводить (это не принципиально!). Согласен.
Точку ввожу из-за того, что при помещении значения TextBox в ячейку листа, число вносится как число, а не как текст. (Раньше была запятая, от которой отказался, так как водился текст).
Кстати поменял . на , также ничего не работает!

С Exit конечно все работает, то хочется чтобы форматировалось во время набора, а не после выхода из TextBox.....

Продолжаю осмысливать идеи....но пока нет результата!
Изменено: evgmaz - 10.05.2013 00:07:08
 
предлагаю попробовать так:
1. ПЕРЕД каждым форматированием полученную строку из текстбокса избавлять от пробелов
2. ЕСЛИ последний знак в строке - точка, то временно убирать его
3. превращать полученную строку в число и форматировать Format'ом
4. ЕСЛИ в конце была точка - добавить её к результату форматирования
Изменено: ikki - 29.04.2013 00:46:42
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
evgmaz пишет:
Точку ввожу из-за того, что при помещении значения TextBox в ячейку листа, число вносится как число, а не как текст.
В TextBox ВСЕГДА текст, вне зависимости от того, вводите Вы точку или запятую.
 
Совершенно верно, в TextBox всегда текст (это хорошо известно), но вот когда данные из TextBox я копирую в ячейку Листа, то Exel воспринимает текст с точкой как число, а текст с запятой как текст.
В первом случае с ячейкой можно работать как с числом (например, прибавить 1), а во втором случае при прибавлении 1 на автомате получите ошибку!
Я прихожу к выводу, что тема форматирования в Exel самая муторная. Много раз возвращался к этой теме (за несколько лет) и всякий раз какая-то нелогичность возникает!
Ни отчего другого в Exel не возникает подобного дискомфорта!
 
Так и передавайте его в ЯЧЕЙКУ числом: [A1] = CDbl(Me.TextBox1)
 
Цитата
evgmaz пишет:
Exel воспринимает текст с точкой как число, а текст с запятой как текст
Не согласен: это VBA воспринимает точку, как разделитель. А вот Excel как раз наоборот. Попробуйте ввести в ячейку 12345.6789
 
Цитата
ikki пишет: предлагаю попробовать так...
Попробую ваш вариант, но вот что настораживает:
Почему с целым числом обсуждаемый с вами утром вариант с процедурой Change и кодом
TextBox1.Text = Format(st, "#,##0" ;)
работает превосходно!

А ДЛЯ ДЕЙСТВИТЕЛЬНОГО ЧИСЛА (когда запятая есть) вариант с процедурой Change и кодом
TextBox1 = Format(TextBox1, "#,##0.##" ;)  уже не работает??????!!!!! Получается полностью необъяснимый результат!
И ради это приходится выкручиваться разными способами (например, как вы указали)?!!!!
 
Юрий М, ну, Вы только подтверждаете сказанное....Это 12345.6789 - Exel воспринимает как текст, а если 12345.6789 находится в TextBox, то Cells(1,1) =TextBox.value получится нормальное хорошее число 12345,6789
Я сам удивился, когда это обнаружил, поэтому и поменял , на . в обработке TextBox.
Отчего еще больше запутался!

Короче ни с запятой ни с точкой пока нет результата!
Изменено: evgmaz - 10.05.2013 00:08:25
 
Цитата
evgmaz пишет:
а если 12345.6789 находится в TextBox, то Cells(1,1) =TextBox.value получится нормальное хорошее число
Правильно - "вмешивается" VBA. И вообще не пойму - зачем форматировать именно в TextBox? Что Вам даст там наличие пробела между разрядами? Форматируйте уже при присвоении значения ячейке. Не вижу вообще проблемы: как писал выше - cdbl нормально справляется. А вот менять точку на запятую можно и при вводе.
 
Цитата
Юрий М пишет:
1). И вообще не пойму - зачем форматировать именно в TextBox? Что Вам даст там наличие пробела между разрядами?
2). Форматируйте уже при присвоении значения ячейке. Не вижу вообще проблемы: как писал выше - cdbl нормально справляется. А вот менять точку на запятую можно и при вводе.

Ответы:
1). Ну это вопрос чисто эстетики при работе с Формой конечного пользователя
2). В ячейке все легко отформатируем, даже не задавал бы вопросов.
3). За Cdbl спасибо!
Страницы: 1
Читают тему
Наверх