从sub和excel调用函数时返回的结果不同
我这里有一个简单的函数,它对一系列值进行计算。该范围将始终有5个值。范围也应该是一维的。 为了覆盖超出范围的情况,我尝试添加错误处理,以提示用户函数限制 当我从一个子例程测试一个x值大于1的范围时,我只得到一次预期的错误消息。但是,当我从工作表中尝试相同范围的单元格时,我多次收到错误消息 我不明白为什么我会从工作表和子程序中得到不同的结果 非常感谢您的帮助从sub和excel调用函数时返回的结果不同,excel,vba,excel-formula,error-handling,Excel,Vba,Excel Formula,Error Handling,我这里有一个简单的函数,它对一系列值进行计算。该范围将始终有5个值。范围也应该是一维的。 为了覆盖超出范围的情况,我尝试添加错误处理,以提示用户函数限制 当我从一个子例程测试一个x值大于1的范围时,我只得到一次预期的错误消息。但是,当我从工作表中尝试相同范围的单元格时,我多次收到错误消息 我不明白为什么我会从工作表和子程序中得到不同的结果 非常感谢您的帮助 Public Function RIAJ_SCORE_RANGE(Range_FROM_million_TO_gold As Range)
Public Function RIAJ_SCORE_RANGE(Range_FROM_million_TO_gold As Range) As Double
On Error GoTo eh
Dim millionTOgold As Variant
millionTOgold = Range_FROM_million_TO_gold.Value
Dim i As Long
Dim x As Integer
x = 1
If x <> 1 Then GoTo er1
For i = LBound(millionTOgold) To UBound(millionTOgold)
If i = 1 Then
RIAJ_SCORE_RANGE = millionTOgold(i, 1) * 10
ElseIf i = 2 Then RIAJ_SCORE_RANGE = RIAJ_SCORE_RANGE + millionTOgold(i, x) * 7.5
ElseIf i = 3 Then RIAJ_SCORE_RANGE = RIAJ_SCORE_RANGE + millionTOgold(i, x) * 5
ElseIf i = 4 Then RIAJ_SCORE_RANGE = RIAJ_SCORE_RANGE + millionTOgold(i, x) * 2.5
ElseIf i = 5 Then RIAJ_SCORE_RANGE = RIAJ_SCORE_RANGE + millionTOgold(i, x)
Else: GoTo eh
End If
Next i
er1:
x = 1
MsgBox ("Function requires range from a single column")
GoTo eh
eh:
Exit Function
End Function
去掉括号,它们可以通过隐式默认成员调用(Range.[u default]
,一个隐藏成员,根据参数化的方式“分支”到其他成员)将您的范围
强制为一个值,最终尝试传递2D变量
数组(即使用ActiveSheet.Range(“E86:F91”).Value
得到的确切结果)转换为希望使用Range
对象的过程,因此会出现类型不匹配错误
这将传递范围
对象,而不让其强制进入数组:
RIAJ_SCORE_RANGE ActiveSheet.Range("E86:F91")
也就是说,调用函数而不捕获其返回值是(应该)无用的,因为函数(特别是打算从工作表单元格运行的函数)不应该有任何副作用:它接受输入,根据这些输入计算结果,然后输出结果。看起来这正是您在这里看到的,所以..干得好
捕获函数的返回值时确实需要括号:
MsgBox RIAJ_SCORE_RANGE(ActiveSheet.Range("E86:F91"))
请注意函数名和(
字符:这是VBE告诉您(…)
括号正在分隔参数列表。当存在空格时(VBE将强制使用该空格,您无法抵抗),让括号强制参数列表中的第一个参数-MsgBox
也是一个函数,我们不在这里捕获它的返回值,因此不需要括号
为此,我们必须添加括号:
Debug.Print MsgBox(RIAJ_SCORE_RANGE(ActiveSheet.Range("E86:F91")), vbInformation)
这是非法的:
MsgBox (RIAJ_SCORE_RANGE(ActiveSheet.Range("E86:F91")), vbInformation)
…因为(RIAJ\u SCORE\u RANGE(ActiveSheet.RANGE(“E86:F91”)),vbInformation)
作为值表达式毫无意义
去掉括号,它们可以通过隐式默认成员调用(Range.[u default]
,一个隐藏成员,根据参数化的方式“分支”到其他成员)将您的范围
强制为一个值,最终尝试传递2D变量
数组(即使用ActiveSheet.Range(“E86:F91”).Value
得到的确切结果)转换为希望使用Range
对象的过程,因此会出现类型不匹配错误
这将传递范围
对象,而不让其强制进入数组:
RIAJ_SCORE_RANGE ActiveSheet.Range("E86:F91")
也就是说,调用函数而不捕获其返回值是(应该)无用的,因为函数(特别是打算从工作表单元格运行的函数)不应该有任何副作用:它接受输入,根据这些输入计算结果,然后输出结果。看起来这正是您在这里看到的,所以..干得好
捕获函数的返回值时确实需要括号:
MsgBox RIAJ_SCORE_RANGE(ActiveSheet.Range("E86:F91"))
请注意函数名和(
字符:这是VBE告诉您(…)
括号正在分隔参数列表。当存在空格时(VBE将强制使用该空格,您无法抵抗),让括号强制参数列表中的第一个参数-MsgBox
也是一个函数,我们不在这里捕获它的返回值,因此不需要括号
为此,我们必须添加括号:
Debug.Print MsgBox(RIAJ_SCORE_RANGE(ActiveSheet.Range("E86:F91")), vbInformation)
这是非法的:
MsgBox (RIAJ_SCORE_RANGE(ActiveSheet.Range("E86:F91")), vbInformation)
…因为
(RIAJ\u SCORE\u RANGE(ActiveSheet.RANGE(“E86:F91”)),vbInformation)
作为一种价值表达毫无意义!我知道我不应该说谢谢,但这种深思熟虑的解释非常有用。非常感谢!@rastawolf我的荣幸!请注意(我管理的免费开源VBIDE插件项目)有很多功能可以帮助您避免许多陷阱(我们根据常见的堆栈溢出问题实施了许多检查!)看起来是一个有用的工具。我将继续使用它!我知道我不应该说谢谢,但这个深思熟虑的解释非常有用。非常感谢!@rastawolf,我很高兴!注意(我管理的一个免费开源VBIDE插件项目)有很多功能可以帮助您避免许多陷阱(我们根据常见的堆栈溢出问题实施了许多检查!)看起来是一个有用的工具。我将继续使用它!