在函数中使用 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的主要内容,如果未能解决你的问题,请参考以下文章
如何在函数中模拟函数。是不是可以使用两个或多个补丁来模拟函数中的函数调用?