2013-08-28 22 views
1

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

您需要预选的细胞,然后输入公式作为数组公式(按CTRL + SHIFT + ENTER)。 – assylias

回答

1

工作表公式只能输出一个值到式写在相同的小区。既然这样,代码已经产生的阵列。如果你想为你公式复制到显示的值,用这样一个公式(在你想要的任何单元格),然后复制下来:

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

如果复制跌过头,你会得到一个#REF!错误,因为LoadNumbers耗尽了数字。

+0

如果是2维数组,那么该怎么办?尝试$ B $ 1:$ B2但我得到了相同的结果 – cdelsola

+2

根据您提供的代码,结果数组始终是一维数组,所以我不确定为什么这是相关的。无论如何,Index也可以处理二维数组,你只需要包含第三个参数,就像'= INDEX(LoadNumbers(1,10),ROWS($ A $ 1:$ A1),COLUMNS($ A $ 1) :A $ 1))' – tigeravatar

+0

是啊明白了。非常感谢@tigeravatar – cdelsola

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

UDF肯定可以返回一个数组,并且你的函数可以正常工作。只需选择,例如范围B2:D2,将=LoadNumbers(1, 3)放入公式栏中,然后按Ctrl + Shift + Enter将Excel数组函数告诉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