【问题标题】:Return array in Spreadsheet Function电子表格函数中的返回数组
【发布时间】:2013-08-31 21:30:03
【问题描述】:

下面的代码返回一个数组。我想在电子表格中使用它作为 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

【问题讨论】:

  • 您需要预先选择单元格并将公式作为数组公式输入(通过按 CTRL+SHIFT+ENTER)。

标签: arrays excel return spreadsheet vba


【解决方案1】:

UDF 当然可以返回一个数组,并且您的函数可以正常工作。只需选择,例如范围 B2:D2,将 =LoadNumbers(1, 3) 放入公式栏中,然后按 Ctrl+Shift+Enter 告诉 Excel 这是一个数组函数。

现在,您不能让 UDF 根据其输入自动调整调用它的范围的大小(至少在没有一些丑陋的Application.OnTime hack 的情况下不会),但你没有无论如何都需要这样做。只需将函数放在 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

【讨论】:

    【解决方案2】:

    工作表公式只能将值输出到写入公式的同一单元格。就目前而言,代码已经生成了一个数组。如果您希望在向下复制公式时显示值,请使用这样的公式(在您想要的任何单元格中),然后向下复制:

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

    如果你复制得太远,你会得到一个#REF!错误,因为 LoadNumbers 用完了数字。

    【讨论】:

    • 如果是二维数组呢?尝试了 $B$1:$B2 但我得到了相同的结果
    • 根据您提供的代码,结果数组始终是一维数组,所以我不确定为什么这是相关的。无论如何,Index 也可以处理二维数组,您只需要包含第三个参数,就像=INDEX(LoadNumbers(1,10),ROWS($A$1:$A1),COLUMNS($A$1:A$1))
    【解决方案3】:
    =INDEX(LoadNumbers(1,10),ROWS($A$1:$A1),COLUMNS($B$1,B$1))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 2015-07-06
      • 2012-02-26
      相关资源
      最近更新 更多