我已经用VBA编写了一个非常简单的函数,它使用3个参数通过一个表达式来计算某个值。问题是,如果其中一个参数不是数字或小于或等于0,函数还必须显示特定的消息框。
因此,在我的第一次尝试中,我想出了以下代码
Function refraction(a, b, c)
If IsNumeric(a) And IsNumeric(b) And IsNumeric(c) Then
If (a > 0) And (b > 0) And (c > 0) Then
refraction = (a ^ 2 - 1) * b / c / (a ^ 2 + 2)
Else
MsgBox "Range!"
Exit Function
End If
Else
MsgBox "Number!"
Exit Function
End If
End Function无论参数是什么,它都会返回一个#REF错误,即使它们都是数字和正数。
所以我尝试了一种更直接的方法
Function refrakcja(a, b, c)
If IsNumeric(a) Then
If IsNumeric(b) Then
If IsNumeric(c) Then
If a > 0 Then
If b > 0 Then
If c > 0 Then
refrakcja = (a ^ 2 - 1) * b / c / (a ^ 2 + 2)
Else
MsgBox "Range!"
Exit Function
End If
Else
MsgBox "Range!"
Exit Function
End If
Else
MsgBox "Range!"
Exit Function
End If
Else
MsgBox "Number!"
Exit Function
End If
Else
MsgBox "Number"
Exit Function
End If
Else
MsgBox "Number!"
Exit Function
End If
End Function它就像一个护身符。那么我到底做错了什么呢?
发布于 2018-11-21 03:51:53
如果所有的数字都大于0,你至少需要Exit Function。在下面的例子中,我返回了一个Variant。你不需要另一个Exit Functions。您可以让程序运行到最后,并返回您认为合适的任何值。您还可以考虑在函数签名中强制使用类型,然后添加错误处理。
Option Explicit
Public Sub test()
Debug.Print refraction(12, -4, 3)
End Sub
Public Function refraction(ByVal a As Variant, ByVal b As Variant, ByVal c As Variant) As Variant
Dim ref2 As Long
If IsNumeric(a) And IsNumeric(b) And IsNumeric(c) Then
If (a > 0) And (b > 0) And (c > 0) Then
ref2 = (a ^ 2 - 1) * b / c / (a ^ 2 + 2)
refraction = ref2
Exit Function
Else
MsgBox "Range!"
End If
Else
MsgBox "Number!"
End If
refraction = "Invalid values passed"
End Function发布于 2018-11-21 04:34:01
将结果设置为fail值作为函数的第一步意味着您将始终返回一个有效值。反转逻辑以提前结束函数可以使代码更具可读性。
Function refraction(ByVal a As Double, ByVal b As Double, ByVal c As Double) As Variant
refraction = vbEmpty
If Not (IsNumeric(a) And IsNumeric(b) And IsNumeric(c)) Then
MsgBox "A parameter was not numeric"
Exit Function
End If
If Not ((a > 0) And (b > 0) And (c > 0)) Then
MsgBox "A parameter was negative"
Exit Function
End If
refraction = (a ^ 2 - 1) * b / c / (a ^ 2 + 2)
End Functionhttps://stackoverflow.com/questions/53400413
复制相似问题