Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/75: Рейтинг темы: голосов - 75, средняя оценка - 4.73
Буду мудрее сегодня
1 / 2 / 0
Регистрация: 16.11.2017
Сообщений: 43
1

Авто коррекция ввода даты в TextBox

07.02.2019, 13:58. Показов 15389. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго
Помогите реализовать.
В UserForm есть TextBox в который пользователь должен ввести дату.
Идея заключается в том, когда человек ввел число, например 12 то сразу автоматом ставится точка, потом он вводит 10 и так же подставляется точка, дальше может быть два развития события либо человек написал 2019 и его курсор автоматический переводится на следующий TextBox или он просто пишет 19 и перейдя на следующий TextBox либо с помощью Tab или курсором 12.10.19 переделывается в 12.10.2019. Так же нужно что бы можно было писать только цифры и подчеркивание "_".

Так же разместил такой вопрос тут но ответ не получил((
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2019, 13:58
Ответы с готовыми решениями:

Проверить правильность ввода в TextBox даты и времени
Подскажите пожалуйста, как проверить правильность введения в текстбокс Даты и времени, то есть что...

Запрет ввода даты рождения и даты выдачи водительского удостоверения, меньше 18 лет
Доброй ночи, программисты! Помогите пожалуйста: с запретом ввода даты рождения и даты выдачи...

Контроль ввода даты и выдача сообщения в случае ошибки неверного ввода
Здравствуйте! У меня есть такая вот форма(скрин ниже). Смысл в том, что если пользователь введет...

Нужно сделать поле ввода для ввода даты по шаблону
Нужно сделать поле ввода для ввода даты по шаблону ( __ . __ . ____ ). При воде нужно будет вводить...

15
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 524
07.02.2019, 14:09 2
Самое примитивное - у вашего текстбокса пропишите такой код
Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub TextBox1_Change()
   Dim l&
   l = Len(TextBox1)
   Select Case l
   Case 2
      TextBox1.Text = TextBox1.Text & "."
   Case 5
      TextBox1.Text = TextBox1.Text & "."
   End Select
End Sub
0
Буду мудрее сегодня
1 / 2 / 0
Регистрация: 16.11.2017
Сообщений: 43
07.02.2019, 14:15  [ТС] 3
Примитивной это для меня))
А что насчет того что бы запретить в вод букв и оставить только ввод цирк и знака "_"?

Добавлено через 55 секунд
Я находил решения про ограничения ввода но когда пишешь букву программа выдает ош и бац а мн еп нужно что бы просто ничего не происходило
0
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 524
07.02.2019, 15:11 4
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Option Explicit
 
Private Sub TextBox1_Change()
   Select Case Len(TextBox1)
   Case 2
      TextBox1.Text = TextBox1.Text & "."
   Case 5
      TextBox1.Text = TextBox1.Text & "."
   Case 10
      Application.SendKeys "{tab}"
   End Select
End Sub
 
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   If KeyAscii < 48 Or KeyAscii > 57 And KeyAscii <> 95 Then KeyAscii = 0
End Sub
Вот, добавил в код проверку нажатой клавиши. Если пытаешься вписать букву/иной недопустимый символ, то просто "ничего не происходит"
1
oh my god
1454 / 793 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
07.02.2019, 15:21 5
Цитата Сообщение от Otradnoe_4D Посмотреть сообщение
Я находил решения про ограничения ввода но когда пишешь букву программа выдает ош и бац а мн еп нужно что бы просто ничего не происходило

Visual Basic
1
2
3
4
5
6
7
8
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case ChrW$(KeyAscii)
    Case 0 To 9
    Case "б", "ю", ".", ","
        KeyAscii = Asc(".")
    Case Else: KeyAscii = 0
    End Select
