从VBA文本框中删除值时阻止调试器

从VBA文本框中删除值时阻止调试器,vba,excel,textbox,excel-2013,Vba,Excel,Textbox,Excel 2013,我的用户表单有几个文本框,用户可以编辑它们,但有人告诉我它正在调试。经过一点调查,我发现用户正在从文本框中删除该值,这导致运行时错误13。如果用户删除该值并且servcredit文本框变为vbnullstring,如何停止运行时错误 目前,文本框包含以下两段代码 将数值输入背面的excel表格。 Private Sub ServCredit_Change() Worksheets("Calculator").Range("L18") = CDec(ServCredit) End Sub P

我的用户表单有几个文本框,用户可以编辑它们,但有人告诉我它正在调试。经过一点调查,我发现用户正在从文本框中删除该值,这导致运行时错误13。如果用户删除该值并且
servcredit
文本框变为
vbnullstring
,如何停止运行时错误

目前,文本框包含以下两段代码

将数值输入背面的excel表格。

Private Sub ServCredit_Change()

Worksheets("Calculator").Range("L18") = CDec(ServCredit)

End Sub
Private Sub ServCredit_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If (KeyAscii > 47 And KeyAscii < 58) Or KeyAscii = 46 Or KeyAscii = 32 Then
KeyAscii = KeyAscii
Else
KeyAscii = 0
MsgBox "Invalid Key Pressed"
End If

End Sub
这确保用户不会输入无数字的数字。

Private Sub ServCredit_Change()

Worksheets("Calculator").Range("L18") = CDec(ServCredit)

End Sub
Private Sub ServCredit_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If (KeyAscii > 47 And KeyAscii < 58) Or KeyAscii = 46 Or KeyAscii = 32 Then
KeyAscii = KeyAscii
Else
KeyAscii = 0
MsgBox "Invalid Key Pressed"
End If

End Sub
Private Sub-ServCredit\u按键(ByVal-keyscii作为MSForms.ReturnInteger)
如果(KeyAscii>47和KeyAscii<58)或KeyAscii=46或KeyAscii=32,则
keyscii=keyscii
其他的
KeyAscii=0
MsgBox“按下的键无效”
如果结束
端接头

首先需要检查
ServCredit
是否为数字
CDec
无法将vbNullString强制转换为数字

If IsNumeric(ServCredit) then
    Worksheets("Calculator").Range("L18") = CDec(ServCredit)
else
    Worksheets("Calculator").Range("L18") = 0
End If

您可以简单地测试是否存在以下值:

Private Sub ServCredit_Change()

If Len(ServCredit.Text) <> 0 then
   Worksheets("Calculator").Range("L18").Value2 = CDec(ServCredit)
Else
   Worksheets("Calculator").Range("L18").Value2 = vbnullstring
end if
End Sub
Private Sub-ServCredit\u Change()
如果Len(ServCredit.Text)为0,则
工作表(“计算器”).Range(“L18”).Value2=CDec(ServCredit)
其他的
工作表(“计算器”).Range(“L18”).Value2=vbnullstring
如果结束
端接头

但这会将
工作表(“计算器”).Range(“L18”)
设置为在
ServCredit
中输入的最后一个值,这可能会导致错误的计算。如果文本框值为例如
152
,并且您使用backspace删除所有3位数字,则L18将保持
1
。最安全的方法是对照数值进行检查,如果不是,则将其设置为
0
。您的解决方案依赖于只能输入数字。@Peh我同意最好清除单元格。这个问题清楚地表明,该控件已经过验证,可以防止非数字输入;它对于来自任何其他子系统或函数的VBA注入(如
ServCredit.Text=“aa”
)是不安全的。这也将触发更改事件并导致异常。对函数(在本例中为文本框)的任何错误输入都不应以未处理的异常结束,但在这里它确实如此
cdec
需要数值,所以我用数值进行测试。是的,但我假设开发人员会知道他的代码是否会这样做。