2015-10-03 4 views
3

У меня есть текстовое поле с именем «txtEndBalance» в форме. Я хочу, чтобы только числа были вставлены как часть проверки данных. Поэтому у меня есть событие On Error.Ошибка в событии изменения текста текстового поля Форма VBA

Теперь, когда я запускаю форму с помощью кнопки. Он напрямую переходит к ошибке, и у меня появляется окно с сообщением «Недопустимая сумма валюты». Это не должно было быть так.

И затем, когда я избавлюсь от всплывающего окна, пытаясь ввести число. И сразу, когда я вводим однозначное число, он снова вызывает эту ошибку.

Я понятия не имею, где я ошибаюсь в коде ниже, потому что я думаю, что все сделал правильно.

Просмотрите файл here, если вам нужно.

Private Sub txtEndBalance_Change() 

    On Error GoTo Error: 

    Dim amt As Currency 
    amt = txtEndBalance 
    txtEndBalance = Format(amt, "$##,###,##0") 
    Exit Sub 

Error: 
     If txtEndBalance <> "$" And txtEndBalance <> "" Then 
     MsgBox "Invalid currency amount", , "Error" 
     txtEndBalance = Format(0, "$##,###,##0") 
     End If 

End Sub 
+0

У меня нет ошибки, когда отображается пользовательская форма, я просто получаю сообщение об ошибке, если я ввожу текст в текстовое поле вместо цифр, также получаю сообщение об ошибке при нажатии кнопки команды, поскольку она пытается найти подфункция. – Davesexcel

ответ

2

Это сделает так, что могут быть введены только цифры. Поместите это событие KeyPress.

Private Sub txtEndBalance_KeyPress(KeyAscii As Integer) 

    'This is a check for backspace keypress. 
    If KeyAscii = 8 Then Exit Sub 

    'This will allow only numeric values in the text box. 
    If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then 
     KeyAscii = 0 
    End If 
End Sub 

Затем вы можете выполнить форматирование в событии изменения.

+1

Это также позволит удалить «On Error GoTo Error» и неправильное использование ключевого слова 'Error' в качестве метки –

0

Ваша основная проблема заключается в том, что amt объявлен как переменная валюты, и значение, которое вы пытаетесь назначить ему из поля textEndBalance, не является объектом Currency, поэтому ваш субпользователь бросает ошибку несоответствия типа и отбрасывает вас в ваш обработчик ошибок.

Причина, по которой это происходит при каждой загрузке формы, заключается в том, что вы устанавливаете значение поля txtEndBalance при загрузке в форматированную версию именованного диапазона. Это вызывает txtEndBalance_Change, и вы получаете ошибку несоответствия типа при попытке присвоить значение этого текстового поля переменной валюты amt.

Простое исправление было бы изменить, как вы заявляете АМТ переменную к чему-то, что соответствует - Dim amt As Variant работы, или, может быть, даже покончит с АМТ переменной и использовать что-то вроде txtEndBalance = Format(txtEndBalance.Value, "$##,###,##0")

Кроме того, как уже упоминалось в другом ответе , вы не должны использовать ключевое слово Error в качестве метки для обработчиков ошибок.

Смежные вопросы