我有以下代码.....
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
每当textbox2的值为零时,都会出现一个消息框,提示运行时错误11;被零除。我尝试使用用户建议的IIF条件来解决它 Scott Craner here
textbox3.value = cdbl(textbox1.value)/IIF(cdbl(textbox2.value) = 0 , 1 , cdbl(textbox2.value) )
我想知道如果分母为零,我是否能以某种方式将textbox3的值指定为“NULL”或“NA”或“ - ”。我在互联网上找不到任何可信的东西。
非常感谢!!
答案 0 :(得分:1)
最简单的方法是在进行计算之前检查分母值。然后一个简单的If ... else就足够了。
If textbox2.value = 0 Or IsEmpty(textbox2.Value) Then
textbox3.Value = "Null" 'Or "NA" or whatever you'd like
Else
textbox3.Value = cDbl(textbox1.Value) / CDbl(textbox2.Value)
End If
答案 1 :(得分:1)
你有这条线: -
textbox3.value = cdbl(textbox1.value) / cdbl(textbox2.value)
更改以下内容: -
textbox3.value = iif(cdbl(textbox2.value)=0,"N\A", cdbl(textbox1.value) / cdbl(textbox2.value))
这表明如果textbox2
为零,则输出'N \ A',否则正常进行除法(即textbox1
/ textbox2
)。
答案 2 :(得分:1)
替换所有代码: -
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
下一个检查会调用另一个执行检查的过程,以确保该值可以转换为double。例如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
希望这有帮助。