Здравствуйте. Ребята в текстовом поле уставлен код ввода только числового значения.
[vba]
Код
Sub Ostatok() 'Ввод числового значения On Error Resume Next 'Обработчик ошибок Dim NumberSize As Double 'Double - Число дробное, с плавающей точкой NumberSize = FormReport.TxbResidue.Value 'Вод в поле объекта только числовые и дробные значения с плавающей точкой
If Err Then 'Условие - Предупреждение об ошибки при вводе не числового значения FormReport.Label18.Caption = "Ошибка при записи числового значения" FormReport.TxbResidue.Value = "" 'Очистка объекта Else End If End Sub
[/vba] При вводе вручную, условие выполняется, а при загрузке в текстбокс (TxbResidue) с ячейки, на дробные значения срабатывает ошибка, в тоже время вручную дробные значения тоже вводятся. В чем может быть причина, где что поправить?
Здравствуйте. Ребята в текстовом поле уставлен код ввода только числового значения.
[vba]
Код
Sub Ostatok() 'Ввод числового значения On Error Resume Next 'Обработчик ошибок Dim NumberSize As Double 'Double - Число дробное, с плавающей точкой NumberSize = FormReport.TxbResidue.Value 'Вод в поле объекта только числовые и дробные значения с плавающей точкой
If Err Then 'Условие - Предупреждение об ошибки при вводе не числового значения FormReport.Label18.Caption = "Ошибка при записи числового значения" FormReport.TxbResidue.Value = "" 'Очистка объекта Else End If End Sub
[/vba] При вводе вручную, условие выполняется, а при загрузке в текстбокс (TxbResidue) с ячейки, на дробные значения срабатывает ошибка, в тоже время вручную дробные значения тоже вводятся. В чем может быть причина, где что поправить?Сергей13
Сообщение отредактировал Сергей13 - Понедельник, 22.04.2019, 11:00
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 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
[/vba]
Лень разбираться. [vba]
Код
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 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
RAN, В ниже предоставленном примере, тип данных Double вполне устраивает, дополнительные навороты могут усложнить взаимосвязи в рабочем файле. Дело в том, что ручной ввод в текстбокс и ввод с текстбокса в ячейку осуществляется корректно как целых, так и дробных значений, а вот загрузка с ячейки в текстбокс (при открытии формы) корректна только для целых значений, на дробные выдает ошибку. Для полного понимания о чем я, скидываю тестовый пример (для тестирования необходимо изменять значение в ячейке или в текстбоксе в пределах не более 8 знаков при этом открывать и закрывать форму).
RAN, В ниже предоставленном примере, тип данных Double вполне устраивает, дополнительные навороты могут усложнить взаимосвязи в рабочем файле. Дело в том, что ручной ввод в текстбокс и ввод с текстбокса в ячейку осуществляется корректно как целых, так и дробных значений, а вот загрузка с ячейки в текстбокс (при открытии формы) корректна только для целых значений, на дробные выдает ошибку. Для полного понимания о чем я, скидываю тестовый пример (для тестирования необходимо изменять значение в ячейке или в текстбоксе в пределах не более 8 знаков при этом открывать и закрывать форму).Сергей13
У вас их столько, что вам это уже давно не страшно. По поводу ошибки. Если textbox записывать textbox.Value, Excel ведет себя не совсем адекватно. Может неделю, или больше работать корректно, а после начать выдавать ошибку. С чем это связано, так и не понял. Например, у меня, в данный момент, ваш код отрабатывает без проблем. Поэтому, в textbox нужно писать не textbox.Value, а textbox.Text. Вторая часть проблемы в том, что при преобразовании текста 10.25 в число ( а в textbox всегда text), нудно использовать функцию Val(), а при преобразовании 10,25 - функцию CDbl(). Чтобы с этим не париться, предложенный код просто не позволит ввести в textbox ничего, кроме цифр, и одной запятой. При этом, при попытке ввести точку, она будет преобразована в запятую. И весь код будет выглядеть так [vba]
Код
Private Sub CommandButton1_Click() 'Событие щелчок Range("D2").Value = CDbl(TxbResidue.Text) 'Ввод числового значения в ячейку End Sub
Private Sub TxbResidue_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Select Case KeyAscii Case 48 To 57 Case 46, 44: If TxbResidue Like ("*,*") Then KeyAscii = 0 Else KeyAscii = 44 '[","."] Case Else: KeyAscii = 0 End Select End Sub
Private Sub UserForm_Initialize() 'Событие открытия формы FormReport TxbResidue.Text = CDbl(Range("D2").Value) 'Загрузка числового значения из ячейки End Sub
[/vba] И, при этом, он не раскидан по всему проекту.
PS Мне прямо интересно смотреть, с каким мазохистским удовольствием вы, в своем проекте, вводите кучу не нужных Public переменных, вытаскиваете код из модуля формы в стандартный модуль, и т.д, и т.п...
У вас их столько, что вам это уже давно не страшно. По поводу ошибки. Если textbox записывать textbox.Value, Excel ведет себя не совсем адекватно. Может неделю, или больше работать корректно, а после начать выдавать ошибку. С чем это связано, так и не понял. Например, у меня, в данный момент, ваш код отрабатывает без проблем. Поэтому, в textbox нужно писать не textbox.Value, а textbox.Text. Вторая часть проблемы в том, что при преобразовании текста 10.25 в число ( а в textbox всегда text), нудно использовать функцию Val(), а при преобразовании 10,25 - функцию CDbl(). Чтобы с этим не париться, предложенный код просто не позволит ввести в textbox ничего, кроме цифр, и одной запятой. При этом, при попытке ввести точку, она будет преобразована в запятую. И весь код будет выглядеть так [vba]
Код
Private Sub CommandButton1_Click() 'Событие щелчок Range("D2").Value = CDbl(TxbResidue.Text) 'Ввод числового значения в ячейку End Sub
Private Sub TxbResidue_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Select Case KeyAscii Case 48 To 57 Case 46, 44: If TxbResidue Like ("*,*") Then KeyAscii = 0 Else KeyAscii = 44 '[","."] Case Else: KeyAscii = 0 End Select End Sub
Private Sub UserForm_Initialize() 'Событие открытия формы FormReport TxbResidue.Text = CDbl(Range("D2").Value) 'Загрузка числового значения из ячейки End Sub
[/vba] И, при этом, он не раскидан по всему проекту.
PS Мне прямо интересно смотреть, с каким мазохистским удовольствием вы, в своем проекте, вводите кучу не нужных Public переменных, вытаскиваете код из модуля формы в стандартный модуль, и т.д, и т.п... RAN
RAN, Вы правы, начал гармонично а закончил хаотично, как говорил один из ярких представителей "слуг" народа, "хотели как лучше, а получилось как всегда"… Понял что валуе не есть панацея, а текст не есть валуе. Ребята, krosav4ig, RAN , спасибо за предоставленные варианты!
RAN, Вы правы, начал гармонично а закончил хаотично, как говорил один из ярких представителей "слуг" народа, "хотели как лучше, а получилось как всегда"… Понял что валуе не есть панацея, а текст не есть валуе. Ребята, krosav4ig, RAN , спасибо за предоставленные варианты!Сергей13