End Sub
0
Буду мудрее сегодня
1 / 2 / 0
Регистрация: 16.11.2017
Сообщений: 43
07.02.2019, 18:24  [ТС] 6
Возникает проблема когда нужно подкорректировать дату. Точки удалить не получается)))
0
oh my god
1454 / 793 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
07.02.2019, 20:30 7
Ну значит не судьба. у меня работает передвижение курсора, удаление Backspace и Del
не знаю почему ты не можешь точки удалить, наверное у тебя пиратка стоит ))
0
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 524
07.02.2019, 20:35 8
Цитата Сообщение от Otradnoe_4D Посмотреть сообщение
Точки удалить не получается)))
Вот так, значит, стараешься пишешь человеку программу, которая точки ставит, а он потом эти точки мечтает удалить
Если нужно поле, идеально подходящее для работы с датой или временем, то текстбокс уступает специальному контролу "DTPicker"
Вложения
Тип файла: rar Otradnoe_4D.rar (12.5 Кб, 72 просмотров)
1
Буду мудрее сегодня
1 / 2 / 0
Регистрация: 16.11.2017
Сообщений: 43
07.02.2019, 20:38  [ТС] 9
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Option Explicit
 
Private Sub TextBox1_Change()
   Select Case Len(TextBox1)
   Case 2
      TextBox1.Text = TextBox1.Text & "."
   Case 5
      TextBox1.Text = TextBox1.Text & "."
   Case 10
      Application.SendKeys "{tab}"
   End Select
End Sub
Это работает хорошо?

Добавлено через 2 минуты
Святой НякаЛайк, Спасибо попробую)))
0
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 524
07.02.2019, 21:02 10
Цитата Сообщение от Otradnoe_4D Посмотреть сообщение
Это работает хорошо?
Изначально писал - решение примитивное. Пока пишешь просто что-то типа "123456789" оно само разбивает результ на "12.34.5678" и табом перекидывает фокус в другой элемент.
А вкупе с "Private Sub TextBox1_KeyPress......." код ещё и буквы/символы отсеет.
Юзай, тестируй!
0
Буду мудрее сегодня
1 / 2 / 0
Регистрация: 16.11.2017
Сообщений: 43
08.02.2019, 01:30  [ТС] 11
Решил проблему с точками таким образом)))

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub Дата()
   Select Case Len(TextBox1)
   Case 2
      TextBox1.Text = TextBox1.Text & "."
   Case 5
      TextBox1.Text = TextBox1.Text & "."
   Case 10
    UserForm1.TextBox2.SetFocus
   End Select
End Sub
 
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   If KeyAscii < 48 Or KeyAscii > 57 And KeyAscii <> 95 Then KeyAscii = 0
    If KeyAscii = 8 Then
    KeyAscii = 8
    Else
    Дата
    End If
End Sub
Добавлено через 1 минуту
Application.SendKeys "{tab}" - не работает почему то у меня
SendKeys - на этом момента ошибку дает
поэтому написал - UserForm1.TextBox2.SetFocus

Добавлено через 9 минут
Цитата Сообщение от Святой НякаЛайк Посмотреть сообщение
Если нужно поле, идеально подходящее для работы с датой или временем, то текстбокс уступает специальному контролу "DTPicker"
Такой функции у меня нет а Microsoft Access я устанавливать не хочу.

Осталось решить момент с годом в конце... что бы если пишешь 19 и переходишь на новый Box то автоматический переделает 2019 и так далее.

Заодно подскажите как сделать так что бы появлялась текущая дата при открытии UserForm)))

Добавлено через 21 минуту
Вот он рабочий результат))) Всем спасибо за помощь))) Возможно есть у кого предложения по оптимизации)) Я только учусь печатать на VBA и вообще программированию... может что то можно укоротить или на оборот дописать))

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Option Explicit
Sub Дата()
   Select Case Len(TextBox1)
   Case 2
      TextBox1.Text = TextBox1.Text & "."
   Case 5
      TextBox1.Text = TextBox1.Text & "."
   Case 10
    UserForm1.TextBox2.SetFocus
   End Select
End Sub
 
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    TextBox1.Text = Format(CDate(TextBox1.Text), "DD.MM.YYYY")
End Sub
 
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyTab Then
    TextBox1.Text = Format(CDate(TextBox1.Text), "DD.MM.YYYY")
    End If
End Sub
 
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   If KeyAscii < 48 Or KeyAscii > 57 And KeyAscii <> 95 Then KeyAscii = 0
   If KeyAscii = 8 Then
        KeyAscii = 8
   Else
        Дата
   End If
