gpt4 book ai didi

excel - 从sub vs excel调用时,函数返回的值不同

转载 作者:行者123 更新时间:2023-12-03 08:09:03 25 4
gpt4 key购买 nike

我这里有一个简单的函数,可以对一系列值进行计算。该范围将始终具有5个值。范围也应该是一维的。
为了解决超出范围的情况,我尝试添加错误处理,以提示用户功能限制。
当我从子例程测试x值> 1的范围时,仅收到一次预期的错误msg。但是,当我从工作表中尝试相同范围的单元格时,多次出现错误msg。
我不明白为什么我会从工作表和子例程中得到不同的结果。
任何帮助是极大的赞赏。

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
该子程序按预期运行,返回错误msg并退出函数。在Excel中,传递相同范围会提示错误消息msg 32次。
Sub testRange()

RIAJ_SCORE_RANGE (ActiveSheet.Range("E86:F91"))

End Sub

最佳答案

RIAJ_SCORE_RANGE (ActiveSheet.Range("E86:F91"))

删除括号,它们将通过一个隐式默认成员调用( Range,这是一个隐藏的成员,根据其参数化方式“分支”到其他成员”)将 Range.[_Default]强制转换为一个值,最终尝试传递2D Variant数组(也就是说,正是您将使用 ActiveSheet.Range("E86:F91").Value获得的东西)传递给想要与 Range对象一起工作的过程,从而导致类型不匹配错误。
这将传递 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_SCORE_RANGE(ActiveSheet.Range("E86:F91")), vbInformation)作为值表达式毫无意义!

关于excel - 从sub vs excel调用时,函数返回的值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64037136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com