从VBA中的函数返回数组

Rik*_*Rik 12 vba function return-value

所有,

我想写一个函数来返回一个整数数组,所以我可以索引它们,但我不知道VBA的语法.这是伪代码:

function getStats() as integer
    dim returnVal(4) as integer
    returnVal(0)=c2percent14
    returnVal(1)=c3percent14
    returnVal(2)=c4percent14
    returnVal(3)=c5percent14
    getStats=returnVal
end function

msgbox getStats(3)
Run Code Online (Sandbox Code Playgroud)

这些值都是整数,或者应该是,然后我可以索引我想要的stat的返回数组.谢谢.

-Rik

mof*_*tje 26

将函数作为数组赋予类型:

function getStats() as integer()    
    dim returnVal(4) as integer

    returnVal(0) = c2percent14
    returnVal(1) = c3percent14
    returnVal(2) = c4percent14
    returnVal(3) = c5percent14

    getStats = returnVal

end function

Sub mysub()

   Dim myArray(4) As String

   myArray = getStats()

   msgbox myArray(3)

end sub 
Run Code Online (Sandbox Code Playgroud)

  • 这两个答案在使用中都很稳健吗?或者是一个优先于另一个/他们是否具有不同的属性导致某些用例,其中一个可能是有利的或不利的? (3认同)

tec*_*n23 9

我将在这里添加一个答案,因为我很高兴地说,经过几个小时的挫折和错误信息,我终于知道如何返回数组了!以下是从函数返回数组的方法:

Sub mysub()
    Dim i As Integer, s As String
    Dim myArray() As Integer 'if you declare a size here you will get "Compile error, can't assign to array"
    myArray = getStats()

    s = "Array values returned:" & vbCrLf
    For i = 0 To UBound(myArray)
        s = (s & myArray(i) & " ")
    Next
    MsgBox s
End Sub

Function getStats() As Integer() 'The return type must be EXACTLY the same as the type declared in the calling sub.
    Dim returnVal(2) As Integer 'if you DON'T declare a size here you will get "Run-time error '9': Subscript out of range"

    returnVal(0) = 0
    returnVal(1) = 1
    returnVal(2) = 2
    'returnVal(3) = 3 This will throw an error. Remember that an array declared (2) will hold 3 values, 0-2.
    getStats = returnVal
End Function
Run Code Online (Sandbox Code Playgroud)

输出: 在此输入图像描述

我在这里提出的评论非常重要。虽然 VBA 通常相当宽松,但这个特殊的东西却非常挑剔。这些是您的职能、任务和返回工作所必需的:

  • 调用子函数中声明的数组必须具有未声明的长度。
  • 返回数组的函数必须具有完全相同的类型。即使您将 sub 中的数组声明为 Variant 并且该函数返回一个 Integer 数组也不起作用。
  • 您必须在函数中使用临时数组。您不能像通常在函数中那样为函数名称 (getStats) 赋值;只有将所有值分配给临时数组后,才能将临时数组分配给函数名称。任何将 ReDim getStats 作为数组的尝试也会引发错误。
  • 必须用长度声明临时数组。在 VBA 中,除非声明长度,否则无法在索引处为数组赋值。

  • “你必须在某个时刻声明长度,所以最好在变量声明时声明它,对吗?” - 副作用不同,这可能重要也可能无关紧要。`Dim returnVal(2)` 创建一个无法调整大小的数组。如果您稍后需要在函数中调整它,则不能。`Dim returnVal() : ReDim returnVal(2)` 创建一个可以调整大小的数组。返回数组后并不重要,因为无论如何都可以调整它的大小。 (2认同)

Tim*_*Tim 8

Function getStats() As Variant
Run Code Online (Sandbox Code Playgroud)

getStats现在是一个数组,而不是一个整数

  • 这个解释是不正确的。按照编码,getStats 是一个不带参数并返回一个变体的函数,该变体可以是一个数组,但也可以是一个整数、字符串等。 (11认同)