2013-08-28 25 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