Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从sub和excel调用函数时返回的结果不同_Excel_Vba_Excel Formula_Error Handling - Fatal编程技术网

从sub和excel调用函数时返回的结果不同

从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)

我这里有一个简单的函数,它对一系列值进行计算。该范围将始终有5个值。范围也应该是一维的。 为了覆盖超出范围的情况,我尝试添加错误处理,以提示用户函数限制

当我从一个子例程测试一个x值大于1的范围时,我只得到一次预期的错误消息。但是,当我从工作表中尝试相同范围的单元格时,我多次收到错误消息

我不明白为什么我会从工作表和子程序中得到不同的结果

非常感谢您的帮助

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插件项目)有很多功能可以帮助您避免许多陷阱(我们根据常见的堆栈溢出问题实施了许多检查!)看起来是一个有用的工具。我将继续使用它!