Создание маски ввода в TextBox с помощью кода VBA Excel на примере номера телефона и номера паспорта. Применимо для набора номера с клавиатуры.
TextBox и маска ввода в VBA Excel
В отличие от VBA Access в VBA Excel нет свойства InputMask объекта TextBox. Поэтому, чтобы добавить подобие маски для TextBox в VBA Excel, приходится писать дополнительную процедуру, контролирующую действия пользователя и добавляющую в нужные места вводимого номера знаки-разделители.
В следующих примерах мы будем создавать простые маски ввода в TextBox с помощью события TextBox_Change и оператора Select Case. Маска будет добавляться при вводе символов с клавиатуры. При вставке номера из буфера обмена, добавление маски не предусмотрено.
Мы не будем добавлять автоматическую проверку вводимого знака (цифра или другой символ), так как после ввода с клавиатуры в любом случае требуется зрительная проверка введенного номера.
Также, при редактировании полностью введенного номера, не стоит удалять более 1 цифры, иначе структура маски может будет нарушена.
Маска ввода номера телефона
Простой код для создания маски ввода номера телефона в TextBox в формате «+7(000)000-00-00»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Private Sub TextBox1_Change() With TextBox1 Select Case Len(.Text) Case 1 'После ввода первого знака добавляем перед ним код страны и скобку .Text = "+7(" & .Text Case 6 'После ввода шестого знака добавляем в конце скобку .Text = .Text & ")" Case 10, 13 'После ввода десятого и тринадцатого знака добавляем в конце дефис .Text = .Text & "-" Case 17 'Удаляем семнадцатый знак сразу после его ввода .Text = Left(.Text, 16) End Select End With End Sub |
Строки кода VBA Excel:
1 2 3 |
Case 17 'Удаляем семнадцатый знак сразу после его ввода .Text = Left(.Text, 16) |
ограничивают длину строки, вводимой в TextBox, их можно заменить на установку максимальной длины при инициализации формы:
1 2 3 |
Private Sub UserForm_Initialize() TextBox1.MaxLength = 16 End Sub |
Если ограничение строки установить при инициализации формы, при ручном редактировании введенного номера можно удалять две цифры без риска нарушить структуру маски.
Маска ввода номера паспорта
Простой код для создания маски ввода номера паспорта в TextBox в формате «00 00 000000»:
1 2 3 4 5 6 7 8 9 10 11 12 |
Private Sub TextBox2_Change() With TextBox2 Select Case Len(.Text) Case 2, 5 'После ввода второго и пятого знака добавляем в конце пробел .Text = .Text & " " Case 13 'Удаляем тринадцатый знак сразу после его ввода .Text = Left(.Text, 12) End Select End With End Sub |
Если ограничение строки установить при инициализации формы:
1 2 3 |
Private Sub UserForm_Initialize() TextBox2.MaxLength = 12 End Sub |
тогда при ручном редактировании введенного номера можно удалять две цифры без риска нарушить структуру маски.
Я знаю точно, что код работает, а в vb6 в текстовом поле курсор постоянно перемещается после каждого ввода цифры в исходное положение, подскажите, разницы то я думаю нет, что VBA, что VB6
Дмитрий, попробуйте задать маску в VB6 с помощью элемента управления Masked Edit. Библиотека Microsoft Masked Edit Control 6.0 должна быть подключена. Посмотрел в VB 2012, который у меня установлен, там есть элемент управления MaskedTextBox, но в VB6, скорее всего, его нет.
У меня работает по такому же принципу, только через IF, но тормозит сама склейка. Я пробовал склеивать в текстбоксе и в отдельной переменной — не помогает. При склеивании пауза на 1-2 сек.
Интересно! Я, в своё время, выкрутился по другому:
Sub ............()
TextBox1.Text = Range("A1")
If Range("A1").Value = "" Then
TextBox1.Text = Format(TextBox1.Text, "&& && &&&&&&")
End If
Range("A1").Value = TextBox1.Text
End Sub
Обсуждение закрыто.