如何将变量从函数传递给子函数?

时间:2019-06-20 21:25:47

标签: excel vba function

我想使用一个函数来选择一个介于1到31之间的随机数,并根据选择指定一个“框”值。结果1-16是第1栏,17-24是第2栏,依此类推。

在Sub中,我想检测数据中是否存在选定的框。这是重要的部分:如果数据中不存在所选的框,请选择其他框。

要选择其他框,我想引用该函数,而不必使用“ goto”进行循环,因为循环很快就会变得非常混乱。

类似的问题似乎是与我不同的用例。我尝试生成的值不是由Sub中定义的变量决定的,这是函数的常见用法。

这是在Windows 10,Excel 365上。由于没有足够的功能,我使用了循环(GoTo ...#)。

Sub cmdClickityClack
SelectABox
MsgBox (SelectABox(Box)) 'I know, this is completely wrong
End Sub

Function SelectABox(Box As Long)
Dim BoxFind As Long
BoxFind = RndBetween(1, 31)

Select Case BoxFind
    Case 0 To 16
    Box = "1"

    Case 17 To 24
    Box = "2"

    Case 25 To 28
    Box = "3"

    Case 29 To 30
    Box = "4"

    Case 31
    Box = "5"
End Select
End Function

理想情况下,我只在子内部使用变量Box(由函数定义)。在调用该函数后,子程序将知道Box的值。

1 个答案:

答案 0 :(得分:3)

您无需调用该函数然后对其进行处理,您只需调用该函数并将其视为要在此时使用的变量即可。

Sub cmdClickityClack()
    MsgBox SelectABox
End Sub

或者您可以声明一个变量并存储输出,然后使用该变量:

Sub cmdClickityClack()
    Dim str as String
    str = SelectABox

    MsgBox str 
End Sub

您没有使用Box,因此无需通过它。并使用函数名称返回该值。

Function SelectABox()
    Dim BoxFind As Long
    BoxFind = Application.RandBetween(1, 31)

    Select Case BoxFind
        Case 0 To 16
        SelectABox = "1"

        Case 17 To 24
        SelectABox = "2"

        Case 25 To 28
        SelectABox = "3"

        Case 29 To 30
        SelectABox = "4"

        Case 31
        SelectABox = "5"
    End Select
End Function

如果要传递要在函数中使用的变量:

Sub cmdClickityClack()
    Dim BoxFind As Long
    BoxFind = Application.RandBetween(1, 31)

    MsgBox SelectABox(BoxFind)
End Sub

Function SelectABox(box As Long)

    Select Case box
        Case 0 To 16
        SelectABox = "1"

        Case 17 To 24
        SelectABox = "2"

        Case 25 To 28
        SelectABox = "3"

        Case 29 To 30
        SelectABox = "4"

        Case 31
        SelectABox = "5"
    End Select
End Function

但是将变量传递给要在函数中使用的函数,并使用函数名称本身返回值。