2014-01-16 70 views
0

我很关心返回数组的函数组成。数组函数的组合

例如,让我们定义

Function APTranspose(X As Variant) As Variant 

Dim v() As Variant 
Dim r, c, rc, cc As Integer 

r = X.rows.count 
c = X.Columns.count 

ReDim v(1 To c, 1 To r) 

For cc = 1 To c 
    For rc = 1 To r 
    v(cc, rc) = X(rc, cc) 
    Next 
Next 

APTranspose = v 

End Function 

和无用的功能

Function Identity(X As Variant) As Variant 

Dim res As Variant 

res = APTranspose(X) 

res = APTranspose(res) 

Identity = res 

End Function 

现在很明显,功能(X)应该是X本身。

但是我得到#VALUE!在Excel上。一般来说,我不能编写数组函数。这是为什么??

谢谢!

+0

在调用此函数在Excel? –

回答

0

该问题的原因是,当你调用排队res = APTranspose(X)APTranspose它工作正常,因为XRange类型的对象,它有一个像X.rows.countX.Columns.count性能。但是当你在res = APTranspose(res) - res中调用该函数时,它不是Range对象,它是一个数组,它没有属性X.rows.countX.Columns.count。这会触发一个错误。

您可以使用下面的代码:

Function APTranspose(X As Variant) As Variant 
    APTranspose = WorksheetFunction.Transpose(X) 
End Function 

Function Identity(X As Variant) As Variant 
    Dim res As Variant 
    res = APTranspose(X) 
    res = APTranspose(res) 
    Identity = res 
End Function 

UPD:

,或者您可以使用以下功能:

Function APTranspose(X As Variant) As Variant 
    Dim v() As Variant 
    Dim r, c, rc, cc As Integer 

    If TypeOf X Is Range Then 
     r = X.Rows.Count 
     c = X.Columns.Count 
    Else 
     r = UBound(X, 1) 
     c = UBound(X, 2) 
    End If 
    ReDim v(1 To c, 1 To r) 
    For cc = 1 To c 
     For rc = 1 To r 
     v(cc, rc) = X(rc, cc) 
     Next 
    Next 
    APTranspose = v 
End Function 

Function Identity(X As Range) As Variant 

    Dim res() As Variant 

    res = APTranspose(X) 
    res = APTranspose(res) 
    Identity = res 
End Function 
+0

那么如何检索数组的行数/列数呢? – user3202334

+0

看到我更新的unswer –

+0

谢谢,但这个APTranspose不会工作 – user3202334