2011-11-22 28 views

回答

1

您可以輸入公式使用您的第一個版本,如果您在Excel 2010中按CTRL + SHIFT + ENTER。這將使其成爲基於數組的公式。舉例來說,這應該很好地工作:

=SUM(A1:A6^2) 

編輯:要使用用戶定義的函數,你必須修改你的函數取一個數組參數。按CTRL + SHIFT + ENTER時,它將所有範圍直接作爲參數處理到函數中,並期望應用所有函數來獲取範圍參數並返回數組結果。下面是一個假設的功能TD(x, y) = x + y,僅僅返回兩個參數的總和的例子:

Function TD(ByVal x As Integer, ByVal y As Integer) As Integer 
    TD = x + y 
End Function 

功能TD如上解釋,我們正在定義的基函數。

Function TDArray(ByVal x As Variant, ByVal y As Variant) As Integer() 
    Dim xc() As Integer 
    Dim yc() As Integer 
    Dim count As Integer 

    If TypeName(x) = "Range" Then 
     xc = GetRangeValues(x) 
     count = UBound(xc) 
    End If 

    If TypeName(y) = "Range" Then 
     yc = GetRangeValues(y) 
     count = UBound(yc) 
    End If 

    Dim i As Integer 
    Dim xVal As Integer 
    Dim yVal As Integer 
    Dim result() As Integer 
    ReDim result(1 To count) 
    For i = 1 To count 
     If TypeName(x) = "Range" Then xVal = xc(i) Else xVal = x 
     If TypeName(y) = "Range" Then yVal = yc(i) Else yVal = y 
     result(i) = TD(xVal, yVal) 
    Next 

    TDArray = result 
End Function 

功能TDArray是鏡像的TD的功能性的功能,而且還能夠採取的陣列作爲參數。它的工作方式是接受Variant參數,然後檢查是否傳遞了Range或整數。如果範圍被傳遞,它將被轉換爲一個數組,並且函數TD被應用於數組中的每個元素。結果然後作爲數組返回到下一個函數,在本例中,該函數將調用SUM

Function GetRangeValues(ByVal r As Range) As Integer() 
    Dim c As Range 
    Dim result() As Integer 
    Dim i As Integer 
    ReDim result(1 To r.Cells.count) 

    i = 1 
    For Each c In r 
     result(i) = c.Value 
     i = i + 1 
    Next 
    GetRangeValues = result 
End Function 

功能GetRangeValues是一個簡單的輔助函數採用一個範圍參數並將其轉換成一個陣列,其是更容易瀏覽,因爲它可以通過索引進行迭代。使用這些函數定義,現在可以將下列函數輸入到單元格中,然後按下CTRL + SHIFT + ENTER,並獲得預期結果(請注意,我們使用數組形式TDArray - 如果將計算應用於對參數,說TD(A4,A5),那麼你用TD;對於任何範圍,則必須使用TDArray):

=SUM(TDArray(X1:X10,y)) 

希望這有助於!

+0

很酷。假設它是用戶定義的函數(不是Excel函數)? –

+0

非常特別,我有一個宏函數TD(x,y),其中x和y是單變量 現在我想要做SUM(TD(x1:x10,y)) –

+0

從我的測試中,它看起來像你必須修改你的函數來獲取'Range'對象,並且如果你想讓它參與一個基於數組的公式,則返回一個數組。我掀起了一個原型,並將在今晚晚些時候將它張貼在這裏,當我獲得更多時間。使用另一列來存儲'TD(x,y)'的結果然後求和結果可能會容易得多。 – mellamokb