End Sub
Добавлено через 49 минут
Не получается исправить сообщение((( так что так обновленный код добавлю
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Option Explicit
Sub Дата()
   Select Case Len(TextBox1)
   Case 2
      TextBox1.Text = TextBox1.Text & "."
   Case 5
      TextBox1.Text = TextBox1.Text & "."
    Case 10
    UserForm1.TextBox2.SetFocus
    TextBox2.SelLength = 0
    TextBox2.SelStart = 0
   End Select
End Sub
Private Sub TextBox1_Change()
    Select Case Len(TextBox1)
        Case 10
    UserForm1.TextBox2.SetFocus
    TextBox2.SelLength = 0
    TextBox2.SelStart = 0
    End Select
End Sub
 
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If TextBox1.Text > "" Then
    TextBox1.Text = Format(CDate(TextBox1.Text), "DD.MM.YYYY")
    End If
End Sub
 
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyTab And TextBox1.Text > "" Then
    TextBox1.Text = Format(CDate(TextBox1.Text), "DD.MM.YYYY")
    End If
End Sub
 
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   If KeyAscii < 48 Or KeyAscii > 57 And KeyAscii <> 95 Then KeyAscii = 0
   If KeyAscii = 8 Then
        KeyAscii = 8
   Else
        Дата
   End If
End Sub
1
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 524
08.02.2019, 09:13 12
Цитата Сообщение от Otradnoe_4D Посмотреть сообщение
Такой функции у меня нет а Microsoft Access я устанавливать не хочу.
При работе с формой жмём левой мышекнопкой по панельке с контролами, выбираем в появившемся меню пункт "Additional Controls"
Появляется окошко с выбором используемых контролов, в списке ищем Microsoft Date and time Picker Control
После чего в тулбоксе должон появиться DTPicker!

Авто коррекция ввода даты в TextBox


Предложение по оптимизации есть: вместо if KeyAscii= then KeyAscii= 8 пишем if KeyAscii<> 8 then...
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Option Explicit
Sub Дата()
   Select Case Len(TextBox1)
   Case 2
      TextBox1.Text = TextBox1.Text & "."
   Case 5
      TextBox1.Text = TextBox1.Text & "."
   Case 10
      UserForm1.TextBox2.SetFocus
      TextBox2.SelLength = 0
      TextBox2.SelStart = 0
   End Select
End Sub
 
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   Debug.Print KeyAscii
   If KeyAscii < 48 Or KeyAscii > 57 And KeyAscii <> 95 Then KeyAscii = 0
   If KeyAscii <> 8 Then Дата
End Sub
 
Private Sub UserForm_Initialize()   ' При Инициализации формы в текстбокс будет выставлена текущая дата
   TextBox1 = Format(Now(), "DD.MM.YYYY")
End Sub
1
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 524
08.02.2019, 09:16 13
Цитата Сообщение от Otradnoe_4D Посмотреть сообщение
текущая дата при открытии UserForm)))
Но в коде выше текущая дата будет прописываться в текстбокс при инициализации формы. Если же нужно, чтобы при каждом повторном открытии, то надо писать в событие Activate
Visual Basic
1
2
3
Private Sub UserForm_Activate()
   TextBox1 = Format(Now(), "DD.MM.YYYY")
End Sub
0
Буду мудрее сегодня
1 / 2 / 0
Регистрация: 16.11.2017
Сообщений: 43
08.02.2019, 22:29  [ТС] 14
а как заставить работать KeyAscii в TextBox1_Change?
хочу еще подсократить.... что бы не было функции дата...

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Private Sub TextBox1_Change()
If KeyAscii <> 8 Then
    Select Case Len(TextBox1)
   Case 2
      TextBox1.Text = TextBox1.Text & "."
   Case 5
      TextBox1.Text = TextBox1.Text & "."
    Case 10
    UserForm1.TextBox2.SetFocus
    TextBox2.SelLength = 0
    TextBox2.SelStart = 0
   End Select
   End If
End Sub
 
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If TextBox1.Text > "" Then TextBox1.Text = Format(CDate(TextBox1.Text), "DD.MM.YYYY")
    If TextBox1.Text = "" Then TextBox1 = Format(Now(), "DD.MM.YYYY")
End Sub
 
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyTab And TextBox1.Text > "" Then
    TextBox1.Text = Format(CDate(TextBox1.Text), "DD.MM.YYYY")
    End If
