Здравствуйте!!! Нужна помощь как можно обойтись без MaskEdBox, чтобы сделать маску ввода в TextBox ___-___-___ __ (111-111-111 11) самому написать код нехватает пока еще заниний в VBA.
Private Sub txt1_ГПС_Change() 'ГПС государственно пенсионное страхование 11 цифр по маске 354-456-987 56 ' SaveInfo ГПС, Me.txt1_ГПС End Sub
Private Sub txt1_ГПС_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'On Local Error Resume Next If Not IsNumeric(Chr$(KeyAscii)) Then KeyAscii = 0 ' если в поле введена не цифра, то отменяем ввод символа Else 'иначе делаем маску t = Me.txt1_ГПС ' считываем текст из textbox в переменную t If t Like "###" Or t Like "###-###" Then t = t & "-" ' добавляем разделитель после первых 3 и 6 цифр If t Like "###-###-###" Then t = t & " " ' добавляем разделитель после 9 цифр Me.txt1_ГПС = t ' записываем обработанный текст обратно в textbox End If End Sub
Private Sub txt1_ГПС_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) On Local Error Resume Next t = Me.txt1_ГПС ' считываем текст из textbox в переменную t
' если нажат backspace и последний символ - символ "-" или пробел, стираем 2 последних символа - "-" и последнюю цифру If KeyCode = 8 And (Right(t, 1) = "-" Or Right(t, 1) = " ") Then t = Left$(t, Len(t) - 2): KeyCode = 0
If KeyCode <> 8 And KeyCode <> Asc(vbTab) And Len(t) >= 14 Then KeyCode = 0 ' ограничение на количество введённых символов Me.txt1_ГПС = t ' записываем обработанный текст обратно в textbox End Sub
Вам над только заменить txt1_ГПС на название вашего текстбокса.
Спасибо, если ничего не найду лучше, то воспользуюсь этим кодом. Надо просто обезопасить ввод значений пользовалтеля по максиммуму. по этой Маске поcле полного ее заполнения перемещать курсор стрелками нельзя, а если удалить последний символ и добавить в первый значение уже изменяется т. е. будет ####-###-### # и если ошибся на одну циру и захочешь ее отредактировать с редактированием уже возникают пролемы.
Const MaskFiller As String = "__.__.__" ' Private Sub TextBox1_Enter() With Me.TextBox1 If Not (.Text Like "##.##.##") Then .Text = MaskFiller End If If Len(.Tag) = 0 Then Application.SendKeys "{INSERT}" .Tag = "-1" End If End With End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) Me.Tag = vbNullString End Sub
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim iPos As Integer Dim iL As Integer Dim iR As Integer Dim s As String With Me.TextBox1 s = .Text iPos = Int(.Tag) 'Позиция курсора Select Case iPos Case -1 iPos = 0 GoTo SetPos Case 0 If KeyCode < Asc("0") Or KeyCode > Asc("3") Then GoTo NavigateKey Else Mid$(s, iPos + 1, 1) = Chr$(KeyCode) iPos = 1 End If Case 1 Select Case Left$(.Text, 1) Case "0" iL = Asc("1") iR = Asc("9") Case "1", "2" iL = Asc("0") iR = Asc("9") Case "3" iL = Asc("0") iR = Asc("1") End Select If KeyCode < iL Or KeyCode > iR Then GoTo NavigateKey Else Mid$(s, iPos + 1, 1) = Chr$(KeyCode) iPos = 3 End If Case 3 If KeyCode = Asc("0") Or KeyCode = Asc("1") Then Mid$(s, iPos + 1, 1) = Chr$(KeyCode) iPos = 4 Else GoTo NavigateKey End If Case 4 If Mid$(Me.TextBox1.Text, 4, 1) = "0" Then iL = Asc("1") iR = Asc("9") Else iL = Asc("0") iR = Asc("2") End If If KeyCode < iL Or KeyCode > iR Then GoTo NavigateKey Else Mid$(s, iPos + 1, 1) = Chr$(KeyCode) iPos = 6 End If Case 6, 7 If KeyCode < Asc("0") Or KeyCode > Asc("9") Then GoTo NavigateKey Else Mid$(s, iPos + 1, 1) = Chr$(KeyCode) iPos = IIf(iPos = 6, 7, 0) End If End Select GoTo Repaint NavigateKey: Select Case KeyCode Case 37 'Left Select Case iPos Case 1, 4, 7 iPos = iPos - 1 Case 3, 6 iPos = iPos - 2 End Select Case 39 'Right Select Case iPos Case 0, 3, 6 iPos = iPos + 1 Case 1, 4 iPos = iPos + 2 End Select Case 27 'Esc iPos = 0 Case 9 'Tab Exit Sub End Select Repaint: KeyCode = 0 .Text = s SetPos: .SelStart = iPos .SelLength = 1 .Tag = Format$(iPos, "0") End With End Sub