EXCEL , VBA Ввод данных в контрол типа TextBox
Формулировка задачи:
СПАСИБО
Решение задачи: «EXCEL , VBA Ввод данных в контрол типа TextBox»
textual
Листинг программы
'Вот такой получился у меня код:
'
Private Sub txt_КД_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'Для корректной работы процедуры ввода числовой информации в TextBox, неободимо запретить
'вставку скопированных данных в TextBox, копирование, вырезание и удаление данных из TextBox
Select Case KeyCode
Case vbKeyC And Shift = 2 'Копировать CTRL+C
KeyCode = 0
Case vbKeyV And Shift = 2 'Вставить CTRL+V
KeyCode = 0
Case vbKeyX And Shift = 2 'Вырезать CTRL+X
KeyCode = 0
Case vbKeyDelete 'Удалить DELETE
KeyCode = 0
End Select
End Sub
'txt_КД - это TextBox, в который пользователь вводит информацию.
'Тип информации – только ЧИСЛОВОЙ, количество знаков до десятичного разделителя определяется переменной LimDig (6 в примере).
'Переменная DecComa определяет количество десятичных разрядов (2 в примере), максимальое - 8.
'Увеличить количество знаков после десятичного разделителя (точки или запятой) просто, - добавьте "решеток" (#) в строке FndComa.
'
'Особенности кода:
'-если ввод начат с нуля, к нему добавляется десятичный разделитель;
'-если ввод начат с десятичного разделителя добавляется ведущий ноль;
'-введеная в поле точка, заменяется на запятую.
'
Private Sub txt_КД_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
On Error Resume Next
Dim txt_X As Object
Set txt_X = Me.txt_КД
'количество знаков до десятичного разделителя
Dim LimDig As Integer
LimDig = 6
'количество десятичных разрядов
Dim DecComa As Integer
DecComa = 2
'строка для поиска знаков после разделителя
Dim FndComa As String
FndComa = "*," & Left("########", DecComa)
'считываем текст из textbox в переменную t
Dim t As String
t = txt_X.Value
'флаг присутствия десятичного разделителя
Dim FlagComa As Integer
FlagComa = 0
If InStr(1, t, ",") Then FlagComa = 1 'запятая
'проверим не превышено ли количество знаков до разделителя
If (Len(t) >= (LimDig + FlagComa)) And txt_X.SelStart <= LimDig And KeyAscii <> 44 Then KeyAscii = 0
Select Case KeyAscii
'цифры 1 - 9 и <backspace> (эти символы всегда разрешены)</backspace>
Case 49 To 57, 8
'обработка цифры 0
Case 48
'если ввод начат с нуля добавим десятичный разделитель
If txt_X.SelStart < 1 Then
t = "0"
KeyAscii = 44
End If
'обработка десятичного разделителя (44 - код запятой, 46 - код точки)
Case 44, 46
'если в поле введена точка, то заменим ее на запятую
KeyAscii = 44
'если ввод начат с десятичного разделителя добавим ведущий ноль
If txt_X.SelStart < 1 Then t = "0" & t
If FlagComa Then KeyAscii = 0 'вторую запятую нельзя
'------------если нужен дефис (минус перед числом), раскоментируйте код---------------
'Case 45
' If InStr(1, txt_X.Text, "-") Then KeyAscii = 0 'второй минус нельзя
' If txt_X.SelStart Then KeyAscii = 0 'минус допустим только перед числом
'-------------------------------------------------------------------------------------
Case Else
'остальные символы запрещены
KeyAscii = 0
End Select
'проверим не превышено ли количество десятичных разрядов
If t Like (FndComa) And txt_X.SelStart >= Len(t) - DecComa Then KeyAscii = 0
'записываем обработанный текст обратно в textbox
txt_X.Value = t
'txt_X = Int(t * 100) / 100
End Sub