首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用And而不是分支会导致#REF错误

使用And而不是分支会导致#REF错误
EN

Stack Overflow用户
提问于 2018-11-21 03:42:06
回答 2查看 48关注 0票数 0

我已经用VBA编写了一个非常简单的函数,它使用3个参数通过一个表达式来计算某个值。问题是,如果其中一个参数不是数字或小于或等于0,函数还必须显示特定的消息框。

因此,在我的第一次尝试中,我想出了以下代码

代码语言:javascript
复制
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错误,即使它们都是数字和正数。

所以我尝试了一种更直接的方法

代码语言:javascript
复制
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

它就像一个护身符。那么我到底做错了什么呢?

EN

回答 2

Stack Overflow用户

发布于 2018-11-21 03:51:53

如果所有的数字都大于0,你至少需要Exit Function。在下面的例子中,我返回了一个Variant。你不需要另一个Exit Functions。您可以让程序运行到最后,并返回您认为合适的任何值。您还可以考虑在函数签名中强制使用类型,然后添加错误处理。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2018-11-21 04:34:01

将结果设置为fail值作为函数的第一步意味着您将始终返回一个有效值。反转逻辑以提前结束函数可以使代码更具可读性。

代码语言:javascript
复制
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 Function
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53400413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档