Страницы: 1
RSS
TextBox (событие KeyPress): выводятся не все символы (значения)
 
Всем доброго времени суток!

Пытаюсь вводить данные (в процентах) в ячейку C4 через TextBox (с формы). При этом, делаю ограничение на ввод ненужных символов.
Есть вот такой код:
Код
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

Z = UserForm1.TextBox1.Value
ActiveWorkbook.Sheets("Лист1").Range("C4").Value = Z & "%"
If IsNumeric(ChrW(KeyAscii)) Then
ElseIf 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
 KeyAscii = 0
End If

End Sub
Код работает отлично! НО! Проблема вот в чем: когда, например, я ввожу "123", то в ячейке С4 отражается только "12", то есть "3" не отображается, чтобы отразить "3" необходимо ввести следующий символ, который пользователь вводить и не планирует. Прошу помощи. Как сделать так, чтобы в ячейке С4 сразу выводились все значения?
Файл во вложении.
 
Код
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  Const Dgt$ = "1234567890"
  Dim z
  z = UserForm1.TextBox1.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, Chr(KeyAscii)) = 0 Then KeyAscii = 0
  End If
  ActiveWorkbook.Sheets("Лист1").Range("C4").Value = z & IIf(KeyAscii = 0, "", Chr(KeyAscii)) & "%"
End Sub
так немного лучше, НО! нажатия Backspace и Delete никак не отражаются на значении в С4(((
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
НО! нажатия Backspace и Delete никак не отражаются на значении в С4(((
Код
Private Sub TextBox1_Change()
  ActiveWorkbook.Sheets("Лист1").Range("C4").Value = TextBox1 & IIf(TextBox1 = "", "", "%")
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  Const Dgt$ = "1234567890"
  Dim z
  z = UserForm1.TextBox1.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, Chr(KeyAscii)) = 0 Then KeyAscii = 0
  End If
End Sub
 
Код
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
' вывод в числа в ячейку
End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
' код процедуры один для всех TextBox
    Dim dsep$: dsep = Me.ActiveControl.Value
    KeyAscii = DoubleBox_KeyPress(KeyAscii, dsep)
End Sub
Function DoubleBox_KeyPress(ByVal KeyAsci As Integer, dsep As String)
    Select Case KeyAsci
    Case 48 To 57: DoubleBox_KeyPress = KeyAsci
    Case 46, 44: If dsep Like ("*,*") Then DoubleBox_KeyPress = 0 Else DoubleBox_KeyPress = 44    '[","."]
    Case Else: DoubleBox_KeyPress = 0
    End Select
End Function
 
Все работает! Всем спасибо!
 
Приветствую еще раз!
Я использовал код, предложенный AAF, все работает, но я обнаружил один момент! Когда вводишь в textbox целое число, то все отлично, но когда вводишь дробное число, например, 18,3, то ячейка С4 превращается в ту самую текстовую ячейку, которая требует преобразование в число. Это происходит, как только появляется запятая в числе. CDbl, Val и Replace не помогли. Пробовал разные комбинации, например вот такую:
Код
ActiveWorkbook.Sheets("Лист1").Range("C4").Value = CDbl(Val(TextBox1 & IIf(TextBox1 = "", "", "%")))
но выдает ошибку, наверное из-за "%".
Пробовал убирать "%", но получается ерунда.

Как можно исправить этот момент?
 
Код
Private Sub TextBox1_Change()
  ActiveWorkbook.Sheets("Лист1").Range("C4").Value = Replace(TextBox1 & IIf(TextBox1 = "", "", "%"), ",", ".")
End Sub
 
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  Const Dgt$ = "1234567890"
  Dim z
  z = UserForm1.TextBox1.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
Изменено: AAF - 11.12.2017 23:25:41
 
Все отлично!
Благодарю за помощь!  
 
Цитата
samik написал:
Как можно исправить этот момент?
Вводить число не частями (по TextBox1_Change), а целиком (по TextBox1_Exit)
Страницы: 1
Наверх