在函数中使用 IsNumeric

Posted

技术标签:

【中文标题】在函数中使用 IsNumeric【英文标题】:Using IsNumeric in a function 【发布时间】:2019-06-21 16:53:08 【问题描述】:

我编写了一个函数,它根据输入单元格生成一个“分数”(1,0,-1),该单元格应该包含一个数字。但是,有时输入字段可能不是数字,然后函数应该返回输出“0”。

Function ScoreRoE(RoE_Field As Range, goodval As Range, badval As Range)

    Dim RoE As Double, result As Double

    RoE = RoE_Field.Value

        If IsNumeric(RoE_Field.Value) = False Then
            result = "0"
        Else:
            If RoE >= goodval.Value Then
                result = "1"
            ElseIf RoE <= badval.Value Then
                result = "-1"
            Else:
                result = "0"
            End If
        End If

    ScoreRoE = result

End Function

当输入单元格是数字时,函数可以正常工作。但是,如果不是,则不会,只会返回错误“#VALUE!”

提前非常感谢!

【问题讨论】:

在为 ROE 分配初始值之前进行数字测试。否则,您可能会将一个字符串分配给一个双精度数,而那里的事情看起来并不乐观。 【参考方案1】:

将 RoE 声明为变体:

Function ScoreRoE(RoE_Field As Range, goodval As Range, badval As Range)

    Dim RoE As Variant, result As Double

    RoE = RoE_Field.Value

        If Not IsNumeric(RoE) Then
            result = 0
        Else
            If RoE >= goodval.Value Then
                result = 1
            ElseIf RoE <= badval.Value Then
                result = -1
            Else
                result = 0
            End If
        End If

    ScoreRoE = result

End Function

您不能将文本值分配给双精度值。


我个人认为不需要任何变量:

Function ScoreRoE(RoE_Field As Range, goodval As Range, badval As Range)

    If Not IsNumeric(RoE_Field.Value) Then
        ScoreRoE = 0
    Else
        If RoE_Field.Value >= goodval.Value Then
            ScoreRoE = 1
        ElseIf RoE_Field.Value <= badval.Value Then
            ScoreRoE = -1
        Else
            ScoreRoE = 0
        End If
    End If

End Function

【讨论】:

@ForwardEd ¯\_(ツ)_/¯ 除了击键之外,使用 RoE 而不是直接处理 RoE_Field.Value 是否有特殊原因? @ForwardEd 我个人认为不需要使用任何变量,但希望尽可能接近 OP 使用的变量。 不是它是必需的,但不应该为函数分配一个变量类型而不是让它默认为变体吗? @yannk 如果您想要更精简,请在开始时定义ScoreROE=0。然后检查RoE_Field.Value 是否为数字。然后,如果它是做你的两个检查好价值然后坏价值。其他所有内容都将为零,因为那是您在开始时初始化的内容。【参考方案2】:

这是对代码意图的解释:

Function ScoreRoe(roeInput As String, goodVal As String, badVal As String) As String

    If Not IsNumeric(roeInput) Or Not IsNumeric(goodVal) Or Not IsNumeric(badVal) Then
        ScoreRoe = "0"
    Else
        Dim goodValNumeric As Double: goodValNumeric = goodVal
        Dim badValNumeric As Double: badValNumeric = badVal
        Dim roeInputNumeric As Double: roeInputNumeric = roeInput

        If roeInputNumeric >= goodValNumeric Then
            ScoreRoe = "1"
        ElseIf roeInputNumeric <= badValNumeric Then
            ScoreRoe = "-1"
        Else
            ScoreRoe = "0"
        End If
    End If

End Function

主要思想是将输入作为String,然后转换为Double进行比较。然后如果输入不是数字,则返回值为0,如果是,我们通过If-Else。

一般来说,在 VBA 中避免 : If-Else 可能是一个好主意,以避免出现像这样的不必要的问题 - VBA - How the colon `:` works in VBA code with condition

【讨论】:

有趣的情况。不是我自然会想到的路线,而是从不同角度解决问题的好方法。 @ForwardEd - 好吧,我首先从变量名称中删除了_,然后删除了:,然后决定以完全不同的方式进行操作:)

以上是关于在函数中使用 IsNumeric的主要内容,如果未能解决你的问题,请参考以下文章

如何在函数中模拟函数。是不是可以使用两个或多个补丁来模拟函数中的函数调用?

在匿名函数中使用变量,该函数在其他地方定义

在函数中使用变量,还是使用函数本身?

在函数路径中使用较早的函数

使用 React 时,在构造函数中使用粗箭头函数还是绑定函数更可取?

为啥在一个函数中声明的联合类型在另一个函数中使用无效?