2010-06-10 7 views
3

안녕하세요 저는 Excel에서 VBA를 사용하고 있으며 두 범위의 값을 셀 수식에서 사용자 지정 함수로 전달해야합니다. 이 함수는 다음과 같습니다.셀 내에서 사용자 지정 함수에 범위 전달


Public Function multByElement(range1 As String, range2 As String) As Variant 
    Dim arr1() As Variant, arr2() As Variant 
    arr1 = Range(range1).value 
    arr2 = Range(range2).value 
    If UBound(arr1) = UBound(arr2) Then 
     Dim arrayA() As Variant 
     ReDim arrayA(LBound(arr1) To UBound(arr1)) 
     For i = LBound(arr1) To UBound(arr1) 
      arrayA(i) = arr1(i) * arr2(i) 
     Next i 
     multByElement = arrayA 
    End If 
End Function 

자세히 알 수 있듯이 범위의 문자열 표현을 전달하려고합니다. 디버거에서 제대로 전달 된 및 볼 수있는 첫 번째 눈에 띄는 문제가 arr1 (i) 읽기 시도 할 때 "범위 밖으로 첨자"로 표시됩니다. 나는 또한 범위 자체 (즉 range1 ... Range1)를 통과하려고했지만 성공하지 못했습니다.

가장 좋은 의문은 액티브 시트가 수식 (시트 이름이 문자열의 일부 임)과 다른 시트에서 호출 되었기 때문에 액티브 시트와 관련이 있다는 것이었지만 두 시트를 모두 시도한 이후에 사라졌습니다. 동일한 시트 내에서 및 코드에서 시트를 지정하여.

BTW 셀의 수식은 다음과 같다 :

= AVERAGE (multByElement ("A1 : A3」, 「B1 : B3"))

또는

= AVERAGE (multByElement을 ("내 Sheet1! A1 : A3", "내 Sheet1! B1 : B3"))

에 대해서는 다른 시트에서 호출 할 때 사용합니다.

+2

왜 배열 함수를 사용하지 않는지 궁금합니다. 즉, bar = AVERAGE (A1 : A3 * B1 : B3)에 수식을 입력하고 Ctrl + Shift + Enter를 누르면 A1의 각 요소에 곱하는 배열 함수가 삽입됩니다. A3 by B1 : B3 – Fionnuala

+0

이것은 내가 생각한 좋은 생각이지만 시트의 공간과이 기능을 사용할 수있는 확장 가능성으로 인해 이것을 시도하는 것을 선호했습니다. – Luis

답변

3

먼저 Remou 왼쪽 의견을 참조하십시오. 실제로 여기서해야 할 일이기 때문입니다. 두 개의 배열을 요소 적으로 곱하기 위해서는 VBA가 전혀 필요하지 않습니다.

둘째, 범위를 사용하려면 함수 인수를 Range 유형으로 선언하면됩니다. 따라서 당신은 가질 수 있습니다

Public Function multByElement(range1 As Range, range2 As Range) 

그리고 문자열을 범위 참조로 직접 해석 할 필요가 없습니다. 문자열을 사용하면 워크 시트에서 물건이 옮겨 짐에 따라 Excel에서 참조를 업데이트하지 못합니다.

마지막으로, 함수가 실패하는 이유는 다중 셀 범위의 '값'을 가져 오는 배열이 2 차원이기 때문에 두 요소로 액세스해야하기 때문입니다 지수. 당신이 (요소 현명한) 곱 두 벡터에 의도하는 것처럼 보이는 때문에, 당신은 당신이 당신의 입력에서 기대했던 방향에 따라 하나

 arrayA(i) = arr1(i,1) * arr2(i,1) 

또는

 arrayA(i) = arr1(1,i) * arr2(1,i) 

할 것입니다. VBA를 사용하면 개념적으로 일차원 배열의 방향이 중요하지만 위의 Remou의 조언을 따르는 경우 Excel은 행 또는 열을 전달했는지 또는 범위 참조를 전달했는지 여부에 관계없이 올바른 작업을 수행합니다. 배열 리터럴).

에필로그로 'Option Explicit'을 사용하지 않는 것처럼 보입니다. Google은 왜 당신이 아마 이것을 항상하고 싶은지에 대한 호언 장담을하고 있습니다.

+0

2 차원 어레이에 액세스하는 것으로 고정시켜 주셔서 감사합니다. 내가 말했듯이 나는 범위 자체를 통과 시키려고했지만 스트링 시스템도 작동하고 나는 주위를 움직이는 세포에 대해 걱정할 필요가 없다. – Luis