Arrays 电子表格函数中的返回数组

Arrays 电子表格函数中的返回数组,arrays,excel,return,spreadsheet,vba,Arrays,Excel,Return,Spreadsheet,Vba,下面的代码返回一个数组。我想在电子表格中使用它作为excel公式来返回数组。但是,当我这样做时,它只向单元格返回第一个值。是否仍要返回与数组大小相同的数组 Function LoadNumbers(Low As Long, High As Long) As Long() ''''''''''''''''''''''''''''''''''''''' ' Returns an array of Longs, containing ' the numbers from Low to High. Th

下面的代码返回一个数组。我想在电子表格中使用它作为excel公式来返回数组。但是,当我这样做时,它只向单元格返回第一个值。是否仍要返回与数组大小相同的数组

Function LoadNumbers(Low As Long, High As Long) As Long()
'''''''''''''''''''''''''''''''''''''''
' Returns an array of Longs, containing
' the numbers from Low to High. The
' number of elements in the returned
' array will vary depending on the
' values of Low and High.
''''''''''''''''''''''''''''''''''''''''

'''''''''''''''''''''''''''''''''''''''''
' Declare ResultArray as a dynamic array
' to be resized based on the values of
' Low and High.
'''''''''''''''''''''''''''''''''''''''''
Dim ResultArray() As Long
Dim Ndx As Long
Dim Val As Long
'''''''''''''''''''''''''''''''''''''''''
' Ensure Low <= High
'''''''''''''''''''''''''''''''''''''''''
If Low > High Then
    Exit Function
End If
'''''''''''''''''''''''''''''''''''''''''
' Resize the array
'''''''''''''''''''''''''''''''''''''''''
ReDim ResultArray(1 To (High - Low + 1))
''''''''''''''''''''''''''''''''''''''''
' Fill the array with values.
''''''''''''''''''''''''''''''''''''''''
Val = Low
For Ndx = LBound(ResultArray) To UBound(ResultArray)
    ResultArray(Ndx) = Val
    Val = Val + 1
Next Ndx
''''''''''''''''''''''''''''''''''''''''
' Return the array.
''''''''''''''''''''''''''''''''''''''''
LoadNumbers = ResultArray()

End Function

工作表公式只能向写入公式的同一单元格输出值。目前,代码已经生成了一个数组。如果要在向下复制公式时显示值,请在所需的任何单元格中使用类似的公式,然后向下复制:

=INDEX(LoadNumbers(1,10),ROWS($A$1:$A1))

如果你抄得太远,你会得到一个裁判!错误,因为LoadNumbers没有数字。

工作表公式只能向写入公式的同一单元格输出值。目前,代码已经生成了一个数组。如果要在向下复制公式时显示值,请在所需的任何单元格中使用类似的公式,然后向下复制:

=INDEX(LoadNumbers(1,10),ROWS($A$1:$A1))
=INDEX(LoadNumbers(1,10),ROWS($A$1:$A1),COLUMNS($B$1,B$1))

如果你抄得太远,你会得到一个裁判!错误,因为LoadNumbers没有数字。

UDF肯定会返回一个数组,并且您的函数工作正常。只需选择范围B2:D2,将=LoadNumbers1、3放入公式栏,然后按Ctrl+Shift+Enter告诉Excel这是一个数组函数

=INDEX(LoadNumbers(1,10),ROWS($A$1:$A1),COLUMNS($B$1,B$1))
现在,您不能让UDF根据其输入自动调整其调用范围的大小,至少在没有一些丑陋的Application.OnTime黑客的情况下是这样,但您无论如何都不需要这样做。首先将函数放在1000个单元格范围内,让UDF用空白单元格填充未使用的空间,如下所示:

Function LoadNumbers(ByVal Low As Long, ByVal High As Long) As Variant()
    Dim ResultArray() As Variant
    Dim Ndx As Long
    Dim Val As Long
    Dim SourceCols As Long

    SourceCols = Application.Caller.Columns.Count

    If Low > High Then
        Exit Function
    End If
    If High - Low + 1 > SourceCols Then High = Low + SourceCols - 1

    ReDim ResultArray(1 To SourceCols)

    Val = Low
    For Ndx = LBound(ResultArray) To (High - Low + 1)
        ResultArray(Ndx) = Val
        Val = Val + 1
    Next Ndx
    For Ndx = (High - Low + 2) To UBound(ResultArray)
        ResultArray(Ndx) = vbNullString
    Next Ndx
    LoadNumbers = ResultArray()
End Function

一个UDF当然可以返回一个数组,并且您的函数运行良好。只需选择范围B2:D2,将=LoadNumbers1、3放入公式栏,然后按Ctrl+Shift+Enter告诉Excel这是一个数组函数

现在,您不能让UDF根据其输入自动调整其调用范围的大小,至少在没有一些丑陋的Application.OnTime黑客的情况下是这样,但您无论如何都不需要这样做。首先将函数放在1000个单元格范围内,让UDF用空白单元格填充未使用的空间,如下所示:

Function LoadNumbers(ByVal Low As Long, ByVal High As Long) As Variant()
    Dim ResultArray() As Variant
    Dim Ndx As Long
    Dim Val As Long
    Dim SourceCols As Long

    SourceCols = Application.Caller.Columns.Count

    If Low > High Then
        Exit Function
    End If
    If High - Low + 1 > SourceCols Then High = Low + SourceCols - 1

    ReDim ResultArray(1 To SourceCols)

    Val = Low
    For Ndx = LBound(ResultArray) To (High - Low + 1)
        ResultArray(Ndx) = Val
        Val = Val + 1
    Next Ndx
    For Ndx = (High - Low + 2) To UBound(ResultArray)
        ResultArray(Ndx) = vbNullString
    Next Ndx
    LoadNumbers = ResultArray()
End Function

您需要预选单元格,并通过按CTRL+SHIFT+enter键将公式作为数组公式输入。您需要预选单元格,并通过按CTRL+SHIFT+enter键将公式作为数组公式输入。如果是二维数组呢?尝试了$B$1:$B2,但我得到了相同的结果基于您提供的代码,结果数组始终是一维数组,因此我不确定这是否相关。不管怎样,索引也可以处理二维数组,您只需要包含第三个参数,如so=INDEXLoadNumbers1,10,ROWS$a$1:$A1,COLUMNS$a$1:a$1如果它是二维数组呢?尝试了$B$1:$B2,但我得到了相同的结果基于您提供的代码,结果数组始终是一维数组,因此我不确定这是否相关。无论如何,索引也可以处理二维数组,您只需要包含第三个参数,如so=INDEXLoadNumbers1,10,ROWS$a$1:$A1,COLUMNS$a$1:a$1