2011-11-22 60 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