替换所有代码:-
private sub textbox1_change()
if textbox1.value = "" then exit sub
if textbox2.value = "" then exit sub
textbox3.value = cdbl(textbox1.value) / cdbl(textbox2.value)
end sub
private sub textbox2_change()
if textbox1.value = "" then exit sub
if textbox2.value = "" then exit sub
textbox3.value = cdbl(textbox1.value) / cdbl(textbox2.value)
end sub
使用此代码:-
Private Sub textbox1_change()
ShowResult
End Sub
Private Sub textbox2_change()
ShowResult
End Sub
Private Sub ShowResult()
Dim Str1 As String
Dim Str2 As String
Str1 = Trim(textbox1.Value)
Str2 = Trim(textbox2.Value)
If (Str1 = "") Or (Str2 = "") Then Exit Sub
If (IsDouble(Str1) = False) Or (IsDouble(Str2) = False) Then
textbox3.Value = "N\A"
Else
If (CDbl(Str2) = 0) Or ((CDbl(Str2) + CDbl(Str1)) = 0) Then
textbox3.Value = "N\A"
Else
textbox3.Value = CDbl(Str1) / CDbl(Str2)
End If
End If
End Sub
Private Function IsDouble(ByVal StrValue As String) As Boolean
Dim DblTest As Double
On Error GoTo ErrorHandle
DblTest = CDbl(StrValue)
IsDouble = True
Exit Function
ErrorHandle:
Err.Clear
End Function
这将检查不能为 Double 数据类型(即字符串)和错误除法(即错误代码 6 和 11)的值。
编辑:-
下面是上述代码中发生的事情的演练。
程序textbox1_change 和textbox2_change 做同样的事情以避免代码重复;他们都调用了该代码的一个实例。
Private Sub textbox1_change()
ShowResult
End Sub
Private Sub textbox2_change()
ShowResult
End Sub
之后,有一个新的过程ShowResult 保存textbox1_change 和textbox2_change 调用的代码的单个实例。
Private Sub ShowResult()
Dim Str1 As String
Dim Str2 As String
Str1 = Trim(textbox1.Value)
Str2 = Trim(textbox2.Value)
If (Str1 = "") Or (Str2 = "") Then Exit Sub
If (IsDouble(Str1) = False) Or (IsDouble(Str2) = False) Then
textbox3.Value = "N\A"
Else
If (CDbl(Str2) = 0) Or ((CDbl(Str2) + CDbl(Str1)) = 0) Then
textbox3.Value = "N\A"
Else
textbox3.Value = CDbl(Str1) / CDbl(Str2)
End If
End If
End Sub
ShowResult 代码会进行多项检查。
首先它将textbox1 放入Str1 和textbox2 放入Str2 并在它们上使用trim。修剪意味着删除了前导和尾随空格。例如,如果textbox1 的值为“”(可能由用户复制和粘贴完成),那么从技术上讲它不是空的,可能会导致错误。
Dim Str1 As String
Dim Str2 As String
Str1 = Trim(textbox1.Value)
Str2 = Trim(textbox2.Value)
下一个检查是如果任何一个值为空然后退出过程,就像你之前做的那样,但现在在一行。
If (Str1 = "") Or (Str2 = "") Then Exit Sub
下一个检查调用另一个过程,该过程进行检查以确保值可以转换为双精度值。例如 CDbl("Hello World!") 会失败,因为它不是一个开头的数字。所以这个检查绕过了这个潜在的问题,如果它不是一个可以除的数字,那么输出'N\A'。
If (IsDouble(Str1) = False) Or (IsDouble(Str2) = False) Then
textbox3.Value = "N\A"
最后的检查是,如果第二个值为零或两者都为零,则输出“N\A2,否则除法完成并输出。
If (CDbl(Str2) = 0) Or ((CDbl(Str2) + CDbl(Str1)) = 0) Then
textbox3.Value = "N\A"
Else
textbox3.Value = CDbl(Str1) / CDbl(Str2)
End If
这是ShowResult 调用的最后一个过程,用于检查值是否可以转换为Double 数据类型。它尝试进行转换,如果发生错误则清除错误并将false(默认)返回给调用者,如果没有错误则输出true。
Private Function IsDouble(ByVal StrValue As String) As Boolean
Dim DblTest As Double
On Error GoTo ErrorHandle
DblTest = CDbl(StrValue)
IsDouble = True
Exit Function
ErrorHandle:
Err.Clear
End Function
希望这会有所帮助。