2010-08-07 3 views
1

다차원 배열 또는 중첩 배열을 다른 범위를 참조 할 수있는 Excel UDF로 전달하는 방법은 무엇입니까?VBA의 Excel UDF로 다차원 배열 전달

"ARY"로 정의 된 UDF는 VBA에서는하지만 워크 시트 기능에서 Array()가 수행하는 작업을 수행합니다.

이 날 (

= TEST1 (ARY (ARY ("A", "B"), "C"))
또는
= TEST1 (ARY (ARY 같은 시트 수식을 가질 수 있도록 A1, B1), C1) 그러나

, 내가 얻을 오류 2015 워크 시트 함수로 TEST1을 실행할 때. 내가 VBA에서 TEST1을 실행하면 잘 작동 반환 "A". 일반적으로

Public Function TEST1(Params As Variant) As Variant 
    TEST1 = Params(0)(0) 
End Function 

'Returns 1D ARRAY 
Public Function ARY(ParamArray Params() As Variant) 
    ReDim result(0 To UBound(Params)) As Variant 
    Dim nextIndex As Integer 
    Dim p As Variant 

    nextIndex = 0 

    For Each p In Params 
     result(nextIndex) = p 
     nextIndex = nextIndex + 1 
    Next 

    ARY = result 
End Function 

답변

2

, 당신은 이것을 할 수 없습니다. VBA은 중첩 된 배열을 값으로 사용할 수 있지만 Excel은 그렇지 않습니다. 이것은 Excel이 궁극적으로 워크 시트 그리드로 들어갈 수있는 것으로 UDF에서 가져 오는 모든 값을 처리해야하기 때문에 의미가 있습니다.

중급 결과가이 제한 사항을 준수하지 않아도 좋을 것입니다. 위의 예제에서 모든 셀에 들쭉날쭉 한 배열을 넣으려고하지는 않습니다. 당신은 그것을 만들고 그것을 'TEST1'에 전달하기 만하면됩니다. 불행히도 Excel은 그렇게 작동하지 않습니다. 수식의 각 표현식을 합법적 인 Excel 값으로 평가하고 # VALUE! "합법적 가치가 아닙니다"에 대한 포괄적 인 표현입니다. 예를 들어 배열의 크기가 일정한 경우에도 #VALUE! 오류가 발생합니다.

모두 동일한 길이 인 중첩 배열 에서 다음과 같이 전달 될 수 있습니다. UDF의 : 일부리스트 -리스트의 당신이 실제로는 2 차원 배열에 강제하려는 구축 할 때

Public Function thisKindOfNestingWorks() 
    thisKindOfNestingWorks = Array(Array(1, 2), Array(3, 4)) 
End Function 

이 유용 할 수 있습니다.

그래서,이 같은 위 ARY 함수를 호출하는 것은 잘 작동합니다 :

=ARY(ARY(A1, B1), ARY(C1, D1)) 

그러나, 당신의 TEST1 기능, 실패 2 차원 배열 초래

=TEST1(ARY(ARY(A1, B1), ARY(C1, D1))) 

를 호출하기 때문에 1 차원 배열의 1 차원 배열이 아니라 TEST1로 전달됩니다. 그것이 도움이 될에

는 또한이 질문에 내 대답을 찾을 수 있습니다 :

Return a User Defined Data Type in an Excel Cell

훨씬 나중에 편집 :

이 덧붙여, 당신의 'ARY'기능이 많이 단축 될 수 있습니다. 이렇게하면 원래의 질문에 함께 할 수 없다, 그러나 그것은 언급 할 가치 :

Excel Select Case?

:

Public Function arr(ParamArray args()) 
    arr = args 
End Function 

이 대답을 사용하는 예제가있다