Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2018, 12:26   #1
tungsten
Пользователь
 
Регистрация: 05.11.2012
Сообщений: 16
По умолчанию TextBox денежный тип, ограничение свободы действий пользователя

Добрый день!
Предо мной стоит задача ограничить ввод в TextBox (aka SumBox in my code) всего что не касается денежного выражения. Тоесть допущены цифры и знак отделения дробной части (тчк|зпт), помимо этого значение может быть только положительное, значение не может начинаться с нулей.
Родился такой код:
Код:
Private Sub SumBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not (KeyAscii = Asc(".") Or KeyAscii = Asc(",") Or (KeyAscii >= Asc("0") And KeyAscii <= Asc("9"))) Then KeyAscii = "0"
If InStr(SumBox.value, ".") And KeyAscii = Asc(".") Then KeyAscii = "0"
If InStr(SumBox.value, ".") And KeyAscii = Asc(",") Then KeyAscii = "0"
If Not (InStr(SumBox.value, ".")) And KeyAscii = Asc(",") Then KeyAscii = Asc(".")
End Sub

Private Sub SumBox_change()
Static busy As Boolean
If busy Then
Exit Sub
Else
    busy = True
    SumBox.value = Format(SumBox.value, "#,##")
    busy = False
End If
End Sub
Проверка - ввожу значение меньше 1000 (допустим 100,55) после нажатия знака отделения дробной части (точка или запятая), сумма превращается в отрицательное значение из космоса (типа -650 025)
что я сделал не так?
tungsten вне форума Ответить с цитированием
Старый 21.05.2018, 14:58   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Обрабатывате не
Код:
_change()
а
Код:
_exit
Вариант, по желанию допилите под себя
Код:
Private Sub SumBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Static busy As Boolean
If busy Then
Exit Sub
Else
    busy = True
    SumBox.Value = Format(CDbl(Replace(SumBox.Value, ".", ",")), "#,##0.00")
    busy = False
End If
End Sub

Private Sub SumBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  Const Dgt$ = "1234567890"
  Dim z
  z = UserForm1.SumBox.Value
  If KeyAscii = 46 Or KeyAscii = 44 Then
    KeyAscii = 44
    If InStr(z, Chr(KeyAscii)) > 1 Then KeyAscii = 0 'запрет повторения разделителя
    If Len(z) = 0 Then KeyAscii = 0 'запрет лидирующего разделителя
  Else
    If InStr(Dgt, ChrW(KeyAscii)) = 0 Then KeyAscii = 0
  End If
End Sub
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ограничение одной запятой в textBox Ramzan_95 C# (си шарп) 2 20.04.2018 22:30
Блокировка действий пользователя Vladya Общие вопросы Delphi 21 30.10.2014 18:15
Как добавлять в список методы разной сигнатуры?(Запоминание действий пользователя) iron-mik C# (си шарп) 1 22.05.2014 14:25
Макросы действий пользователя на XML wadimko97 Общие вопросы Delphi 0 08.06.2011 05:27
Перехват данных или эмуляция действий пользователя? Zuban Win Api 13 15.01.2011 22:22