End Sub
 
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   If KeyAscii < 48 Or KeyAscii > 57 And KeyAscii <> 95 Then KeyAscii = 0
End Sub
Хочу прейти к такому результату но программа ругается вот тут
Visual Basic
1
2
Private Sub TextBox1_Change()
If KeyAscii <> 8 Then
Добавлено через 34 минуты
Святой НякаЛайк,
У меня еще вопрос... а для чего это?
Цитата Сообщение от Святой НякаЛайк Посмотреть сообщение
Debug.Print KeyAscii
0
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 524
09.02.2019, 00:23 15
Цитата Сообщение от Otradnoe_4D Посмотреть сообщение
У меня еще вопрос... а для чего это?

Не по теме:

:D
Это магия!


Это Immediate window
Подробнее
Ещё

Добавлено через 43 минуты
Цитата Сообщение от Otradnoe_4D Посмотреть сообщение
но программа ругается вот тут
Самое время обратить внимание на те штуки, которые всегда на самом виду:
Visual Basic
1
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Здесь, в коде события KeyPress есть скобки. В них содержатся Агрументы, получаемые процедурой при данном событии.
Поэтому эта процедура может использовать KeyAscii - потому что она получила её в качестве агрумента!

А здесь:
Visual Basic
1
Private Sub TextBox1_Change()
Никаких аргументов нет, в том числе KeyAscii. Потому и не удаётся использовать.
В данном случае достаточно перетащить строки кода Change в код процедуры KeyPress, примерно так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If TextBox1 > "" Then TextBox1 = Format(CDate(TextBox1), "DD.MM.YYYY")
    If TextBox1 = "" Then TextBox1 = Format(Now(), "DD.MM.YYYY")
End Sub
 
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyTab And TextBox1 > "" Then
    TextBox1 = Format(CDate(TextBox1), "DD.MM.YYYY")
    End If
End Sub
 
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   If KeyAscii < 48 Or KeyAscii > 57 And KeyAscii <> 95 Then KeyAscii = 0
   If KeyAscii <> 8 Then
    Select Case Len(TextBox1)
   Case 2
      TextBox1 = TextBox1 & "."
   Case 5
      TextBox1 = TextBox1 & "."
    Case 10
    TextBox2.SetFocus
    TextBox2.SelLength = 0
    TextBox2.SelStart = 0
   End Select
   End If
End Sub
1
oh my god
1454 / 793 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
09.02.2019, 18:16 16
Просто надо было объяснить человеку
что любое нажатие клавиши можно контролировать
либо пропустить. либо нет, более того контролировать всю запись... тоесть немаловажно когда он ее введет, минуя все служебные припоны на это есть перепроверка даты
Как это организовать ? догадайтесь...

Добавлено через 11 минут
Otradnoe_4D, это как раз тот случай, когда требуется решить сиюминутную проблему не вникая в корни этой проблемы.

а чего напрягаться. нужно только спросить на киберфоруме у здешних старцев. Как , куда, чего и с чем.
Давайте уже начнем мозгами думать...
1
09.02.2019, 18:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2019, 18:16
Помогаю со студенческими работами здесь

Контроль ввода даты в MaskEdit и выдача сообщения в случае ошибки неверного ввода
Всем доброго дня! Использую MaskEdit для ввода даты формат: dd/mm/yyyy Помогите написать...

Авто подстановка даты MySQL
В ms sql можно было написать CREATE TABLE . ( INT NOT NULL IDENTITY (1, 1), DATETIME NOT...

Описать базовый класс автомобиль и от него наследуются классы: грузовые авто, уборочные авто, спортивные авто
Всем привет!:) хочу спросить кто нибудь писал программы с наследованием на С++? Интересны задачи...

Авто-абзацы в textbox
Как можно реализовать авто-абзацы в тексте, который мы ввели в текст бокс? То есть: Мы вводим...

Авто заполнение textBox'ов из БД
Никто не подскажет как это делается? Нужно сделать, но в интернете информации по этому вопросу не...

Авто форматирование TextBox
Доброго. Помогите реализовать. Нужно что бы при появление UserForm в TextBox1,2,3,4 были надписи...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru